~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; }
static size_type alphabet_size_and_map(reference_type rac, size_type n, map_type& map, inv_map_type& inv_map, value_type& first_symbol) { map.clear(); inv_map.clear(); if (n==0) { for (size_type i=0; i<256; ++i) { map[i] = 255; // mark each symbol as absent } return 0; } if (rac.size() < n) { throw std::logic_error("wt<int_vector_buffer<8> >: n > rac.size()!"); return 0; } for (size_type i=0; i<256; ++i) { map[i] = 0; } size_type alphabet_size = 0; first_symbol = rac[0]; for (size_type i=0; i < n; ++i) { value_type c = rac[i]; map[c] = 1; } for (size_type i=0; i<256; ++i) { if (map[i]) { map[i] = alphabet_size; ++alphabet_size; } else { map[i] = 255; } inv_map[map[i]] = i; } return alphabet_size; }