MinitScript  0.9.31 PRE-BETA
SetMethods.cpp
Go to the documentation of this file.
1 #include <span>
2 
4 
8 
9 using std::span;
10 
12 
14 
16 
17 void SetMethods::registerConstants(MinitScript* minitScript) {
18 }
19 
20 void SetMethods::registerMethods(MinitScript* minitScript) {
21  // sets
22  {
23  //
24  class MethodSet: public MinitScript::Method {
25  private:
26  MinitScript* minitScript { nullptr };
27  public:
28  MethodSet(MinitScript* minitScript):
30  {},
31  MinitScript::TYPE_SET
32  ),
33  minitScript(minitScript) {}
34  const string getMethodName() override {
35  return "Set";
36  }
37  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
38  if (arguments.size() == 0) {
39  returnValue.setType(MinitScript::TYPE_SET);
40  } else {
41  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
42  }
43  }
44  };
45  minitScript->registerMethod(new MethodSet(minitScript));
46  }
47  {
48  //
49  class MethodSetGetSize: public MinitScript::Method {
50  private:
51  MinitScript* minitScript { nullptr };
52  public:
53  MethodSetGetSize(MinitScript* minitScript):
55  {
56  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = false, .nullable = false }
57  },
58  MinitScript::TYPE_INTEGER
59  ),
60  minitScript(minitScript) {}
61  const string getMethodName() override {
62  return "Set::getSize";
63  }
64  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
65  if (arguments.size() == 1 &&
66  arguments[0].getType() == MinitScript::TYPE_SET) {
67  returnValue.setValue(static_cast<int64_t>(arguments[0].getSetSize()));
68  } else {
69  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
70  }
71  }
72  };
73  minitScript->registerMethod(new MethodSetGetSize(minitScript));
74  }
75  {
76  //
77  class MethodSetIsEmpty: public MinitScript::Method {
78  private:
79  MinitScript* minitScript { nullptr };
80  public:
81  MethodSetIsEmpty(MinitScript* minitScript):
83  {
84  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = false, .nullable = false }
85  },
86  MinitScript::TYPE_BOOLEAN
87  ),
88  minitScript(minitScript) {}
89  const string getMethodName() override {
90  return "Set::isEmpty";
91  }
92  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
93  if (arguments.size() == 1 &&
94  arguments[0].getType() != MinitScript::TYPE_SET) {
95  returnValue.setValue(arguments[0].getSetSize() == 0);
96  } else {
97  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
98  }
99  }
100  };
101  minitScript->registerMethod(new MethodSetIsEmpty(minitScript));
102  }
103  {
104  //
105  class MethodSetInsert: public MinitScript::Method {
106  private:
107  MinitScript* minitScript { nullptr };
108  public:
109  MethodSetInsert(MinitScript* minitScript):
111  {
112  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = true, .nullable = false },
113  { .type = MinitScript::TYPE_STRING, .name = "key", .optional = false, .reference = false, .nullable = false }
114  },
115  MinitScript::TYPE_NULL
116  ),
117  minitScript(minitScript) {}
118  const string getMethodName() override {
119  return "Set::insert";
120  }
121  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
122  string key;
123  if (arguments.size() == 2 &&
124  arguments[0].getType() == MinitScript::TYPE_SET &&
125  MinitScript::getStringValue(arguments, 1, key) == true) {
126  arguments[0].insertSetKey(key);
127  } else {
128  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
129  }
130  }
131  };
132  minitScript->registerMethod(new MethodSetInsert(minitScript));
133  }
134  {
135  //
136  class MethodSetContains: public MinitScript::Method {
137  private:
138  MinitScript* minitScript { nullptr };
139  public:
140  MethodSetContains(MinitScript* minitScript):
142  {
143  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = false, .nullable = false },
144  { .type = MinitScript::TYPE_STRING, .name = "key", .optional = false, .reference = false, .nullable = false }
145  },
146  MinitScript::TYPE_BOOLEAN
147  ),
148  minitScript(minitScript) {}
149  const string getMethodName() override {
150  return "Set::contains";
151  }
152  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
153  string key;
154  if (arguments.size() == 2 &&
155  arguments[0].getType() == MinitScript::TYPE_SET &&
156  MinitScript::getStringValue(arguments, 1, key) == true) {
157  returnValue.setValue(arguments[0].hasSetKey(key));
158  } else {
159  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
160  }
161  }
162  };
163  minitScript->registerMethod(new MethodSetContains(minitScript));
164  }
165  {
166  //
167  class MethodSetRemove: public MinitScript::Method {
168  private:
169  MinitScript* minitScript { nullptr };
170  public:
171  MethodSetRemove(MinitScript* minitScript):
173  {
174  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = true, .nullable = false },
175  { .type = MinitScript::TYPE_STRING, .name = "key", .optional = false, .reference = false, .nullable = false }
176  },
177  MinitScript::TYPE_NULL
178  ),
179  minitScript(minitScript) {}
180  const string getMethodName() override {
181  return "Set::remove";
182  }
183  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
184  string key;
185  if (arguments.size() == 2 &&
186  arguments[0].getType() == MinitScript::TYPE_SET &&
187  MinitScript::getStringValue(arguments, 1, key) == true) {
188  arguments[0].removeSetKey(key);
189  } else {
190  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
191  }
192  }
193  };
194  minitScript->registerMethod(new MethodSetRemove(minitScript));
195  }
196  {
197  //
198  class MethodSetGetKeys: public MinitScript::Method {
199  private:
200  MinitScript* minitScript { nullptr };
201  public:
202  MethodSetGetKeys(MinitScript* minitScript):
204  {
205  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = false, .nullable = false },
206  },
207  MinitScript::TYPE_ARRAY
208  ),
209  minitScript(minitScript) {}
210  const string getMethodName() override {
211  return "Set::getKeys";
212  }
213  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
214  //
215  if (arguments.size() == 1 &&
216  arguments[0].getType() == MinitScript::TYPE_SET) {
217  auto keys = arguments[0].getSetKeys();
218  returnValue.setType(MinitScript::TYPE_ARRAY);
219  for (const auto& key: keys) {
220  returnValue.pushArrayEntry(key);
221  }
222  } else {
223  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
224  }
225  }
226  };
227  minitScript->registerMethod(new MethodSetGetKeys(minitScript));
228  }
229  {
230  //
231  class MethodSetClear: public MinitScript::Method {
232  private:
233  MinitScript* minitScript { nullptr };
234  public:
235  MethodSetClear(MinitScript* minitScript):
237  {
238  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = true, .nullable = false }
239  },
240  MinitScript::TYPE_NULL
241  ),
242  minitScript(minitScript) {}
243  const string getMethodName() override {
244  return "Set::clear";
245  }
246  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
247  if (arguments.size() == 1 &&
248  arguments[0].getType() == MinitScript::TYPE_SET) {
249  arguments[0].clearSet();
250  } else {
251  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
252  }
253  }
254  };
255  minitScript->registerMethod(new MethodSetClear(minitScript));
256  }
257  {
258  //
259  class MethodSetForEach: public MinitScript::Method {
260  private:
261  MinitScript* minitScript { nullptr };
262  public:
263  MethodSetForEach(MinitScript* minitScript):
265  {
266  { .type = MinitScript::TYPE_SET, .name = "set", .optional = false, .reference = false, .nullable = false },
267  { .type = MinitScript::TYPE_FUNCTION_ASSIGNMENT, .name = "callbackFunction", .optional = false, .reference = false, .nullable = false },
268  { .type = MinitScript::TYPE_PSEUDO_MIXED, .name = "cookie", .optional = true, .reference = true, .nullable = false }
269  },
270  MinitScript::TYPE_NULL
271  ),
272  minitScript(minitScript) {}
273  const string getMethodName() override {
274  return "Set::forEach";
275  }
276  void executeMethod(span<MinitScript::Variable>& arguments, MinitScript::Variable& returnValue, const MinitScript::SubStatement& subStatement) override {
277  string callbackFunction;
278  int callbackFunctionScriptIdx;
279  if ((arguments.size() == 2 || arguments.size() == 3) &&
280  arguments[0].getType() == MinitScript::TYPE_SET &&
281  MinitScript::getFunctionValue(arguments, 1, callbackFunction, callbackFunctionScriptIdx) == true) {
282  auto setPtr = arguments[0].getSetPointer();
283  if (setPtr != nullptr) {
284  if (callbackFunction.empty() == false && callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
285  callbackFunctionScriptIdx = minitScript->getFunctionScriptIdx(callbackFunction);
286  }
287  if (callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
288  MINITSCRIPT_METHODUSAGE_COMPLAINM(getMethodName(), "Function not found: " + callbackFunction);
289  } else {
290  for (auto setEntry: *setPtr) {
291  vector<MinitScript::Variable> functionArguments { MinitScript::Variable(setEntry) };
292  if (arguments.size() == 3) functionArguments.push_back(arguments[2]);
293  span functionArgumentsSpan(functionArguments);
294  MinitScript::Variable functionReturnValue;
295  minitScript->call(callbackFunctionScriptIdx, functionArgumentsSpan, functionReturnValue);
296  // exit condition
297  bool result = false;
298  functionReturnValue.getBooleanValue(result, false);
299  if (result == true) break;
300  }
301  }
302  }
303  } else {
304  MINITSCRIPT_METHODUSAGE_COMPLAIN(getMethodName());
305  }
306  }
307  };
308  minitScript->registerMethod(new MethodSetForEach(minitScript));
309  }
310 }
#define MINITSCRIPT_METHODUSAGE_COMPLAINM(methodName, message)
Definition: MinitScript.h:60
#define MINITSCRIPT_METHODUSAGE_COMPLAIN(methodName)
Definition: MinitScript.h:59
void pushArrayEntry(const Variable &value)
Push entry to array.
Definition: MinitScript.h:1892
bool getBooleanValue(bool &value, bool optional=false) const
Get boolean value from given variable.
Definition: MinitScript.h:1405
void setType(VariableType newType)
Set type.
Definition: MinitScript.h:1253
void setValue(const Variable &variable)
Set value from given variable into variable.
Definition: MinitScript.h:1618
void registerMethod(Method *method)
Register method.
int getFunctionScriptIdx(const string &function)
Return function script index by function name.
Definition: MinitScript.h:5204
bool call(int scriptIdx, span< Variable > &arguments, Variable &returnValue, bool pushScriptState)
Call function.
MinitScript script set methods.
Definition: SetMethods.h:12