16 void ArrayMethods::registerConstants(
MinitScript* minitScript) {
19 void ArrayMethods::registerMethods(
MinitScript* minitScript) {
30 MinitScript::TYPE_ARRAY
32 minitScript(minitScript) {}
33 const string getMethodName()
override {
36 bool isVariadic()
const override {
40 returnValue.
setType(MinitScript::TYPE_ARRAY);
41 for (
const auto& argument: arguments) {
57 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false }
59 MinitScript::TYPE_INTEGER
61 minitScript(minitScript) {}
62 const string getMethodName()
override {
63 return "Array::getSize";
66 if (arguments.size() == 1 &&
67 arguments[0].getType() == MinitScript::TYPE_ARRAY) {
68 returnValue.
setValue(
static_cast<int64_t
>(arguments[0].getArraySize()));
85 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false }
87 MinitScript::TYPE_BOOLEAN
89 minitScript(minitScript) {}
90 const string getMethodName()
override {
91 return "Array::isEmpty";
94 if (arguments.size() == 1 &&
95 arguments[0].getType() == MinitScript::TYPE_ARRAY) {
96 returnValue.
setValue(arguments[0].getArraySize() == 0);
113 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false }
115 MinitScript::TYPE_NULL
117 minitScript(minitScript) {}
118 const string getMethodName()
override {
119 return "Array::push";
121 bool isVariadic()
const override {
126 if (arguments.size() > 1 &&
127 arguments[0].getType() == MinitScript::TYPE_ARRAY) {
128 for (
auto i = 1; i < arguments.size(); i++) {
129 arguments[0].pushArrayEntry(arguments[i]);
147 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false },
148 { .type = MinitScript::TYPE_INTEGER, .name =
"index", .optional =
false, .reference =
false, .nullable =
false }
150 MinitScript::TYPE_PSEUDO_MIXED
152 minitScript(minitScript) {}
153 const string getMethodName()
override {
158 if (arguments.size() == 2 &&
159 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
160 MinitScript::getIntegerValue(arguments, 1, index) ==
true) {
161 returnValue.
setValue(arguments[0].getArrayEntry(index));
178 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false },
179 { .type = MinitScript::TYPE_INTEGER, .name =
"index", .optional =
false, .reference =
false, .nullable =
false },
180 { .type = MinitScript::TYPE_PSEUDO_MIXED, .name =
"value", .optional =
false, .reference =
false, .nullable =
false }
182 MinitScript::TYPE_NULL
184 minitScript(minitScript) {}
185 const string getMethodName()
override {
190 if (arguments.size() == 3 &&
191 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
192 MinitScript::getIntegerValue(arguments, 1, index) ==
true) {
193 arguments[0].setArrayEntry(index, arguments[2]);
210 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false },
211 { .type = MinitScript::TYPE_INTEGER, .name =
"index", .optional =
false, .reference =
false, .nullable =
false }
213 MinitScript::TYPE_NULL
215 minitScript(minitScript) {}
216 const string getMethodName()
override {
217 return "Array::remove";
221 if (arguments.size() == 2 &&
222 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
223 MinitScript::getIntegerValue(arguments, 1, index) ==
true) {
224 arguments[0].removeArrayEntry(index);
241 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false },
242 { .type = MinitScript::TYPE_STRING, .name =
"value", .optional =
false, .reference =
false, .nullable =
false },
243 { .type = MinitScript::TYPE_INTEGER, .name =
"beginIndex", .optional =
true, .reference =
false, .nullable =
false },
245 MinitScript::TYPE_NULL
247 minitScript(minitScript) {}
248 const string getMethodName()
override {
249 return "Array::removeOf";
253 int64_t beginIndex = 0;
254 if ((arguments.size() == 2 || arguments.size() == 3) &&
255 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
256 MinitScript::getStringValue(arguments, 1, stringValue) ==
true &&
257 MinitScript::getIntegerValue(arguments, 2, beginIndex,
true) ==
true) {
258 auto& array = arguments[0];
259 for (
auto i = beginIndex; i < array.getArraySize(); i++) {
260 auto arrayValue = array.getArrayEntry(i);
261 if (arrayValue.getValueAsString() == stringValue) {
262 array.removeArrayEntry(i);
271 minitScript->
registerMethod(
new MethodArrayRemoveOf(minitScript));
282 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false },
283 { .type = MinitScript::TYPE_STRING, .name =
"value", .optional =
false, .reference =
false, .nullable =
false },
284 { .type = MinitScript::TYPE_INTEGER, .name =
"beginIndex", .optional =
true, .reference =
false, .nullable =
false },
286 MinitScript::TYPE_INTEGER
288 minitScript(minitScript) {}
289 const string getMethodName()
override {
290 return "Array::indexOf";
294 int64_t beginIndex = 0;
295 if ((arguments.size() == 2 || arguments.size() == 3) &&
296 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
297 MinitScript::getStringValue(arguments, 1, stringValue) ==
true &&
298 MinitScript::getIntegerValue(arguments, 2, beginIndex,
true) ==
true) {
299 const auto& array = arguments[0];
300 returnValue.
setValue(
static_cast<int64_t
>(-1));
301 for (
auto i = beginIndex; i < array.getArraySize(); i++) {
302 auto arrayValue = array.getArrayEntry(i);
303 if (arrayValue.getValueAsString() == stringValue) {
304 returnValue.
setValue(
static_cast<int64_t
>(i));
324 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false },
325 { .type = MinitScript::TYPE_FUNCTION_ASSIGNMENT, .name =
"sortFunction", .optional =
false, .reference =
false, .nullable =
false },
327 MinitScript::TYPE_NULL
329 minitScript(minitScript) {}
330 const string getMethodName()
override {
331 return "Array::sort";
335 int sortFunctionScriptIdx;
336 if (arguments.size() == 2 &&
337 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
338 MinitScript::getFunctionValue(arguments, 1, sortFunction, sortFunctionScriptIdx) ==
true) {
339 auto arrayPtr = arguments[0].getArrayPointer();
340 if (arrayPtr !=
nullptr) {
341 if (sortFunction.empty() ==
false && sortFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
344 if (sortFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
350 int sortFunctionScriptIdx;
352 SortClass(
MinitScript* minitScript,
int sortFunctionScriptIdx): minitScript(minitScript), sortFunctionScriptIdx(sortFunctionScriptIdx) {
355 vector<MinitScript::Variable> sortArguments { MinitScript::Variable::createReferenceVariable(a), MinitScript::Variable::createReferenceVariable(b) };
356 span sortArgumentsSpan(sortArguments);
358 minitScript->
call(sortFunctionScriptIdx, sortArgumentsSpan, sortReturnValue);
364 sort(arrayPtr->begin(), arrayPtr->end(), SortClass(minitScript, sortFunctionScriptIdx));
383 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false }
385 MinitScript::TYPE_NULL
387 minitScript(minitScript) {}
388 const string getMethodName()
override {
389 return "Array::reverse";
392 if (arguments.size() == 1 &&
393 arguments[0].getType() == MinitScript::TYPE_ARRAY) {
394 auto arrayPtr = arguments[0].getArrayPointer();
395 if (arrayPtr !=
nullptr) {
396 reverse(arrayPtr->begin(), arrayPtr->end());
414 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
true, .nullable =
false }
416 MinitScript::TYPE_NULL
418 minitScript(minitScript) {}
419 const string getMethodName()
override {
420 return "Array::clear";
423 if (arguments.size() == 1 &&
424 arguments[0].getType() == MinitScript::TYPE_ARRAY) {
425 arguments[0].clearArray();
442 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false },
443 { .type = MinitScript::TYPE_FUNCTION_ASSIGNMENT, .name =
"callbackFunction", .optional =
false, .reference =
false, .nullable =
false },
444 { .type = MinitScript::TYPE_PSEUDO_MIXED, .name =
"cookie", .optional =
true, .reference =
true, .nullable =
false }
446 MinitScript::TYPE_NULL
448 minitScript(minitScript) {}
449 const string getMethodName()
override {
450 return "Array::forEach";
453 string callbackFunction;
454 int callbackFunctionScriptIdx;
455 if ((arguments.size() == 2 || arguments.size() == 3) &&
456 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
457 MinitScript::getFunctionValue(arguments, 1, callbackFunction, callbackFunctionScriptIdx) ==
true) {
458 auto arrayPtr = arguments[0].getArrayPointer();
459 if (arrayPtr !=
nullptr) {
460 if (callbackFunction.empty() ==
false && callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
463 if (callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
466 for (
auto arrayEntry: *arrayPtr) {
467 vector<MinitScript::Variable> functionArguments { MinitScript::Variable::createReferenceVariable(arrayEntry) };
468 if (arguments.size() == 3) functionArguments.push_back(arguments[2]);
469 span functionArgumentsSpan(functionArguments);
471 minitScript->
call(callbackFunctionScriptIdx, functionArgumentsSpan, functionReturnValue);
475 if (result ==
true)
break;
495 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false },
496 { .type = MinitScript::TYPE_FUNCTION_ASSIGNMENT, .name =
"callbackFunction", .optional =
false, .reference =
false, .nullable =
false },
497 { .type = MinitScript::TYPE_INTEGER, .name =
"beginIndex", .optional =
false, .reference =
false, .nullable =
false },
498 { .type = MinitScript::TYPE_INTEGER, .name =
"count", .optional =
true, .reference =
false, .nullable =
false },
499 { .type = MinitScript::TYPE_INTEGER, .name =
"step", .optional =
true, .reference =
false, .nullable =
false },
500 { .type = MinitScript::TYPE_PSEUDO_MIXED, .name =
"cookie", .optional =
true, .reference =
true, .nullable =
false }
502 MinitScript::TYPE_NULL
504 minitScript(minitScript) {}
505 const string getMethodName()
override {
506 return "Array::forRange";
509 string callbackFunction;
510 int callbackFunctionScriptIdx;
512 int64_t count = -1ll;
514 if ((arguments.size() == 3 || arguments.size() == 4 || arguments.size() == 5 || arguments.size() == 6) &&
515 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
516 MinitScript::getFunctionValue(arguments, 1, callbackFunction, callbackFunctionScriptIdx) ==
true &&
517 MinitScript::getIntegerValue(arguments, 2, beginIndex,
true) ==
true &&
518 MinitScript::getIntegerValue(arguments, 3, count,
true) ==
true &&
519 MinitScript::getIntegerValue(arguments, 4, step,
true) ==
true) {
520 auto arrayPtr = arguments[0].getArrayPointer();
521 if (arrayPtr !=
nullptr) {
522 if (callbackFunction.empty() ==
false && callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
525 if (callbackFunctionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
529 for (
auto i = beginIndex; i >= 0 && counter < count && i < arrayPtr->size(); i+= step) {
530 auto arrayEntry = (*arrayPtr)[i];
531 vector<MinitScript::Variable> functionArguments { MinitScript::Variable::createReferenceVariable(arrayEntry) };
532 if (arguments.size() == 6) functionArguments.push_back(arguments[5]);
533 span functionArgumentsSpan(functionArguments);
535 minitScript->
call(callbackFunctionScriptIdx, functionArgumentsSpan, functionReturnValue);
539 if (result ==
true)
break;
550 minitScript->
registerMethod(
new MethodArrayForRange(minitScript));
561 { .type = MinitScript::TYPE_ARRAY, .name =
"array", .optional =
false, .reference =
false, .nullable =
false },
562 { .type = MinitScript::TYPE_PSEUDO_MIXED, .name =
"value", .optional =
false, .reference =
false, .nullable =
false },
564 MinitScript::TYPE_BOOLEAN
566 minitScript(minitScript) {}
567 const string getMethodName()
override {
568 return "Array::contains";
572 if ((arguments.size() == 2) &&
573 arguments[0].getType() == MinitScript::TYPE_ARRAY &&
574 MinitScript::getStringValue(arguments, 1, stringValue) ==
true) {
575 const auto& array = arguments[0];
577 for (
auto i = 0; i < array.getArraySize(); i++) {
578 auto arrayValue = array.getArrayEntry(i);
579 if (arrayValue.getValueAsString() == stringValue) {
589 minitScript->
registerMethod(
new MethodArrayContains(minitScript));
#define MINITSCRIPT_METHODUSAGE_COMPLAINM(methodName, message)
#define MINITSCRIPT_METHODUSAGE_COMPLAIN(methodName)
MinitScript script array 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.