OASIS
Open Algebra Software
Loading...
Searching...
No Matches
Visit.hpp
Go to the documentation of this file.
1//
2// Created by Matthew McCall on 4/28/24.
3//
4
5#ifndef OASIS_SERIALIZATION_HPP
6#define OASIS_SERIALIZATION_HPP
7
8#include "Expression.hpp"
9#include "FwdDecls.hpp"
10
11namespace Oasis {
12
13class Visitor {
14public:
15 virtual any Visit(const Real& real) = 0;
16 virtual any Visit(const Imaginary& imaginary) = 0;
17 virtual any Visit(const Matrix& matrix) = 0;
18 virtual any Visit(const Variable& variable) = 0;
19 virtual any Visit(const Undefined& undefined) = 0;
20 virtual any Visit(const EulerNumber&) = 0;
21 virtual any Visit(const Pi&) = 0;
22 virtual any Visit(const Add<Expression, Expression>& add) = 0;
23 virtual any Visit(const Subtract<Expression, Expression>& subtract) = 0;
24 virtual any Visit(const Multiply<Expression, Expression>& multiply) = 0;
25 virtual any Visit(const Divide<Expression, Expression>& divide) = 0;
26 virtual any Visit(const Exponent<Expression, Expression>& exponent) = 0;
27 virtual any Visit(const Log<Expression, Expression>& log) = 0;
28 virtual any Visit(const Negate<Expression>& negate) = 0;
29 virtual any Visit(const Sine<Expression>& sine) = 0;
30 virtual any Visit(const Magnitude<Expression>& magnitude) = 0;
31 virtual any Visit(const Derivative<Expression, Expression>& derivative) = 0;
32 virtual any Visit(const Integral<Expression, Expression>& integral) = 0;
33
34 virtual ~Visitor() = default;
35};
36
37template <typename T>
38class TypedVisitor : public Visitor {
39public:
40 using RetT = T;
41
42 auto Visit(const Real& real) -> any final { return TypedVisit(real); }
43 auto Visit(const Imaginary& imaginary) -> any final { return TypedVisit(imaginary); }
44 auto Visit(const Matrix& matrix) -> any final { return TypedVisit(matrix); }
45 auto Visit(const Variable& variable) -> any final { return TypedVisit(variable); }
46 auto Visit(const Undefined& undefined) -> any final { return TypedVisit(undefined); }
47 auto Visit(const EulerNumber& e) -> any final { return TypedVisit(e); }
48 auto Visit(const Pi& pi) -> any final { return TypedVisit(pi); }
49 auto Visit(const Add<Expression, Expression>& add) -> any final { return TypedVisit(add); }
50 auto Visit(const Subtract<Expression, Expression>& subtract) -> any final { return TypedVisit(subtract); }
51 auto Visit(const Multiply<Expression, Expression>& multiply) -> any final { return TypedVisit(multiply); }
52 auto Visit(const Divide<Expression, Expression>& divide) -> any final { return TypedVisit(divide); }
53 auto Visit(const Exponent<Expression, Expression>& exponent) -> any final { return TypedVisit(exponent); }
54 auto Visit(const Log<Expression, Expression>& log) -> any final { return TypedVisit(log); }
55 auto Visit(const Negate<Expression>& negate) -> any final { return TypedVisit(negate); }
56 auto Visit(const Sine<Expression>& sine) -> any final { return TypedVisit(sine); }
57 auto Visit(const Magnitude<Expression>& magnitude) -> any final { return TypedVisit(magnitude); }
58 auto Visit(const Derivative<Expression, Expression>& derivative) -> any final { return TypedVisit(derivative); }
59 auto Visit(const Integral<Expression, Expression>& integral) -> any final { return TypedVisit(integral); }
60
61protected:
62 virtual auto TypedVisit(const Real& real) -> RetT = 0;
63 virtual auto TypedVisit(const Imaginary& imaginary) -> RetT = 0;
64 virtual auto TypedVisit(const Matrix& matrix) -> RetT = 0;
65 virtual auto TypedVisit(const Variable& variable) -> RetT = 0;
66 virtual auto TypedVisit(const Undefined& undefined) -> RetT = 0;
67 virtual auto TypedVisit(const EulerNumber&) -> RetT = 0;
68 virtual auto TypedVisit(const Pi&) -> RetT = 0;
69 virtual auto TypedVisit(const Add<Expression, Expression>& add) -> RetT = 0;
70 virtual auto TypedVisit(const Subtract<Expression, Expression>& subtract) -> RetT = 0;
71 virtual auto TypedVisit(const Multiply<Expression, Expression>& multiply) -> RetT = 0;
72 virtual auto TypedVisit(const Divide<Expression, Expression>& divide) -> RetT = 0;
73 virtual auto TypedVisit(const Exponent<Expression, Expression>& exponent) -> RetT = 0;
74 virtual auto TypedVisit(const Log<Expression, Expression>& log) -> RetT = 0;
75 virtual auto TypedVisit(const Negate<Expression>& negate) -> RetT = 0;
76 virtual auto TypedVisit(const Sine<Expression>& sine) -> RetT = 0;
77 virtual auto TypedVisit(const Magnitude<Expression>& magnitude) -> RetT = 0;
78 virtual auto TypedVisit(const Derivative<Expression, Expression>& derivative) -> RetT = 0;
79 virtual auto TypedVisit(const Integral<Expression, Expression>& integral) -> RetT = 0;
80};
81
82}
83
84#endif // OASIS_SERIALIZATION_HPP
The Add expression adds two expressions together.
Definition Add.hpp:139
The Derivative class template calculates the derivative of given expressions.
Definition Derivative.hpp:62
The Divide expression divides two expressions.
Definition Divide.hpp:115
The EulerNumber class is a representation of the Euler Number.
Definition EulerNumber.hpp:66
The exponent expression creates an exponent two expressions.
Definition Exponent.hpp:84
An 'imaginary' number.
Definition Imaginary.hpp:15
The Integral expression integrates the two expressions together.
Definition Integral.hpp:59
The Log expression represents the logarithm of a base and an argument.
Definition Log.hpp:37
Definition Magnitude.hpp:29
A matrix.
Definition Matrix.hpp:16
The Multiply expression multiplies two expressions.
Definition Multiply.hpp:124
Definition Negate.hpp:14
Mathematical Constant Pi.
Definition Pi.hpp:15
A real number.
Definition Real.hpp:15
Definition FwdDecls.hpp:44
The Subtract expression subtracts two expressions.
Definition Subtract.hpp:159
Definition Visit.hpp:38
virtual auto TypedVisit(const Add< Expression, Expression > &add) -> RetT=0
auto Visit(const Negate< Expression > &negate) -> any final
Definition Visit.hpp:55
virtual auto TypedVisit(const Integral< Expression, Expression > &integral) -> RetT=0
virtual auto TypedVisit(const Real &real) -> RetT=0
virtual auto TypedVisit(const EulerNumber &) -> RetT=0
virtual auto TypedVisit(const Pi &) -> RetT=0
auto Visit(const Pi &pi) -> any final
Definition Visit.hpp:48
virtual auto TypedVisit(const Exponent< Expression, Expression > &exponent) -> RetT=0
virtual auto TypedVisit(const Variable &variable) -> RetT=0
virtual auto TypedVisit(const Sine< Expression > &sine) -> RetT=0
virtual auto TypedVisit(const Matrix &matrix) -> RetT=0
auto Visit(const Real &real) -> any final
Definition Visit.hpp:42
auto Visit(const Log< Expression, Expression > &log) -> any final
Definition Visit.hpp:54
auto Visit(const Subtract< Expression, Expression > &subtract) -> any final
Definition Visit.hpp:50
virtual auto TypedVisit(const Multiply< Expression, Expression > &multiply) -> RetT=0
auto Visit(const Variable &variable) -> any final
Definition Visit.hpp:45
auto Visit(const Sine< Expression > &sine) -> any final
Definition Visit.hpp:56
auto Visit(const Divide< Expression, Expression > &divide) -> any final
Definition Visit.hpp:52
virtual auto TypedVisit(const Log< Expression, Expression > &log) -> RetT=0
auto Visit(const Add< Expression, Expression > &add) -> any final
Definition Visit.hpp:49
auto Visit(const Derivative< Expression, Expression > &derivative) -> any final
Definition Visit.hpp:58
T RetT
Definition Visit.hpp:40
auto Visit(const Matrix &matrix) -> any final
Definition Visit.hpp:44
auto Visit(const Integral< Expression, Expression > &integral) -> any final
Definition Visit.hpp:59
virtual auto TypedVisit(const Divide< Expression, Expression > &divide) -> RetT=0
virtual auto TypedVisit(const Derivative< Expression, Expression > &derivative) -> RetT=0
virtual auto TypedVisit(const Undefined &undefined) -> RetT=0
auto Visit(const Imaginary &imaginary) -> any final
Definition Visit.hpp:43
auto Visit(const Multiply< Expression, Expression > &multiply) -> any final
Definition Visit.hpp:51
auto Visit(const Exponent< Expression, Expression > &exponent) -> any final
Definition Visit.hpp:53
virtual auto TypedVisit(const Imaginary &imaginary) -> RetT=0
virtual auto TypedVisit(const Magnitude< Expression > &magnitude) -> RetT=0
auto Visit(const EulerNumber &e) -> any final
Definition Visit.hpp:47
auto Visit(const Undefined &undefined) -> any final
Definition Visit.hpp:46
virtual auto TypedVisit(const Subtract< Expression, Expression > &subtract) -> RetT=0
auto Visit(const Magnitude< Expression > &magnitude) -> any final
Definition Visit.hpp:57
virtual auto TypedVisit(const Negate< Expression > &negate) -> RetT=0
An undefined expression.
Definition Undefined.hpp:15
An algebraic variable.
Definition Variable.hpp:30
Definition Visit.hpp:13
virtual any Visit(const Log< Expression, Expression > &log)=0
virtual any Visit(const Imaginary &imaginary)=0
virtual any Visit(const Pi &)=0
virtual any Visit(const Exponent< Expression, Expression > &exponent)=0
virtual any Visit(const Magnitude< Expression > &magnitude)=0
virtual any Visit(const Sine< Expression > &sine)=0
virtual ~Visitor()=default
virtual any Visit(const Subtract< Expression, Expression > &subtract)=0
virtual any Visit(const Integral< Expression, Expression > &integral)=0
virtual any Visit(const EulerNumber &)=0
virtual any Visit(const Negate< Expression > &negate)=0
virtual any Visit(const Variable &variable)=0
virtual any Visit(const Divide< Expression, Expression > &divide)=0
virtual any Visit(const Matrix &matrix)=0
virtual any Visit(const Multiply< Expression, Expression > &multiply)=0
virtual any Visit(const Derivative< Expression, Expression > &derivative)=0
virtual any Visit(const Add< Expression, Expression > &add)=0
virtual any Visit(const Real &real)=0
virtual any Visit(const Undefined &undefined)=0
Definition Add.hpp:11
boost::anys::unique_any any
Definition Expression.hpp:15