~basic_table_iterator() { if (keyidx != -1) { stack::remove(ref.lua_state(), keyidx, 1); } if (ref.valid()) { stack::remove(ref.lua_state(), tableidx, 1); } }
basic_table_iterator(reference_type x) : ref(std::move(x)) { ref.push(); tableidx = lua_gettop(ref.lua_state()); stack::push(ref.lua_state(), nil); this->operator++(); if (idx == -1) { return; } --idx; }
basic_table_iterator& operator++() { if (idx == -1) return *this; if (lua_next(ref.lua_state(), tableidx) == 0) { idx = -1; return *this; } ++idx; kvp.first = object(ref.lua_state(), -2); kvp.second = object(ref.lua_state(), -1); lua_pop(ref.lua_state(), 1); // leave key on the stack return *this; }