static void scArrayRemove(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); int i; vector<int> removedIndices; int l = arr->getArrayLength(); CScriptVarPtr equal = c->constScriptVar(Undefined); for (i=0;i<l;i++) { equal = obj->mathsOp(arr->getArrayIndex(i), LEX_EQUAL); if(equal->toBoolean()) { removedIndices.push_back(i); } } if(removedIndices.size()) { vector<int>::iterator remove_it = removedIndices.begin(); int next_remove = *remove_it; int next_insert = *remove_it++; for (i=next_remove;i<l;i++) { CScriptVarLinkPtr link = arr->findChild(int2string(i)); if(i == next_remove) { if(link) arr->removeLink(link); if(remove_it != removedIndices.end()) next_remove = *remove_it++; } else { if(link) { arr->setArrayIndex(next_insert++, link); arr->removeLink(link); } } } } }
static void scArrayRemove(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); uint32_t l = arr->getLength(); uint32_t offset = 0; for(SCRIPTVAR_CHILDS_it it= lower_bound(arr->Childs.begin(), arr->Childs.end(), "0"); it != arr->Childs.end(); ++it) { while(it != arr->Childs.end() && obj->mathsOp(it->getter(), LEX_EQUAL)->toBoolean()) { it = arr->Childs.erase(it); offset++; } if(offset && it != arr->Childs.end()) (*it)->reName(int2string((uint32_t)strtoul((*it)->getName().c_str(), 0, 10)-offset) ); } }
static void scArrayContains(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); int l = arr->getArrayLength(); CScriptVarPtr equal = c->constScriptVar(Undefined); for (int i=0;i<l;i++) { equal = obj->mathsOp(arr->getArrayIndex(i), LEX_EQUAL); if(equal->toBoolean()) { c->setReturnVar(c->constScriptVar(true)); return; } } c->setReturnVar(c->constScriptVar(false)); }