diff options
Diffstat (limited to '')
-rw-r--r-- | include/ixion/dirty_cell_tracker.hpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/include/ixion/dirty_cell_tracker.hpp b/include/ixion/dirty_cell_tracker.hpp new file mode 100644 index 0000000..b701044 --- /dev/null +++ b/include/ixion/dirty_cell_tracker.hpp @@ -0,0 +1,97 @@ +/* -*- 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_IXION_DIRTY_CELL_TRACKER_HPP +#define INCLUDED_IXION_DIRTY_CELL_TRACKER_HPP + +#include "address.hpp" + +#include <memory> + +namespace ixion { + +/** + * This class is designed to track in-direct dependencies of dirty formula + * cells. A "dirty" formula cell is a formula cell whose result needs to be + * re-calculated because at least one of its references have their values + * updated. + * + * This class also takes volatile functions into account when determining + * the status of the formula cel result. A volatile function is a cell + * function whose value needs to get re-calculated unconditionally on every + * re-calculation. One example of a volatile function is NOW(), which + * returns the current time at the time of calculation. + */ +class IXION_DLLPUBLIC dirty_cell_tracker +{ + struct impl; + std::unique_ptr<impl> mp_impl; + +public: + dirty_cell_tracker(const dirty_cell_tracker&) = delete; + dirty_cell_tracker& operator= (const dirty_cell_tracker&) = delete; + + dirty_cell_tracker(); + ~dirty_cell_tracker(); + + /** + * Add a tracking relationship from a source cell or cell range to a + * destination cell or cell range. + * + * @param src source cell or cell range that includes reference to + * (therefore listens to) the range. + * @param dest destination cell or range referenced tracked by the source + * cell. + */ + void add(const abs_range_t& src, const abs_range_t& dest); + + /** + * Remove an existing tracking relationship from a source cell or cell + * range to a destination cell or cell range. If no such relationship + * exists, it does nothing. + * + * @param src cell or cell range that includes reference to the range. + * @param dest cell or range referenced by the cell. + */ + void remove(const abs_range_t& src, const abs_range_t& dest); + + /** + * Register a formula cell located at the specified position as volatile. + * Note that the caller should ensure that the cell at the specified + * position is indeed a formula cell. + * + * @param pos position of the cell to register as a volatile cell. + */ + void add_volatile(const abs_range_t& pos); + + /** + * Remove the specified cell position from the internal set of registered + * volatile formula cells. + * + * @param pos position of the cell to unregister as a volatile cell. + */ + void remove_volatile(const abs_range_t& pos); + + abs_range_set_t query_dirty_cells(const abs_range_t& modified_cell) const; + + abs_range_set_t query_dirty_cells(const abs_range_set_t& modified_cells) const; + + std::vector<abs_range_t> query_and_sort_dirty_cells(const abs_range_t& modified_cell) const; + + std::vector<abs_range_t> query_and_sort_dirty_cells( + const abs_range_set_t& modified_cells, const abs_range_set_t* dirty_formula_cells = nullptr) const; + + std::string to_string() const; + + bool empty() const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |