16 void MapMethods::registerConstants(
MinitScript* minitScript) {
32 minitScript(minitScript) {}
33 const string getMethodName()
override {
37 if (arguments.size() == 0) {
38 returnValue.
setType(MinitScript::TYPE_MAP);
55 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
57 MinitScript::TYPE_INTEGER
59 minitScript(minitScript) {}
60 const string getMethodName()
override {
61 return "Map::getSize";
65 if (arguments.size() == 1 &&
66 arguments[0].getType() == MinitScript::TYPE_MAP) {
67 returnValue.
setValue(
static_cast<int64_t
>(arguments[0].getMapSize()));
84 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
86 MinitScript::TYPE_BOOLEAN
88 minitScript(minitScript) {}
89 const string getMethodName()
override {
90 return "Map::isEmpty";
94 if (arguments.size() == 1 &&
95 arguments[0].getType() == MinitScript::TYPE_MAP) {
96 returnValue.
setValue(arguments[0].getMapSize() == 0);
113 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
true, .nullable =
false },
114 { .type = MinitScript::TYPE_STRING, .name =
"key", .optional =
false, .reference =
false, .nullable =
false },
115 { .type = MinitScript::TYPE_PSEUDO_MIXED, .name =
"value", .optional =
false, .reference =
false, .nullable =
false }
117 MinitScript::TYPE_NULL
119 minitScript(minitScript) {}
120 const string getMethodName()
override {
126 if (arguments.size() == 3 &&
127 arguments[0].getType() == MinitScript::TYPE_MAP &&
128 MinitScript::getStringValue(arguments, 1, key) ==
true) {
129 arguments[0].setMapEntry(key, arguments[2]);
146 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
147 { .type = MinitScript::TYPE_STRING, .name =
"key", .optional =
false, .reference =
false, .nullable =
false }
149 MinitScript::TYPE_BOOLEAN
151 minitScript(minitScript) {}
152 const string getMethodName()
override {
153 return "Map::contains";
157 if (arguments.size() == 2 &&
158 arguments[0].getType() == MinitScript::TYPE_MAP &&
159 MinitScript::getStringValue(arguments, 1, key) ==
true) {
160 returnValue.
setValue(arguments[0].hasMapEntry(key));
177 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
178 { .type = MinitScript::TYPE_STRING, .name =
"key", .optional =
false, .reference =
false, .nullable =
false }
180 MinitScript::TYPE_PSEUDO_MIXED
182 minitScript(minitScript) {}
183 const string getMethodName()
override {
188 if (arguments.size() == 2 &&
189 arguments[0].getType() == MinitScript::TYPE_MAP &&
190 MinitScript::getStringValue(arguments, 1, key) ==
true) {
191 returnValue.
setValue(arguments[0].getMapEntry(key));
208 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
209 { .type = MinitScript::TYPE_STRING, .name =
"key", .optional =
false, .reference =
false, .nullable =
false }
211 MinitScript::TYPE_PSEUDO_MIXED
213 minitScript(minitScript) {}
214 const string getMethodName()
override {
215 return "Map::getReference";
219 if (arguments.size() == 2 &&
220 arguments[0].getType() == MinitScript::TYPE_MAP &&
221 MinitScript::getStringValue(arguments, 1, key) ==
true) {
222 auto mapEntryPtr = arguments[0].getMapEntryPtr(key);
223 if (mapEntryPtr !=
nullptr) returnValue = MinitScript::Variable::createReferenceVariable(mapEntryPtr);
228 virtual bool isPrivate()
const override {
232 minitScript->
registerMethod(
new MethodMapGetReference(minitScript));
243 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
true, .nullable =
false },
244 { .type = MinitScript::TYPE_STRING, .name =
"key", .optional =
false, .reference =
false, .nullable =
false }
246 MinitScript::TYPE_NULL
248 minitScript(minitScript) {}
249 const string getMethodName()
override {
250 return "Map::remove";
254 if (arguments.size() == 2 &&
255 arguments[0].getType() == MinitScript::TYPE_MAP &&
256 MinitScript::getStringValue(arguments, 1, key) ==
true) {
257 arguments[0].removeMapEntry(key);
274 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
276 MinitScript::TYPE_ARRAY
278 minitScript(minitScript) {}
279 const string getMethodName()
override {
280 return "Map::getKeys";
283 if (arguments.size() == 1 &&
284 arguments[0].getType() == MinitScript::TYPE_MAP) {
285 auto keys = arguments[0].getMapKeys();
286 returnValue.
setType(MinitScript::TYPE_ARRAY);
287 for (
const auto& key: keys) {
306 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
308 MinitScript::TYPE_ARRAY
310 minitScript(minitScript) {}
311 const string getMethodName()
override {
312 return "Map::getValues";
315 if (arguments.size() == 1 &&
316 arguments[0].getType() == MinitScript::TYPE_MAP) {
317 auto values = arguments[0].getMapValues();
318 returnValue.
setType(MinitScript::TYPE_ARRAY);
319 for (
const auto value: values) {
338 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
true, .nullable =
false }
340 MinitScript::TYPE_NULL
342 minitScript(minitScript) {}
343 const string getMethodName()
override {
347 if (arguments.size() == 1 &&
348 arguments[0].getType() == MinitScript::TYPE_MAP) {
349 arguments[0].clearMap();
366 { .type = MinitScript::TYPE_MAP, .name =
"map", .optional =
false, .reference =
false, .nullable =
false },
367 { .type = MinitScript::TYPE_FUNCTION_ASSIGNMENT, .name =
"callbackFunction", .optional =
false, .reference =
false, .nullable =
false },
368 { .type = MinitScript::TYPE_PSEUDO_MIXED, .name =
"cookie", .optional =
true, .reference =
true, .nullable =
false }
370 MinitScript::TYPE_NULL
372 minitScript(minitScript) {}
373 const string getMethodName()
override {
374 return "Map::forEach";
377 string callbackFunction;
378 int callbackFunctionScriptIdx;
379 if ((arguments.size() == 2 || arguments.size() == 3) &&
380 arguments[0].getType() == MinitScript::TYPE_MAP &&
381 MinitScript::getFunctionValue(arguments, 1, callbackFunction, callbackFunctionScriptIdx) ==
true) {
382 auto mapPtr = arguments[0].getMapPointer();
383 if (mapPtr !=
nullptr) {
384 if (callbackFunction.empty() ==
false && callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
387 if (callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
390 for (
const auto& [mapKey, mapValue]: *mapPtr) {
391 vector<MinitScript::Variable> functionArguments {
MinitScript::Variable(mapKey), MinitScript::Variable::createReferenceVariable(mapValue) };
392 if (arguments.size() == 3) functionArguments.push_back(arguments[2]);
393 span functionArgumentsSpan(functionArguments);
395 minitScript->
call(callbackFunctionScriptIdx, functionArgumentsSpan, functionReturnValue);
399 if (result ==
true)
break;
#define MINITSCRIPT_METHODUSAGE_COMPLAINM(methodName, message)
#define MINITSCRIPT_METHODUSAGE_COMPLAIN(methodName)
MinitScript script map methods.
void pushArrayEntry(const Variable &value)
Push entry to array.
bool getBooleanValue(bool &value, bool optional=false) const
Get boolean value from given variable.
void setType(VariableType newType)
Set type.
void setValue(const Variable &variable)
Set value from given variable into variable.
void registerMethod(Method *method)
Register method.
int getFunctionScriptIdx(const string &function)
Return function script index by function name.
bool call(int scriptIdx, span< Variable > &arguments, Variable &returnValue, bool pushScriptState)
Call function.