10
10
#include " checktestdataLexer.h"
11
11
12
12
class Expression {
13
- public:
14
- const Value & eval () { return *callEval ().second ; }
15
- void assign (const Value & v) { (this ->*assign_)(v); }
13
+ public:
14
+ const Value& eval () { return *callEval ().second ; }
15
+ void assign (const Value& v) { (this ->*assign_)(v); }
16
16
Expression () {}
17
17
Expression (Value v);
18
- Expression (Variable * variable, std::vector<Expression> idx);
19
- Expression (const antlr4::Token * literal);
20
- Expression (const antlr4::Token * binop, Expression a, Expression b);
21
- Expression (const antlr4::Token * unop, Expression e);
22
- Expression (const antlr4::Token * function, std::vector<Expression> arguments);
18
+ Expression (Variable* variable, std::vector<Expression> idx);
19
+ Expression (const antlr4::Token* literal);
20
+ Expression (const antlr4::Token* binop, Expression a, Expression b);
21
+ Expression (const antlr4::Token* unop, Expression e);
22
+ Expression (const antlr4::Token* function, std::vector<Expression> arguments);
23
23
template <typename F,
24
24
typename _ = std::enable_if_t <std::is_invocable_v<F>, void >>
25
25
Expression (F f)
26
26
: eval_(&Expression::foldConst<&Expression::backdoorEval<F>>),
27
27
context_ (std::move(f)) {}
28
28
29
- private:
29
+ private:
30
30
auto idx () {
31
31
return boost::make_transform_iterator (
32
- children_.begin (), [](Expression & child) { return child.eval (); });
32
+ children_.begin (), [](Expression& child) { return child.eval (); });
33
33
}
34
- std::pair<bool , const Value *> callEval ();
35
- std::pair<bool , const Value *> invalid ();
36
- std::pair<bool , const Value *> constEval ();
34
+ std::pair<bool , const Value*> callEval ();
35
+ std::pair<bool , const Value*> invalid ();
36
+ std::pair<bool , const Value*> constEval ();
37
37
using EvalFn = decltype (&Expression::constEval);
38
- template <EvalFn inner> std::pair<bool , const Value *> foldConst () {
38
+ template <EvalFn inner>
39
+ std::pair<bool , const Value*> foldConst () {
39
40
auto result = (this ->*inner)();
40
41
if (result.first ) {
41
42
*this = Expression{std::move (*result.second )};
@@ -44,33 +45,39 @@ class Expression {
44
45
}
45
46
return callEval ();
46
47
}
47
- template <int op> std::pair<bool , const Value *> binopEval ();
48
- std::pair<bool , const Value *> unaryMinusEval ();
49
- std::pair<bool , const Value *> unaryNotEval ();
50
- void invalidAssignment (const Value &value);
48
+ template <int op>
49
+ std::pair<bool , const Value*> binopEval ();
50
+ std::pair<bool , const Value*> unaryMinusEval ();
51
+ std::pair<bool , const Value*> unaryNotEval ();
52
+ void invalidAssignment (const Value& value);
51
53
using AssignFn = decltype (&Expression::invalidAssignment);
52
- void variableAssignment (const Value &value);
53
- std::pair<bool , const Value *> variableEval ();
54
- std::pair<bool , const Value *> uniqueEval ();
55
- std::pair<bool , const Value *> inarrayEval ();
56
- std::pair<bool , const Value *> strlenEval ();
57
- template <typename F> std::pair<bool , const Value *> backdoorEval () {
54
+ void variableAssignment (const Value& value);
55
+ std::pair<bool , const Value*> variableEval ();
56
+ std::pair<bool , const Value*> uniqueEval ();
57
+ std::pair<bool , const Value*> inarrayEval ();
58
+ std::pair<bool , const Value*> strlenEval ();
59
+ template <typename F>
60
+ std::pair<bool , const Value*> backdoorEval () {
58
61
return (*std::any_cast<F>(&context_))();
59
62
}
60
- template <size_t size> void variableArrayAssignment (const Value &value) {
63
+ template <size_t size>
64
+ void variableArrayAssignment (const Value& value) {
61
65
variable_->set <size>(idx (), value);
62
66
}
63
- template <size_t size> std::pair<bool , const Value *> variableArrayEval () {
67
+ template <size_t size>
68
+ std::pair<bool , const Value*> variableArrayEval () {
64
69
return {false , &variable_->get <size>(idx ())};
65
70
}
66
71
67
- template <size_t size> EvalFn getVariableEval (size_t i);
72
+ template <size_t size>
73
+ EvalFn getVariableEval (size_t i);
68
74
69
- template <size_t size> AssignFn getVariableAssignment (size_t i);
75
+ template <size_t size>
76
+ AssignFn getVariableAssignment (size_t i);
70
77
71
78
Value value_;
72
- Variable * variable_;
73
- std::vector<const Variable *> variables_;
79
+ Variable* variable_;
80
+ std::vector<const Variable*> variables_;
74
81
EvalFn eval_ = &Expression::invalid;
75
82
AssignFn assign_ = &Expression::invalidAssignment;
76
83
std::vector<Expression> children_;
0 commit comments