FuncSketch
Loading...
Searching...
No Matches
expression_evaluator.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2026 MusicScience37 (Kenta Kabashima)
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
21
22#include <type_traits>
23#include <variant>
24#include <vector>
25
27
28namespace func_sketch::expressions {
29
31 const Expression& expression, Real parameter, Real& result) {
32 const Number parameter_as_number = parameter;
33 Number result_as_number;
34 evaluate(expression, parameter_as_number, result_as_number);
35 std::visit(
36 [&result](const auto& value) {
37 using ValueType = std::decay_t<decltype(value)>;
38 if constexpr (std::is_same_v<ValueType, Complex>) {
39 result = std::real(value);
40 } else {
41 result = static_cast<Real>(value);
42 }
43 },
44 result_as_number);
45}
46
48 const Expression& expression, Number parameter, Number& result) {
49 std::visit([&parameter, &result](
50 const auto& expr) { evaluate(expr, parameter, result); },
51 expression.as_variant());
52}
53
55 Number /*parameter*/, Number& result) {
56 result = expression.value;
57}
58
60 Number parameter, Number& result) {
61 result = parameter;
62}
63
65 const UnaryExpression& expression, Number parameter, Number& result) {
66 Number target_value;
67 evaluate(*expression.target, parameter, target_value);
68 expression.operator_object(target_value, result);
69}
70
72 const BinaryExpression& expression, Number parameter, Number& result) {
73 Number left_value;
74 evaluate(*expression.left, parameter, left_value);
75 Number right_value;
76 evaluate(*expression.right, parameter, right_value);
77 expression.operator_object(left_value, right_value, result);
78}
79
81 Number parameter, Number& result) {
82 std::vector<Number> argument_values;
83 argument_values.reserve(expression.arguments.size());
84 for (const auto& argument : expression.arguments) {
85 Number argument_value;
86 evaluate(*argument, parameter, argument_value);
87 argument_values.push_back(argument_value);
88 }
89 expression.function(argument_values, result);
90}
91
92} // namespace func_sketch::expressions
static void evaluate(const Expression &expression, Number parameter, Number &result)
Evaluate an expression.
static void operator()(const Expression &expression, Real parameter, Real &result)
Evaluate an expression.
const VariantType & as_variant() const
Get the expression as variant.
Definition expression.h:102
Definitions of common types.
double Real
Type of real numbers in this project.
std::variant< Integer, Real, Complex > Number
Type of numbers.
Definition of ExpressionEvaluator class.
Expression * right
Right-hand-side expression.
math::BinaryOperator operator_object
Operator.
Expression * left
Left-hand-side expression.
math::UnaryOperator operator_object
Operator.
Expression * target
Target expression.