-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOperation.h
231 lines (162 loc) · 4.18 KB
/
Operation.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
//
// Created by avivs on 11/6/2021.
//
#ifndef CALCULATORGAMESOLVER_OPERATION_H
#define CALCULATORGAMESOLVER_OPERATION_H
#include <string>
#include <memory>
#include <vector>
#define DEBUG 0
// common to all operations
#define OPERATION_METHODS \
public: \
void action(int& display) override; \
void mutate_by(const MutatorOperation& op, bool unmutate) override; \
private: \
std::string to_string() override;
// common to all mutators
#define MUTATOR_OPERATION_METHODS \
public: \
void action(int& display) override {}; \
void mutate_by(const MutatorOperation& op, bool unmutate) override {}; \
void mutate(int& val, bool unmutate) const override; \
private: \
std::string to_string() override;
class MutatorOperation;
class Operation {
public:
// adjusts display and returns whether buttons should be added
virtual void action(int& display) = 0;
virtual void mutate_by(const MutatorOperation& op, bool unmutate) = 0;
virtual ~Operation();
virtual std::string to_string() = 0;
bool is_mutator() { return _is_mutator; }
bool is_memory() { return _is_memory; }
bool is_store() { return _is_store; }
protected:
bool _is_mutator = false;
bool _is_memory = false;
bool _is_store = false;
Operation() : Operation(false, false, false) {};
Operation(bool is_mutator, bool is_memory, bool is_store) : _is_mutator(is_mutator), _is_memory(is_memory),
_is_store(is_store) {};
static int safe_to_int(const std::string& str);
};
class MutatorOperation : public Operation {
public:
// adjusts display and returns whether buttons should be added
virtual void mutate(int& val, bool unmutate) const = 0;
virtual ~MutatorOperation();
virtual std::string to_string();
protected:
MutatorOperation() : Operation(true, false, false) {};
};
class Add : public Operation {
public:
explicit Add(int val);
OPERATION_METHODS
private:
int addVal;
};
class MutatorAdd : public MutatorOperation {
public:
explicit MutatorAdd(int val);
MUTATOR_OPERATION_METHODS
private:
int addVal;
};
class Subtract : public Operation {
public:
explicit Subtract(int val);
OPERATION_METHODS
private:
int subVal;
};
class Multiply : public Operation {
public:
explicit Multiply(int val);
OPERATION_METHODS
private:
int mulVal;
};
class Divide : public Operation {
public:
explicit Divide(int val);
OPERATION_METHODS
private:
int divVal;
};
class Delete : public Operation {
public:
Delete();
OPERATION_METHODS
};
class Insert : public Operation {
public:
explicit Insert(int val);
OPERATION_METHODS
private:
int insVal;
};
class Replace : public Operation {
public:
Replace(int val1, const std::string& val2);
OPERATION_METHODS
private:
int toReplace;
std::string replaceWith;
};
class Reverse : public Operation {
public:
Reverse();
OPERATION_METHODS
};
class PlusMinus : public Operation {
public:
PlusMinus();
OPERATION_METHODS
};
class Sum : public Operation {
public:
Sum();
OPERATION_METHODS
};
class Cube : public Operation {
public:
Cube();
OPERATION_METHODS
};
class Shift : public Operation {
public:
explicit Shift(bool val);
OPERATION_METHODS
private:
bool is_left;
};
class Mirror : public Operation {
public:
Mirror();
OPERATION_METHODS
};
class Memory : public Operation {
public:
Memory();
int get_memory();
void set_memory(int memory);
void pop_memory();
OPERATION_METHODS
private:
std::vector<int> past_memories;
};
class Store : public Operation {
public:
explicit Store(std::shared_ptr<Memory> memory);
std::shared_ptr<Memory> memory;
OPERATION_METHODS
};
class Inv10 : public Operation {
public:
Inv10();
OPERATION_METHODS
};
#endif //CALCULATORGAMESOLVER_OPERATION_H