2
0

LuaCallWrapper.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /*
  2. * LuaCallWrapper.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "api/Registry.h"
  12. #include "LuaStack.h"
  13. #include "LuaFunctor.h"
  14. namespace scripting
  15. {
  16. namespace detail
  17. {
  18. }
  19. //TODO: this should be the only one wrapper type
  20. //
  21. template <typename U, typename M, M m>
  22. class LuaMethodWrapper
  23. {
  24. };
  25. template <typename U, typename T, typename R, R(T:: * method)()const>
  26. class LuaMethodWrapper <U, R(T:: *)()const, method>
  27. {
  28. public:
  29. static int invoke(lua_State * L)
  30. {
  31. LuaStack S(L);
  32. const U * obj = nullptr;
  33. if(!S.tryGet(1,obj))
  34. return S.retVoid();
  35. static auto functor = std::mem_fn(method);
  36. S.clear();
  37. S.push(functor(obj));
  38. return S.retPushed();
  39. }
  40. };
  41. template <typename U, typename T, void(T:: * method)()const>
  42. class LuaMethodWrapper <U, void(T:: *)()const, method>
  43. {
  44. public:
  45. static int invoke(lua_State * L)
  46. {
  47. LuaStack S(L);
  48. const U * obj = nullptr;
  49. if(!S.tryGet(1,obj))
  50. return S.retVoid();
  51. static auto functor = std::mem_fn(method);
  52. S.clear();
  53. functor(obj);
  54. return 0;
  55. }
  56. };
  57. template <typename U, typename T, typename R, typename P1, R(T:: * method)(P1)const>
  58. class LuaMethodWrapper <U, R(T:: *)(P1)const, method>
  59. {
  60. public:
  61. static int invoke(lua_State * L)
  62. {
  63. LuaStack S(L);
  64. const U * obj = nullptr;
  65. if(!S.tryGet(1,obj))
  66. return S.retVoid();
  67. P1 p1;
  68. if(!S.tryGet(2, p1))
  69. return S.retVoid();
  70. static auto functor = std::mem_fn(method);
  71. S.clear();
  72. S.push(functor(obj, p1));
  73. return S.retPushed();
  74. }
  75. };
  76. template <typename U, typename T, typename P1, void(T:: * method)(P1)const>
  77. class LuaMethodWrapper <U, void(T:: *)(P1)const, method>
  78. {
  79. public:
  80. static int invoke(lua_State * L)
  81. {
  82. LuaStack S(L);
  83. const U * obj = nullptr;
  84. if(!S.tryGet(1,obj))
  85. return S.retVoid();
  86. P1 p1;
  87. if(!S.tryGet(2, p1))
  88. return S.retVoid();
  89. static auto functor = std::mem_fn(method);
  90. S.clear();
  91. functor(obj, p1);
  92. return 0;
  93. }
  94. };
  95. template <typename U, typename T, typename R, typename P1, typename P2, R(T:: * method)(P1, P2)const>
  96. class LuaMethodWrapper <U, R(T:: *)(P1, P2)const, method>
  97. {
  98. public:
  99. static int invoke(lua_State * L)
  100. {
  101. LuaStack S(L);
  102. const U * obj = nullptr;
  103. if(!S.tryGet(1, obj))
  104. return S.retVoid();
  105. P1 p1;
  106. if(!S.tryGet(2, p1))
  107. return S.retVoid();
  108. P2 p2;
  109. if(!S.tryGet(3, p2))
  110. return S.retVoid();
  111. static auto functor = std::mem_fn(method);
  112. S.clear();
  113. S.push(functor(obj, p1, p2));
  114. return S.retPushed();
  115. }
  116. };
  117. template <typename U, typename T, typename P1, typename P2, void(T:: * method)(P1, P2)const>
  118. class LuaMethodWrapper <U, void(T:: *)(P1, P2)const, method>
  119. {
  120. public:
  121. static int invoke(lua_State * L)
  122. {
  123. LuaStack S(L);
  124. const U * obj = nullptr;
  125. if(!S.tryGet(1, obj))
  126. return S.retVoid();
  127. P1 p1;
  128. if(!S.tryGet(2, p1))
  129. return S.retVoid();
  130. P2 p2;
  131. if(!S.tryGet(3, p2))
  132. return S.retVoid();
  133. static auto functor = std::mem_fn(method);
  134. S.clear();
  135. functor(obj, p1, p2);
  136. return 0;
  137. }
  138. };
  139. //deprecated, should use LuaMethodWrapper instead, once implemented
  140. template <typename T>
  141. class LuaCallWrapper
  142. {
  143. public:
  144. using Wrapped = typename std::remove_const<T>::type;
  145. static std::function<int(lua_State *, T *)> createFunctor(void (Wrapped::* method)())
  146. {
  147. auto functor = std::mem_fn(method);
  148. auto ret = [=](lua_State * L, T * object)->int
  149. {
  150. LuaStack S(L);
  151. functor(object);
  152. return S.retVoid();
  153. };
  154. return ret;
  155. }
  156. static std::function<int(lua_State *, T *)> createFunctor(void (Wrapped::* method)() const)
  157. {
  158. auto functor = std::mem_fn(method);
  159. auto ret = [=](lua_State * L, T * object)->int
  160. {
  161. LuaStack S(L);
  162. functor(object);
  163. return S.retVoid();
  164. };
  165. return ret;
  166. }
  167. template <typename R>
  168. static std::function<int(lua_State *, T *)> createFunctor(R (Wrapped::* method)())
  169. {
  170. auto functor = std::mem_fn(method);
  171. auto ret = [=](lua_State * L, T * object)->int
  172. {
  173. LuaStack S(L);
  174. S.clear();
  175. S.push(functor(object));
  176. return S.retPushed();
  177. };
  178. return ret;
  179. }
  180. template <typename R>
  181. static std::function<int(lua_State *, T *)> createFunctor(R (Wrapped::* method)() const)
  182. {
  183. auto functor = std::mem_fn(method);
  184. auto ret = [=](lua_State * L, T * object)->int
  185. {
  186. LuaStack S(L);
  187. S.clear();
  188. S.push(functor(object));
  189. return S.retPushed();
  190. };
  191. return ret;
  192. }
  193. template <typename P1>
  194. static std::function<int(lua_State *, T *)> createFunctor(void (Wrapped::* method)(P1))
  195. {
  196. auto functor = std::mem_fn(method);
  197. auto ret = [=](lua_State * L, T * object)->int
  198. {
  199. LuaStack S(L);
  200. P1 p1;
  201. if(S.tryGet(1, p1))
  202. {
  203. functor(object, p1);
  204. }
  205. return S.retVoid();
  206. };
  207. return ret;
  208. }
  209. template <typename P1>
  210. static std::function<int(lua_State *, T *)> createFunctor(void (Wrapped::* method)(P1) const)
  211. {
  212. auto functor = std::mem_fn(method);
  213. auto ret = [=](lua_State * L, T * object)->int
  214. {
  215. LuaStack S(L);
  216. P1 p1;
  217. if(S.tryGet(1, p1))
  218. {
  219. functor(object, p1);
  220. }
  221. return S.retVoid();
  222. };
  223. return ret;
  224. }
  225. template <typename R, typename P1>
  226. static std::function<int(lua_State *, T *)> createFunctor(R (Wrapped::* method)(P1))
  227. {
  228. auto functor = std::mem_fn(method);
  229. auto ret = [=](lua_State * L, T * object)->int
  230. {
  231. LuaStack S(L);
  232. P1 p1;
  233. if(S.tryGet(1, p1))
  234. {
  235. S.push(functor(object, p1));
  236. return 1;
  237. }
  238. return S.retVoid();
  239. };
  240. return ret;
  241. }
  242. template <typename R, typename P1>
  243. static std::function<int(lua_State *, T *)> createFunctor(R (Wrapped::* method)(P1) const)
  244. {
  245. auto functor = std::mem_fn(method);
  246. auto ret = [=](lua_State * L, T * object)->int
  247. {
  248. LuaStack S(L);
  249. P1 p1;
  250. if(S.tryGet(1, p1))
  251. {
  252. S.push(functor(object, p1));
  253. return 1;
  254. }
  255. return S.retVoid();
  256. };
  257. return ret;
  258. }
  259. };
  260. }