LUAPLUS_API bool LuaPlusH_next(LuaState* state, LuaObject* table, LuaObject* key, LuaObject* value) { Table* t = hvalue(table->GetTObject()); int i = luaH_findindex(*state, t, key->GetTObject()); /* find original element */ for (i++; i < t->sizearray; i++) { /* try first array part */ if (!ttisnil(&t->array[i])) { /* a non-nil value? */ key->AssignInteger(state, i + 1); value->AssignTObject(state, &t->array[i]); return true; } } for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ key->AssignTObject(state, key2tval(gnode(t, i))); value->AssignTObject(state, gval(gnode(t, i))); return true; } } return false; /* no more elements */ }
int luaH_next (lua_State *L, Table *t, StkId key) { #if LUAPLUS_EXTENSIONS int i = luaH_findindex(L, t, key); /* find original element */ #else int i = findindex(L, t, key); /* find original element */ #endif /* LUAPLUS_EXTENSIONS */ for (i++; i < t->sizearray; i++) { /* try first array part */ if (!ttisnil(&t->array[i])) { /* a non-nil value? */ setnvalue(key, cast_num(i+1)); setobj2s(L, key+1, &t->array[i]); return 1; } } for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ setobj2s(L, key, key2tval(gnode(t, i))); setobj2s(L, key+1, gval(gnode(t, i))); return 1; } } return 0; /* no more elements */ }