sokobo
Loading...
Searching...
No Matches
expression.h
1#pragma once
2#include <map>
3#include <memory>
4#include <string>
5
7{
8public:
9 enum Type
10 {
11 CONSTANT,
12 VARIABLE,
13 BINARY_OP,
14 UNARY_OP,
15 FUNCTION
16 };
17
18 virtual std::string toString() const = 0;
19 virtual std::shared_ptr<Expression> derivative(
20 const std::string& var) const = 0;
21 virtual std::shared_ptr<Expression> simplify() const = 0;
22 virtual double evaluate(
23 const std::map<std::string, double>& vars = {}) const = 0;
24 virtual Type getType() const = 0;
25 virtual std::shared_ptr<Expression> clone() const = 0;
26
27 virtual ~Expression() = default;
28};
29
30class Constant : public Expression
31{
32private:
33 double value;
34
35public:
36 Constant(double val);
37 std::string toString() const override;
38 std::shared_ptr<Expression> derivative(const std::string& var) const override;
39 std::shared_ptr<Expression> simplify() const override;
40 double evaluate(
41 const std::map<std::string, double>& vars = {}) const override;
42 Type getType() const override;
43 std::shared_ptr<Expression> clone() const override;
44
45 double getValue() const { return value; }
46};
47
48class Variable : public Expression
49{
50private:
51 std::string name;
52
53public:
54 Variable(const std::string& n);
55 std::string toString() const override;
56 std::shared_ptr<Expression> derivative(const std::string& var) const override;
57 std::shared_ptr<Expression> simplify() const override;
58 double evaluate(
59 const std::map<std::string, double>& vars = {}) const override;
60 Type getType() const override;
61 std::shared_ptr<Expression> clone() const override;
62
63 std::string getName() const { return name; }
64};
65
66class BinaryOp : public Expression
67{
68public:
69 enum TypeBinaryOp
70 {
71 ADD,
72 SUB,
73 MUL,
74 DIV,
75 POW
76 };
77
78private:
79 std::shared_ptr<Expression> left;
80 std::shared_ptr<Expression> right;
81 char op;
82 TypeBinaryOp binaryOp;
83
84public:
85
86
87 BinaryOp(std::shared_ptr<Expression> l,
88 char operation,
89 std::shared_ptr<Expression>r);
90 std::string toString() const override;
91 std::shared_ptr<Expression> derivative(const std::string& var) const override;
92
93
94 std::shared_ptr<Expression> simplify() const override;
95 double evaluate(
96 const std::map<std::string, double>& vars = {}) const override;
97 Type getType() const override;
98 std::shared_ptr<Expression> clone() const override;
99 std::shared_ptr<Expression> getLeft() const { return left; }
100 std::shared_ptr<Expression> getRight() const { return right; }
101
102 char getOperator() const { return op; }
103
104
105};
106
107class Function : public Expression
108{
109private:
110 std::string name;
111 std::shared_ptr<Expression> argument;
112
113public:
114 Function(const std::string& fname, std::shared_ptr<Expression> arg);
115 std::string toString() const override;
116 std::shared_ptr<Expression> derivative(const std::string& var) const override;
117 std::shared_ptr<Expression> simplify() const override;
118 double evaluate(
119 const std::map<std::string, double>& vars = {}) const override;
120 Type getType() const override;
121 std::shared_ptr<Expression> clone() const override;
122
123 std::string getFunctionName() const { return name; }
124
125 std::shared_ptr<Expression> getArgument() const { return argument; }
126};
127
128
129
130
132{
133private:
134 char operator_;
135 std::shared_ptr<Expression> operand_;
136
137public:
138 // Constructor
139 UnaryOpExpression(char op, std::shared_ptr<Expression> operand);
140
141 // Destructor
142 virtual ~UnaryOpExpression() = default;
143
144 // Override pure virtual methods from Expression
145 virtual double evaluate(
146 const std::map<std::string, double>& variables) const override;
147 virtual std::string toString() const override;
148 virtual Expression::Type getType() const override;
149 virtual std::shared_ptr<Expression> clone() const override;
150 virtual std::shared_ptr<Expression> derivative(const std::string& var) const override;
151 virtual std::shared_ptr<Expression> simplify() const override;
152 // Getters
153 char getOperator() const;
154 std::shared_ptr<Expression> getOperand() const;
155
156};