13template <
typename FlagType>
15 std::vector<std::pair<const char *, FlagType>>
LUT;
20 LuaFlags(std::initializer_list<std::pair<const char *, FlagType>> init) :
26 for (
size_t idx = 0; enumEntries[idx].
name !=
nullptr; idx++) {
27 LUT.emplace_back(enumEntries[idx].name,
static_cast<FlagType
>(enumEntries[idx].value));
34 throw std::runtime_error(std::string(
"Class ") + name +
" is already registered.");
39 for (
auto &pair :
LUT) {
40 lua_pushstring(l, pair.first);
41 lua_pushinteger(l,
static_cast<unsigned int>(pair.second));
58 FlagType flagAccum = FlagType(0);
59 index = lua_absindex(l, index);
60 if (!lua_istable(l, index) ||
lookupTableRef == LUA_NOREF)
return flagAccum;
64 lua_gettable(l, LUA_REGISTRYINDEX);
68 lua_pushinteger(l, table_idx++);
69 lua_gettable(l, index);
71 if (!lua_isstring(l, -1)) {
76 flagAccum =
static_cast<FlagType
>(flagAccum | checkFlag(l, -1, -2));
86 FlagType flagAccum = FlagType(0);
87 index = lua_absindex(l, index);
88 if (!lua_isstring(l, index) ||
lookupTableRef == LUA_NOREF)
return flagAccum;
92 lua_gettable(l, LUA_REGISTRYINDEX);
94 return checkFlag(l, index, -1);
98 inline FlagType checkFlag(lua_State *l,
int index,
int lookup_index)
100 lookup_index = lua_absindex(l, lookup_index);
101 lua_pushvalue(l, index);
102 lua_gettable(l, lookup_index);
103 if (lua_isnumber(l, -1)) {
105 FlagType fl_ret =
static_cast<FlagType
>(lua_tointeger(l, -1));
110 std::string index_name = lua_tostring(l, index);
112 luaL_error(l,
"Unknown %s %s",
typeName.c_str(), index_name.c_str());
Definition: enum_table.h:10
const char * name
Definition: enum_table.h:11
Definition: LuaFlags.h:14
FlagType LookupEnum(lua_State *l, int index)
Definition: LuaFlags.h:84
void Unregister(lua_State *l)
Definition: LuaFlags.h:49
LuaFlags(const EnumItem enumEntries[])
Definition: LuaFlags.h:24
void Register(lua_State *l, std::string name)
Definition: LuaFlags.h:31
LuaFlags(std::initializer_list< std::pair< const char *, FlagType > > init)
Definition: LuaFlags.h:20
FlagType LookupTable(lua_State *l, int index)
Definition: LuaFlags.h:56
std::vector< std::pair< const char *, FlagType > > LUT
Definition: LuaFlags.h:15
std::string typeName
Definition: LuaFlags.h:16
int lookupTableRef
Definition: LuaFlags.h:17