bind the enum table to a methods table

This commit is contained in:
Glenn Maynard
2006-10-05 23:08:42 +00:00
parent d3c32bbc61
commit 3407b92ede
2 changed files with 64 additions and 0 deletions
+61
View File
@@ -63,6 +63,67 @@ const RString &EnumToString( int iVal, int iMax, const char **szNameArray, auto_
return *pNameCache[iVal];
}
namespace
{
int GetName( lua_State *L )
{
luaL_checktype( L, 1, LUA_TTABLE );
/* Look up the reverse table. */
luaL_getmetafield( L, 1, "name" );
/* If there was no metafield, then we were called on the wrong type. */
if( lua_isnil(L, -1) )
luaL_typerror( L, 1, "enum" );
return 1;
}
int Reverse( lua_State *L )
{
luaL_checktype( L, 1, LUA_TTABLE );
/* Look up the reverse table. */
luaL_getmetafield( L, 1, "reverse" );
/* If there was no metafield, then we were called on the wrong type. */
if( lua_isnil(L, -1) )
luaL_typerror( L, 1, "enum" );
return 1;
}
}
static const luaL_Reg EnumLib[] = {
{ "GetName", GetName },
{ "Reverse", Reverse },
{ NULL, NULL }
};
static void PushEnumMethodTable( lua_State *L )
{
luaL_register( L, "Enum", EnumLib );
}
void Enum::SetMetatable( lua_State *L, LuaReference &EnumTable, LuaReference &EnumIndexTable, const char *szName )
{
/* Create the EnumToString table: { "UnlockEntry_ArcadePoints", "UnlockEntry_DancePoints" } */ \
EnumTable.PushSelf( L );
{
lua_newtable( L );
EnumIndexTable.PushSelf( L );
lua_setfield( L, -2, "reverse" );
lua_pushstring( L, szName );
lua_setfield( L, -2, "name" );
PushEnumMethodTable( L );
lua_setfield( L, -2, "__index" );
}
lua_setmetatable( L, -2 );
lua_pop( L, 1 );
}
/*
* (c) 2006 Glenn Maynard
* All rights reserved.
+3
View File
@@ -86,6 +86,8 @@ namespace Enum
lua_rawgeti( L, -1, iVal + 1 );
lua_remove( L, -2 );
}
void SetMetatable( lua_State *L, LuaReference &EnumTable, LuaReference &EnumIndexTable, const char *szName );
};
const RString &EnumToString( int iVal, int iMax, const char **szNameArray, auto_ptr<RString> *pNameCache ); // XToString helper
@@ -156,6 +158,7 @@ static void Lua##X(lua_State* L) \
EnumTraits<X>::StringToEnum.SetFromStack( L ); \
EnumTraits<X>::StringToEnum.PushSelf( L ); \
lua_setglobal( L, #X "Index" ); \
Enum::SetMetatable( L, EnumTraits<X>::EnumToString, EnumTraits<X>::StringToEnum, #X ); \
} \
REGISTER_WITH_LUA_FUNCTION( Lua##X ); \
template<> X EnumTraits<X>::Invalid = enum_add2( NUM_##X, 1 ); \