Model Context

class ixion::model_context : public ixion::iface::formula_model_access

This class stores all data relevant to current session. You can think of this like a document model for each formula calculation run. Note that only those methods called from the formula interpreter are specified in the interface; this explains why accessors for the most part only have the ‘get’ method not paired with its ‘set’ counterpart.

Public Functions

model_context()
~model_context() override
const config &get_config() const override
dirty_cell_tracker &get_cell_tracker() override
const dirty_cell_tracker &get_cell_tracker() const override
bool is_empty(const abs_address_t &addr) const override
celltype_t get_celltype(const abs_address_t &addr) const override
double get_numeric_value(const abs_address_t &addr) const override

Get a numeric representation of the cell value at specified position. If the cell at the specified position is a formula cell and its result has not yet been computed, it will block until the result becomes available. Call this only during formula (re-)calculation.

Return

numeric representation of the cell value.

Parameters
  • addr: position of the cell.

bool get_boolean_value(const abs_address_t &addr) const override
string_id_t get_string_identifier(const abs_address_t &addr) const override
string_id_t get_string_identifier(const char *p, size_t n) const override
const formula_cell *get_formula_cell(const abs_address_t &addr) const override
formula_cell *get_formula_cell(const abs_address_t &addr) override
const formula_tokens_t *get_named_expression(sheet_t sheet, const std::string &name) const override

Get a named expression token set associated with specified name if present. It first searches the local sheet scope for the name, then if it’s not present, it searches the global scope.

Return

const pointer to the token set if exists, nullptr otherwise.

Parameters
  • sheet: index of the sheet scope to search in.

  • name: name of the expression.

double count_range(const abs_range_t &range, const values_t &values_type) const override
matrix get_range_value(const abs_range_t &range) const override

Obtain range value in matrix form. Multi-sheet ranges are not supported. If the specified range consists of multiple sheets, it throws an exception.

Return

range value represented as matrix.

Parameters
  • range: absolute, single-sheet range address. Multi-sheet ranges are not allowed.

std::unique_ptr<iface::session_handler> create_session_handler() override

Session handler instance receives various events from the formula interpretation run, in order to respond to those events. This is optional; the model context implementation is not required to provide a handler.

Return

a new session handler instance. It may be nullptr.

iface::table_handler *get_table_handler() override

Table interface provides access to all table ranges stored in the document model. A table is a 2-dimensional range of cells that include named columns. It is used when resolving a table reference that refers to a cell or a range of cells by the table name and/or column name.

Return

non-NULL pointer to the table storage inside the model, or NULL if no table is present or supported by the model implementation.

const iface::table_handler *get_table_handler() const override
string_id_t append_string(const char *p, size_t n) override
string_id_t add_string(const char *p, size_t n) override
const std::string *get_string(string_id_t identifier) const override
sheet_t get_sheet_index(const char *p, size_t n) const override

Get the index of sheet from sheet name.

Return

sheet index

Parameters
  • p: pointer to the first character of the sheet name string.

  • n: length of the sheet name string.

std::string get_sheet_name(sheet_t sheet) const override
rc_size_t get_sheet_size(sheet_t sheet) const override

Get the size of specified sheet.

Return

size of the sheet.

Parameters
  • sheet: sheet index.

size_t get_sheet_count() const override

Return the number of sheets.

Return

number of sheets.

void set_config(const config &cfg)
double get_numeric_value_nowait(const abs_address_t &addr) const
string_id_t get_string_identifier_nowait(const abs_address_t &addr) const
void erase_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 &adr, bool val)
void set_string_cell(const abs_address_t &addr, const char *p, size_t n)
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)

Duplicate the value of the source cell to one or more cells located immediately below it.

Parameters
  • src: position of the source cell to copy the value from.

  • n_dst: number of cells below to copy the value to. It must be at least one.

void set_formula_cell(const abs_address_t &addr, formula_tokens_t tokens)

Set a formula cell at a specified address.

Parameters
  • addr: address at which to set a formula cell.

  • tokens: formula tokens to put into the formula cell.

void set_formula_cell(const abs_address_t &addr, const formula_tokens_store_ptr_t &tokens)

Set a formula cell at a specified address. This variant takes a formula tokens store that can be shared between multiple formula cell instances.

Parameters
  • addr: address at which to set a formula cell.

  • tokens: formula tokens to put into the formula cell.

void set_grouped_formula_cells(const abs_range_t &group_range, formula_tokens_t tokens)
abs_range_t get_data_range(sheet_t sheet) const
void set_named_expression(const char *p, size_t n, std::unique_ptr<formula_tokens_t> &&expr)
void set_named_expression(sheet_t sheet, const char *p, size_t n, std::unique_ptr<formula_tokens_t> &&expr)
sheet_t append_sheet(const char *p, size_t n, row_t row_size, col_t col_size)

Append a new sheet to the model. The caller must ensure that the name of the new sheet is unique within the model context. When the name being used for the new sheet already exists, it throws a {} exception. p pointer to the char array storing the name of the inserted sheet. n size of the sheet name char array. row_size number of rows in the inserted sheet. col_size number of columns in the inserted sheet. sheet index of the inserted sheet.

sheet_t append_sheet(std::string name, row_t row_size, col_t col_size)

Append a new sheet to the model. The caller must ensure that the name of the new sheet is unique within the model context. When the name being used for the new sheet already exists, it throws a {} exception. name name of the sheet to be inserted. row_size number of rows in the inserted sheet. col_size number of columns in the inserted sheet. sheet index of the inserted sheet.

void set_cell_values(sheet_t sheet, std::initializer_list<input_row> rows)

A convenient way to mass-insert a range of cell values. You can use a nested initializet list representing a range of cell values. The outer list represents rows.

Parameters
  • sheet: sheet index.

  • rows: nested list of cell values. The outer list represents rows.

void set_session_handler_factory(session_handler_factory *factory)
void set_table_handler(iface::table_handler *handler)
size_t get_string_count() const
void dump_strings() const
const column_store_t *get_column(sheet_t sheet, col_t col) const

Get column storage.

Return

const pointer to column storage, or NULL in case sheet index or column index is out of bound.

Parameters
  • sheet: sheet index.

  • col: column index.

const column_stores_t *get_columns(sheet_t sheet) const

Get an array of column stores for the entire sheet.

Return

const pointer to an array of column stores, or nullptr in case the sheet index is out of bound.

Parameters
  • sheet: sheet index.

model_iterator get_model_iterator(sheet_t sheet, rc_direction_t dir, const abs_rc_range_t &range) const

Get an immutable iterator that lets you iterate cell values in one sheet one at a time. The caller has to ensure that the model content does not change for the duration of the iteration.

Return

model iterator instance.

Parameters
  • sheet: sheet index.

  • dir: direction of the iteration. Currently, only horizontal direction is supported.

  • range: range on the specified sheet to iterate over.

abs_address_set_t get_all_formula_cells() const

bool empty() const
struct input_cell

Cell value only to be used to input a collection of cells to sheet. Formula cells are not supported.

Public Functions

input_cell(nullptr_t)

Initializes the cell to be empty.

input_cell(bool b)

Boolean cell value.

input_cell(const char *s)

The char array must be null-terminated.

input_cell(double v)

Numeric cell value.

input_cell(const input_cell &other)

Public Members

celltype_t type
bool boolean
double numeric
const char *string
union ixion::model_context::input_cell::[anonymous] value
class input_row

Public Functions

input_row(std::initializer_list<input_cell> cells)
const std::initializer_list<input_cell> &cells() const
class session_handler_factory

Public Functions

std::unique_ptr<iface::session_handler> create()
~session_handler_factory()