diff options
Diffstat (limited to 'deep_test/deep_test.cpp')
-rw-r--r-- | deep_test/deep_test.cpp | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/deep_test/deep_test.cpp b/deep_test/deep_test.cpp index 3467939..b11445b 100644 --- a/deep_test/deep_test.cpp +++ b/deep_test/deep_test.cpp | |||
@@ -5,6 +5,21 @@ | |||
5 | #include <memory.h> | 5 | #include <memory.h> |
6 | #include <assert.h> | 6 | #include <assert.h> |
7 | 7 | ||
8 | class MyDeepFactory : public DeepFactory | ||
9 | { | ||
10 | private: | ||
11 | |||
12 | DeepPrelude* newDeepObjectInternal(lua_State* L) const override; | ||
13 | void deleteDeepObjectInternal(lua_State* L, DeepPrelude* o_) const override; | ||
14 | void createMetatable(lua_State* L) const override | ||
15 | { | ||
16 | luaL_getmetatable(L, "deep"); | ||
17 | } | ||
18 | char const* moduleName() const override { return "deep_test"; } | ||
19 | }; | ||
20 | |||
21 | static MyDeepFactory g_MyDeepFactory; | ||
22 | |||
8 | // ################################################################################################ | 23 | // ################################################################################################ |
9 | 24 | ||
10 | // a lanes-deep userdata. needs DeepPrelude and luaG_newdeepuserdata from Lanes code. | 25 | // a lanes-deep userdata. needs DeepPrelude and luaG_newdeepuserdata from Lanes code. |
@@ -15,44 +30,25 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De | |||
15 | 30 | ||
16 | // ################################################################################################ | 31 | // ################################################################################################ |
17 | 32 | ||
18 | [[nodiscard]] static void* deep_test_id(lua_State* L, DeepOp op_) | 33 | DeepPrelude* MyDeepFactory::newDeepObjectInternal(lua_State* L) const |
19 | { | 34 | { |
20 | switch( op_) | 35 | MyDeepUserdata* deep_test = new MyDeepUserdata{ g_MyDeepFactory }; |
21 | { | 36 | return deep_test; |
22 | case DeepOp::New: | 37 | } |
23 | { | ||
24 | MyDeepUserdata* deep_test = new MyDeepUserdata; | ||
25 | return deep_test; | ||
26 | } | ||
27 | |||
28 | case DeepOp::Delete: | ||
29 | { | ||
30 | MyDeepUserdata* deep_test = static_cast<MyDeepUserdata*>(lua_touserdata( L, 1)); | ||
31 | delete deep_test; | ||
32 | return nullptr; | ||
33 | } | ||
34 | |||
35 | case DeepOp::Metatable: | ||
36 | { | ||
37 | luaL_getmetatable( L, "deep"); // mt | ||
38 | return nullptr; | ||
39 | } | ||
40 | 38 | ||
41 | case DeepOp::Module: | 39 | // ################################################################################################ |
42 | return (void*)"deep_test"; | ||
43 | 40 | ||
44 | default: | 41 | void MyDeepFactory::deleteDeepObjectInternal(lua_State* L, DeepPrelude* o_) const |
45 | { | 42 | { |
46 | return nullptr; | 43 | MyDeepUserdata* deep_test = static_cast<MyDeepUserdata*>(o_); |
47 | } | 44 | delete deep_test; |
48 | } | ||
49 | } | 45 | } |
50 | 46 | ||
51 | // ################################################################################################ | 47 | // ################################################################################################ |
52 | 48 | ||
53 | [[nodiscard]] static int deep_set(lua_State* L) | 49 | [[nodiscard]] static int deep_set(lua_State* L) |
54 | { | 50 | { |
55 | MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); | 51 | MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) }; |
56 | lua_Integer i = lua_tointeger( L, 2); | 52 | lua_Integer i = lua_tointeger( L, 2); |
57 | self->val = i; | 53 | self->val = i; |
58 | return 0; | 54 | return 0; |
@@ -60,10 +56,9 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De | |||
60 | 56 | ||
61 | // ################################################################################################ | 57 | // ################################################################################################ |
62 | 58 | ||
63 | // won't actually do anything as deep userdata don't have uservalue slots | ||
64 | [[nodiscard]] static int deep_setuv(lua_State* L) | 59 | [[nodiscard]] static int deep_setuv(lua_State* L) |
65 | { | 60 | { |
66 | MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); | 61 | MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) }; |
67 | int uv = (int) luaL_optinteger(L, 2, 1); | 62 | int uv = (int) luaL_optinteger(L, 2, 1); |
68 | lua_settop( L, 3); | 63 | lua_settop( L, 3); |
69 | lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0); | 64 | lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0); |
@@ -75,7 +70,7 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De | |||
75 | // won't actually do anything as deep userdata don't have uservalue slots | 70 | // won't actually do anything as deep userdata don't have uservalue slots |
76 | [[nodiscard]] static int deep_getuv(lua_State* L) | 71 | [[nodiscard]] static int deep_getuv(lua_State* L) |
77 | { | 72 | { |
78 | MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); | 73 | MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) }; |
79 | int uv = (int) luaL_optinteger(L, 2, 1); | 74 | int uv = (int) luaL_optinteger(L, 2, 1); |
80 | lua_getiuservalue( L, 1, uv); | 75 | lua_getiuservalue( L, 1, uv); |
81 | return 1; | 76 | return 1; |
@@ -85,7 +80,7 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De | |||
85 | 80 | ||
86 | [[nodiscard]] static int deep_tostring(lua_State* L) | 81 | [[nodiscard]] static int deep_tostring(lua_State* L) |
87 | { | 82 | { |
88 | MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); | 83 | MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) }; |
89 | lua_pushfstring(L, "%p:deep(%d)", lua_topointer(L, 1), self->val); | 84 | lua_pushfstring(L, "%p:deep(%d)", lua_topointer(L, 1), self->val); |
90 | return 1; | 85 | return 1; |
91 | } | 86 | } |
@@ -94,7 +89,7 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De | |||
94 | 89 | ||
95 | [[nodiscard]] static int deep_gc(lua_State* L) | 90 | [[nodiscard]] static int deep_gc(lua_State* L) |
96 | { | 91 | { |
97 | MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); | 92 | MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) }; |
98 | return 0; | 93 | return 0; |
99 | } | 94 | } |
100 | 95 | ||
@@ -115,9 +110,8 @@ static luaL_Reg const deep_mt[] = | |||
115 | int luaD_new_deep( lua_State* L) | 110 | int luaD_new_deep( lua_State* L) |
116 | { | 111 | { |
117 | int const nuv{ static_cast<int>(luaL_optinteger(L, 1, 0)) }; | 112 | int const nuv{ static_cast<int>(luaL_optinteger(L, 1, 0)) }; |
118 | // no additional parameter to luaG_newdeepuserdata! | ||
119 | lua_settop(L, 0); | 113 | lua_settop(L, 0); |
120 | return luaG_newdeepuserdata(Dest{ L }, deep_test_id, nuv); | 114 | return g_MyDeepFactory.pushDeepUserdata(Dest{ L }, nuv); |
121 | } | 115 | } |
122 | 116 | ||
123 | // ################################################################################################ | 117 | // ################################################################################################ |