10 namespace Mag_server {
12 template< typename T >
13 T *lua_check_class(lua_State *l, int i)
14 { return (T*)luaL_checkudata(l, i, T::_class); }
17 template< typename T >
18 static int lua_gc_class(lua_State *l)
20 T *o = lua_check_class<T>(l, 1);
25 template< typename T >
26 struct Lua_register_ops
28 static void init(lua_State *l)
30 luaL_register(l, NULL, T::_ops);
34 template< typename T >
35 static T *lua_alloc_class(lua_State *l)
37 T *r = new (lua_newuserdata(l, sizeof(T))) T();
38 if (luaL_newmetatable(l, T::_class))
40 lua_pushcfunction(l, &lua_gc_class<T>);
41 lua_setfield(l, -2, "__gc");
44 Lua_register_ops<T>::init(l);
45 lua_setfield(l, -2, "__index");
47 lua_setmetatable(l, -2);
51 template< typename T, typename A >
52 static T *lua_alloc_class(lua_State *l, A const &a)
54 T *r = new (lua_newuserdata(l, sizeof(T))) T(a);
55 if (luaL_newmetatable(l, T::_class))
57 lua_pushcfunction(l, &lua_gc_class<T>);
58 lua_setfield(l, -2, "__gc");
60 Lua_register_ops<T>::init(l);
61 lua_setfield(l, -2, "__index");
63 lua_setmetatable(l, -2);