smats  0.0.1
Satisfability Modulo Arithmetic Theories Symbols
Loading...
Searching...
No Matches
expression_visitor.h
1
10#pragma once
11
12#include "smats/symbolic/expression.h"
13#include "smats/symbolic/expression_kind.h"
14#include "smats/util/exception.h"
15#include "smats/util/visitor.h"
16
17namespace smats {
18
19template <class T, class... Args>
20class ExpressionVisitor : public Visitor<Expression<T>> {
21 public:
22 void visit(const Expression<T> &e, Args... args) override {
23 switch (e.kind()) {
25 visit_constant(e, args...);
26 break;
28 visit_var(e, args...);
29 break;
31 visit_add(e, args...);
32 break;
34 visit_mul(e, args...);
35 break;
37 visit_div(e, args...);
38 break;
40 visit_log(e, args...);
41 break;
43 visit_abs(e, args...);
44 break;
46 visit_pow(e, args...);
47 break;
48 default:
49 throw SmatsUnreachable("Unknown expression kind");
50 }
51 }
52
53 private:
54 virtual void visit_constant(Expression<T> &e, Args... args) = 0;
55 virtual void visit_var(Expression<T> &e, Args... args) = 0;
56 virtual void visit_add(Expression<T> &e, Args... args) = 0;
57 virtual void visit_mul(Expression<T> &e, Args... args) = 0;
58 virtual void visit_div(Expression<T> &e, Args... args) = 0;
59 virtual void visit_log(Expression<T> &e, Args... args) = 0;
60 virtual void visit_abs(Expression<T> &e, Args... args) = 0;
61 virtual void visit_pow(Expression<T> &e, Args... args) = 0;
62};
63
64} // namespace smats
Definition expression_visitor.h:20
Definition expression.h:185
ExpressionKind kind() const
Definition expression.cpp:36
Definition exception.h:58
Definition visitor.h:14
ExpressionKind enum.
@ Abs
absolute value function
@ Mul
multiplication (*)
@ Pow
power function
@ Constant
constant (double)