12template <
typename FlagType>
14 std::vector<std::pair<const char *, FlagType>>
LUT;
18 LuaFlags(std::initializer_list<std::pair<const char *, FlagType>> init) :
24 throw std::runtime_error(std::string(
"Class ") + name +
" is already registered.");
29 for (
auto &pair :
LUT) {
30 lua_pushstring(l, pair.first);
31 lua_pushinteger(l,
static_cast<unsigned int>(pair.second));
47 FlagType flagAccum = FlagType(0);
48 index = lua_absindex(l, index);
49 if (!lua_istable(l, index) ||
lookupTableRef == LUA_NOREF)
return flagAccum;
53 lua_gettable(l, LUA_REGISTRYINDEX);
57 lua_pushinteger(l, table_idx++);
58 lua_gettable(l, index);
60 if (!lua_isstring(l, -1)) {
65 flagAccum =
static_cast<FlagType
>(flagAccum | checkFlag(l, -1, -2));
74 FlagType flagAccum = FlagType(0);
75 index = lua_absindex(l, index);
76 if (!lua_isstring(l, index) ||
lookupTableRef == LUA_NOREF)
return flagAccum;
80 lua_gettable(l, LUA_REGISTRYINDEX);
82 return checkFlag(l, index, -1);
86 inline FlagType checkFlag(lua_State *l,
int index,
int lookup_index)
88 lookup_index = lua_absindex(l, lookup_index);
89 lua_pushvalue(l, index);
90 lua_gettable(l, lookup_index);
91 if (lua_isnumber(l, -1)) {
93 FlagType fl_ret =
static_cast<FlagType
>(lua_tointeger(l, -1));
98 std::string index_name = lua_tostring(l, index);
100 luaL_error(l,
"Unknown %s %s",
typeName.c_str(), index_name.c_str());
FlagType LookupEnum(lua_State *l, int index)
Definition LuaFlags.h:72
void Unregister(lua_State *l)
Definition LuaFlags.h:39
void Register(lua_State *l, std::string name)
Definition LuaFlags.h:21
LuaFlags(std::initializer_list< std::pair< const char *, FlagType > > init)
Definition LuaFlags.h:18
FlagType LookupTable(lua_State *l, int index)
Definition LuaFlags.h:45
std::vector< std::pair< const char *, FlagType > > LUT
Definition LuaFlags.h:14
std::string typeName
Definition LuaFlags.h:15
int lookupTableRef
Definition LuaFlags.h:16