-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathformula.h
42 lines (33 loc) · 2.6 KB
/
formula.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#pragma once
#include "common.h"
#include <memory>
#include <vector>
// Формула, позволяющая вычислять и обновлять арифметическое выражение.
// Поддерживаемые возможности:
// * Простые бинарные операции и числа, скобки: 1+2*3, 2.5*(2+3.5/7)
// * Значения ячеек в качестве переменных: A1+B2*C3
// Ячейки, указанные в формуле, могут быть как формулами, так и текстом. Если это
// текст, но он представляет число, тогда его нужно трактовать как число. Пустая
// ячейка или ячейка с пустым текстом трактуется как число ноль.
class FormulaInterface {
public:
using Value = std::variant<double, FormulaError>;
virtual ~FormulaInterface() = default;
// Обратите внимание, что в метод Evaluate() ссылка на таблицу передаётся
// в качестве аргумента.
// Возвращает вычисленное значение формулы для переданного листа либо ошибку.
// Если вычисление какой-то из указанных в формуле ячеек приводит к ошибке, то
// возвращается именно эта ошибка. Если таких ошибок несколько, возвращается
// любая.
virtual Value Evaluate(const SheetInterface& sheet) const = 0;
// Возвращает выражение, которое описывает формулу.
// Не содержит пробелов и лишних скобок.
virtual std::string GetExpression() const = 0;
// Возвращает список ячеек, которые непосредственно задействованы в вычислении
// формулы. Список отсортирован по возрастанию и не содержит повторяющихся
// ячеек.
virtual std::vector<Position> GetReferencedCells() const = 0;
};
// Парсит переданное выражение и возвращает объект формулы.
// Бросает FormulaException в случае, если формула синтаксически некорректна.
std::unique_ptr<FormulaInterface> ParseFormula(std::string expression);