10 #ifndef smtk_common_InfixExpressionEvaluation_h
11 #define smtk_common_InfixExpressionEvaluation_h
15 #include "smtk/CoreExports.h"
16 #include "smtk/SystemConfig.h"
35 using SubsymbolVisitor = std::function<std::pair<double, bool>(
const std::string& symbol)>;
37 enum class EvaluationOrder : int
44 std::function<double(
double,
double)> f;
51 std::function<double(
double)> f;
59 while (!m_operators.empty() && m_operators.back().p <= b.p)
63 m_operators.push_back(b);
66 void push(
const double l) { m_operands.push_back(l); }
70 while (!m_operators.empty())
75 const double result = m_operands.back();
81 std::vector<InfixOperator> m_operators;
82 std::vector<double> m_operands;
86 const double r = m_operands.back();
87 m_operands.pop_back();
88 const double l = m_operands.back();
89 m_operands.pop_back();
92 m_operators.pop_back();
94 m_operands.push_back(o.f(l, r));
102 : m_functionForNextOpen([](
double d) {
return d; })
111 m_stacks.emplace_back(StackLevel(
EvaluationStack(), m_functionForNextOpen));
112 m_functionForNextOpen = [](
double d) {
return d; };
115 void setFunctionForNextOpen(
const std::function<
double(
double)>& functionForNextOpen)
117 m_functionForNextOpen = functionForNextOpen;
121 void push(
const T& t)
123 m_stacks.back().first.push(t);
129 const double result = m_stacks.back().second(m_stacks.back().first.finish());
131 m_stacks.back().first.push(result);
134 double finish() {
return m_stacks.back().first.finish(); }
137 using StackLevel = std::pair<
EvaluationStack, std::function<double(
double)>>;
139 std::vector<StackLevel> m_stacks;
140 std::function<double(
double)> m_functionForNextOpen;
148 insert(
"*", EvaluationOrder(5), [](
const double l,
const double r) {
return l * r; });
149 insert(
"/", EvaluationOrder(5), [](
const double l,
const double r) {
return l / r; });
150 insert(
"+", EvaluationOrder(6), [](
const double l,
const double r) {
return l + r; });
151 insert(
"-", EvaluationOrder(6), [](
const double l,
const double r) {
return l - r; });
152 insert(
"^", EvaluationOrder(4), [](
const double l,
const double r) {
return std::pow(l, r); });
156 const std::string& name,
157 const EvaluationOrder p,
158 const std::function<
double(
double,
double)>& f)
163 const std::map<std::string, InfixOperator>& ops()
const noexcept {
return m_ops; }
166 std::map<std::string, InfixOperator> m_ops;
174 insert(
"sin", [](
const double x) {
return std::sin(x); });
175 insert(
"cos", [](
const double x) {
return std::cos(x); });
176 insert(
"tan", [](
const double x) {
return std::tan(x); });
177 insert(
"asin", [](
const double x) {
return std::asin(x); });
178 insert(
"acos", [](
const double x) {
return std::acos(x); });
179 insert(
"atan", [](
const double x) {
return std::atan(x); });
180 insert(
"sinh", [](
const double x) {
return std::sinh(x); });
181 insert(
"cosh", [](
const double x) {
return std::cosh(x); });
182 insert(
"tanh", [](
const double x) {
return std::tanh(x); });
183 insert(
"asinh", [](
const double x) {
return std::asinh(x); });
184 insert(
"acosh", [](
const double x) {
return std::acosh(x); });
185 insert(
"atanh", [](
const double x) {
return std::atanh(x); });
186 insert(
"ln", [](
const double x) {
return std::log(x); });
187 insert(
"log10", [](
const double x) {
return std::log10(x); });
188 insert(
"exp", [](
const double x) {
return std::exp(x); });
189 insert(
"sqrt", [](
const double x) {
return std::sqrt(x); });
192 void insert(
const std::string& name,
const std::function<
double(
double)>& f)
194 m_functions.insert(std::make_pair(name,
InfixFunction{ f }));
197 const std::map<std::string, InfixFunction>& funcs()
const noexcept {
return m_functions; }
200 std::map<std::string, InfixFunction> m_functions;
206 #endif // smtk_common_InfixExpressionEvaluation_h