]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/mag/include/server/lua
update
[l4.git] / l4 / pkg / mag / include / server / lua
1 // vi:ft=cpp
2 #pragma once
3
4 #include <lua.h>
5 #include <lauxlib.h>
6 #include <lualib.h>
7 #include <new>
8
9
10 namespace Mag_server {
11
12 template< typename T >
13 T *lua_check_class(lua_State *l, int i)
14 { return (T*)luaL_checkudata(l, i, T::_class); }
15
16
17 template< typename T >
18 static int lua_gc_class(lua_State *l)
19 {
20   T *o = lua_check_class<T>(l, 1);
21   o->~T();
22   return 0;
23 }
24
25 template< typename T >
26 struct Lua_register_ops
27 {
28   static void init(lua_State *l)
29   {
30     luaL_register(l, NULL, T::_ops);
31   }
32 };
33
34 template< typename T >
35 static T *lua_alloc_class(lua_State *l)
36 {
37   T *r = new (lua_newuserdata(l, sizeof(T))) T();
38   if (luaL_newmetatable(l, T::_class))
39     {
40       lua_pushcfunction(l, &lua_gc_class<T>);
41       lua_setfield(l, -2, "__gc");
42
43       lua_newtable(l);
44       Lua_register_ops<T>::init(l);
45       lua_setfield(l, -2, "__index");
46     }
47   lua_setmetatable(l, -2);
48   return r;
49 }
50
51 template< typename T, typename A >
52 static T *lua_alloc_class(lua_State *l, A const &a)
53 {
54   T *r = new (lua_newuserdata(l, sizeof(T))) T(a);
55   if (luaL_newmetatable(l, T::_class))
56     {
57       lua_pushcfunction(l, &lua_gc_class<T>);
58       lua_setfield(l, -2, "__gc");
59       lua_newtable(l);
60       Lua_register_ops<T>::init(l);
61       lua_setfield(l, -2, "__index");
62     }
63   lua_setmetatable(l, -2);
64   return r;
65 }
66
67 }