diff options
Diffstat (limited to 'src/libixion/model_context_impl.hpp')
-rw-r--r-- | src/libixion/model_context_impl.hpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/libixion/model_context_impl.hpp b/src/libixion/model_context_impl.hpp new file mode 100644 index 0000000..57b73d8 --- /dev/null +++ b/src/libixion/model_context_impl.hpp @@ -0,0 +1,206 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_MODEL_CONTEXT_IMPL_HPP +#define INCLUDED_MODEL_CONTEXT_IMPL_HPP + +#include "ixion/model_context.hpp" +#include "ixion/types.hpp" +#include "ixion/config.hpp" +#include "ixion/dirty_cell_tracker.hpp" + +#include "workbook.hpp" +#include "column_store_type.hpp" + +#include <vector> +#include <string> +#include <unordered_map> +#include <mutex> +#include <deque> + +namespace ixion { namespace detail { + +class safe_string_pool +{ + using string_pool_type = std::deque<std::string>; + using string_map_type = std::unordered_map<std::string_view, string_id_t>; + + std::mutex m_mtx; + string_pool_type m_strings; + string_map_type m_string_map; + std::string m_empty_string; + + string_id_t append_string_unsafe(std::string_view s); + +public: + string_id_t append_string(std::string_view s); + string_id_t add_string(std::string_view s); + const std::string* get_string(string_id_t identifier) const; + + size_t size() const; + void dump_strings() const; + string_id_t get_identifier_from_string(std::string_view s) const; +}; + +class model_context_impl +{ + typedef std::vector<std::string> strings_type; + +public: + model_context_impl() = delete; + model_context_impl(const model_context_impl&) = delete; + model_context_impl& operator= (model_context_impl) = delete; + + model_context_impl(model_context& parent, const rc_size_t& sheet_size); + ~model_context_impl(); + + formula_result_wait_policy_t get_formula_result_wait_policy() const + { + return m_formula_res_wait_policy; + } + + void notify(formula_event_t event); + + const config& get_config() const + { + return m_config; + } + + void set_config(const config& cfg) + { + m_config = cfg; + } + + void set_sheet_size(const rc_size_t& sheet_size); + + dirty_cell_tracker& get_cell_tracker() + { + return m_tracker; + } + + const dirty_cell_tracker& get_cell_tracker() const + { + return m_tracker; + } + + std::unique_ptr<iface::session_handler> create_session_handler(); + + void set_session_handler_factory(model_context::session_handler_factory* factory) + { + mp_session_factory = factory; + } + + iface::table_handler* get_table_handler() + { + return mp_table_handler; + } + + const iface::table_handler* get_table_handler() const + { + return mp_table_handler; + } + + void set_table_handler(iface::table_handler* handler) + { + mp_table_handler = handler; + } + + void empty_cell(const abs_address_t& addr); + void set_numeric_cell(const abs_address_t& addr, double val); + void set_boolean_cell(const abs_address_t& addr, bool val); + void set_string_cell(const abs_address_t& addr, std::string_view s); + void set_string_cell(const abs_address_t& addr, string_id_t identifier); + void fill_down_cells(const abs_address_t& src, size_t n_dst); + formula_cell* set_formula_cell(const abs_address_t& addr, const formula_tokens_store_ptr_t& tokens); + formula_cell* set_formula_cell(const abs_address_t& addr, const formula_tokens_store_ptr_t& tokens, formula_result result); + void set_grouped_formula_cells(const abs_range_t& group_range, formula_tokens_t tokens); + void set_grouped_formula_cells(const abs_range_t& group_range, formula_tokens_t tokens, formula_result result); + + abs_range_t get_data_range(sheet_t sheet) const; + + bool is_empty(const abs_address_t& addr) const; + bool is_empty(abs_range_t range) const; + celltype_t get_celltype(const abs_address_t& addr) const; + cell_value_t get_cell_value_type(const abs_address_t& addr) const; + double get_numeric_value(const abs_address_t& addr) const; + bool get_boolean_value(const abs_address_t& addr) const; + string_id_t get_string_identifier(const abs_address_t& addr) const; + std::string_view get_string_value(const abs_address_t& addr) const; + string_id_t get_identifier_from_string(std::string_view s) const; + const formula_cell* get_formula_cell(const abs_address_t& addr) const; + formula_cell* get_formula_cell(const abs_address_t& addr); + + formula_result get_formula_result(const abs_address_t& addr) const; + + void set_named_expression(std::string name, const abs_address_t& origin, formula_tokens_t&& expr); + void set_named_expression(sheet_t sheet, std::string name, const abs_address_t& origin, formula_tokens_t&& expr); + + const named_expression_t* get_named_expression(std::string_view name) const; + const named_expression_t* get_named_expression(sheet_t sheet, std::string_view name) const; + + sheet_t get_sheet_index(std::string_view name) const; + std::string get_sheet_name(sheet_t sheet) const; + void set_sheet_name(sheet_t sheet, std::string name); + rc_size_t get_sheet_size() const; + size_t get_sheet_count() const; + sheet_t append_sheet(std::string&& name); + + void set_cell_values(sheet_t sheet, std::initializer_list<model_context::input_row>&& rows); + + string_id_t append_string(std::string_view s); + string_id_t add_string(std::string_view s); + const std::string* get_string(string_id_t identifier) const; + size_t get_string_count() const; + void dump_strings() const; + + const column_store_t* get_column(sheet_t sheet, col_t col) const; + const column_stores_t* get_columns(sheet_t sheet) const; + + double count_range(abs_range_t range, values_t values_type) const; + + void walk(sheet_t sheet, const abs_rc_range_t& range, column_block_callback_t cb) const; + + bool empty() const; + + const worksheet* fetch_sheet(sheet_t sheet_index) const; + + column_store_t::const_position_type get_cell_position(const abs_address_t& addr) const; + + const detail::named_expressions_t& get_named_expressions() const; + const detail::named_expressions_t& get_named_expressions(sheet_t sheet) const; + + model_iterator get_model_iterator( + sheet_t sheet, rc_direction_t dir, const abs_rc_range_t& range) const; + +private: + abs_range_t shrink_to_workbook(abs_range_t range) const; + +private: + model_context& m_parent; + + rc_size_t m_sheet_size; + workbook m_sheets; + + config m_config; + dirty_cell_tracker m_tracker; + iface::table_handler* mp_table_handler; + detail::named_expressions_t m_named_expressions; + + model_context::session_handler_factory* mp_session_factory; + + strings_type m_sheet_names; ///< index to sheet name map. + + safe_string_pool m_str_pool; + + formula_result_wait_policy_t m_formula_res_wait_policy; +}; + +}} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |