method_ptrcall.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. #ifndef METHOD_PTRCALL_H
  2. #define METHOD_PTRCALL_H
  3. #include "math_2d.h"
  4. #include "typedefs.h"
  5. #include "variant.h"
  6. #ifdef PTRCALL_ENABLED
  7. template <class T>
  8. struct PtrToArg {
  9. };
  10. #define MAKE_PTRARG(m_type) \
  11. template <> \
  12. struct PtrToArg<m_type> { \
  13. _FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
  14. return *reinterpret_cast<const m_type *>(p_ptr); \
  15. } \
  16. _FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
  17. *((m_type *)p_ptr) = p_val; \
  18. } \
  19. }; \
  20. template <> \
  21. struct PtrToArg<const m_type &> { \
  22. _FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
  23. return *reinterpret_cast<const m_type *>(p_ptr); \
  24. } \
  25. _FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
  26. *((m_type *)p_ptr) = p_val; \
  27. } \
  28. }
  29. #define MAKE_PTRARGR(m_type, m_ret) \
  30. template <> \
  31. struct PtrToArg<m_type> { \
  32. _FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
  33. return *reinterpret_cast<const m_type *>(p_ptr); \
  34. } \
  35. _FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
  36. *((m_ret *)p_ptr) = p_val; \
  37. } \
  38. }; \
  39. template <> \
  40. struct PtrToArg<const m_type &> { \
  41. _FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
  42. return *reinterpret_cast<const m_type *>(p_ptr); \
  43. } \
  44. _FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
  45. *((m_ret *)p_ptr) = p_val; \
  46. } \
  47. }
  48. MAKE_PTRARG(bool);
  49. MAKE_PTRARGR(uint8_t, int);
  50. MAKE_PTRARGR(int8_t, int);
  51. MAKE_PTRARGR(uint16_t, int);
  52. MAKE_PTRARGR(int16_t, int);
  53. MAKE_PTRARGR(uint32_t, int);
  54. MAKE_PTRARGR(int32_t, int);
  55. MAKE_PTRARGR(int64_t, int);
  56. MAKE_PTRARGR(uint64_t, int);
  57. MAKE_PTRARG(float);
  58. MAKE_PTRARGR(double, float);
  59. MAKE_PTRARG(String);
  60. MAKE_PTRARG(Vector2);
  61. MAKE_PTRARG(Rect2);
  62. MAKE_PTRARG(Vector3);
  63. MAKE_PTRARG(Matrix32);
  64. MAKE_PTRARG(Plane);
  65. MAKE_PTRARG(Quat);
  66. MAKE_PTRARG(AABB);
  67. MAKE_PTRARG(Matrix3);
  68. MAKE_PTRARG(Transform);
  69. MAKE_PTRARG(Color);
  70. MAKE_PTRARG(Image);
  71. MAKE_PTRARG(NodePath);
  72. MAKE_PTRARG(RID);
  73. MAKE_PTRARG(InputEvent);
  74. MAKE_PTRARG(Dictionary);
  75. MAKE_PTRARG(Array);
  76. MAKE_PTRARG(ByteArray);
  77. MAKE_PTRARG(IntArray);
  78. MAKE_PTRARG(RealArray);
  79. MAKE_PTRARG(StringArray);
  80. MAKE_PTRARG(Vector2Array);
  81. MAKE_PTRARG(Vector3Array);
  82. MAKE_PTRARG(ColorArray);
  83. MAKE_PTRARG(Variant);
  84. //this is for Object
  85. template <class T>
  86. struct PtrToArg<T *> {
  87. _FORCE_INLINE_ static T *convert(const void *p_ptr) {
  88. return const_cast<T *>(reinterpret_cast<const T *>(p_ptr));
  89. }
  90. _FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) {
  91. *((T **)p_ptr) = p_var;
  92. }
  93. };
  94. template <class T>
  95. struct PtrToArg<const T *> {
  96. _FORCE_INLINE_ static const T *convert(const void *p_ptr) {
  97. return reinterpret_cast<const T *>(p_ptr);
  98. }
  99. _FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) {
  100. *((T **)p_ptr) = p_var;
  101. }
  102. };
  103. //this is for the special cases used by Variant
  104. #define MAKE_VECARG(m_type) \
  105. template <> \
  106. struct PtrToArg<Vector<m_type> > { \
  107. _FORCE_INLINE_ static Vector<m_type> convert(const void *p_ptr) { \
  108. const DVector<m_type> *dvs = reinterpret_cast<const DVector<m_type> *>(p_ptr); \
  109. Vector<m_type> ret; \
  110. int len = dvs->size(); \
  111. ret.resize(len); \
  112. { \
  113. DVector<m_type>::Read r = dvs->read(); \
  114. for (int i = 0; i < len; i++) { \
  115. ret[i] = r[i]; \
  116. } \
  117. } \
  118. return ret; \
  119. } \
  120. _FORCE_INLINE_ static void encode(Vector<m_type> p_vec, void *p_ptr) { \
  121. DVector<m_type> *dv = reinterpret_cast<DVector<m_type> *>(p_ptr); \
  122. int len = p_vec.size(); \
  123. dv->resize(len); \
  124. { \
  125. DVector<m_type>::Write w = dv->write(); \
  126. for (int i = 0; i < len; i++) { \
  127. w[i] = p_vec[i]; \
  128. } \
  129. } \
  130. } \
  131. }; \
  132. template <> \
  133. struct PtrToArg<const Vector<m_type> &> { \
  134. _FORCE_INLINE_ static Vector<m_type> convert(const void *p_ptr) { \
  135. const DVector<m_type> *dvs = reinterpret_cast<const DVector<m_type> *>(p_ptr); \
  136. Vector<m_type> ret; \
  137. int len = dvs->size(); \
  138. ret.resize(len); \
  139. { \
  140. DVector<m_type>::Read r = dvs->read(); \
  141. for (int i = 0; i < len; i++) { \
  142. ret[i] = r[i]; \
  143. } \
  144. } \
  145. return ret; \
  146. } \
  147. }
  148. MAKE_VECARG(String);
  149. MAKE_VECARG(uint8_t);
  150. MAKE_VECARG(int);
  151. MAKE_VECARG(float);
  152. MAKE_VECARG(Vector2);
  153. MAKE_VECARG(Vector3);
  154. MAKE_VECARG(Color);
  155. //for stuff that gets converted to Array vectors
  156. #define MAKE_VECARR(m_type) \
  157. template <> \
  158. struct PtrToArg<Vector<m_type> > { \
  159. _FORCE_INLINE_ static Vector<m_type> convert(const void *p_ptr) { \
  160. const Array *arr = reinterpret_cast<const Array *>(p_ptr); \
  161. Vector<m_type> ret; \
  162. int len = arr->size(); \
  163. ret.resize(len); \
  164. for (int i = 0; i < len; i++) { \
  165. ret[i] = (*arr)[i]; \
  166. } \
  167. return ret; \
  168. } \
  169. _FORCE_INLINE_ static void encode(Vector<m_type> p_vec, void *p_ptr) { \
  170. Array *arr = reinterpret_cast<Array *>(p_ptr); \
  171. int len = p_vec.size(); \
  172. arr->resize(len); \
  173. for (int i = 0; i < len; i++) { \
  174. (*arr)[i] = p_vec[i]; \
  175. } \
  176. } \
  177. }; \
  178. template <> \
  179. struct PtrToArg<const Vector<m_type> &> { \
  180. _FORCE_INLINE_ static Vector<m_type> convert(const void *p_ptr) { \
  181. const Array *arr = reinterpret_cast<const Array *>(p_ptr); \
  182. Vector<m_type> ret; \
  183. int len = arr->size(); \
  184. ret.resize(len); \
  185. for (int i = 0; i < len; i++) { \
  186. ret[i] = (*arr)[i]; \
  187. } \
  188. return ret; \
  189. } \
  190. }
  191. MAKE_VECARR(Variant);
  192. MAKE_VECARR(RID);
  193. MAKE_VECARR(Plane);
  194. #define MAKE_DVECARR(m_type) \
  195. template <> \
  196. struct PtrToArg<DVector<m_type> > { \
  197. _FORCE_INLINE_ static DVector<m_type> convert(const void *p_ptr) { \
  198. const Array *arr = reinterpret_cast<const Array *>(p_ptr); \
  199. DVector<m_type> ret; \
  200. int len = arr->size(); \
  201. ret.resize(len); \
  202. { \
  203. DVector<m_type>::Write w = ret.write(); \
  204. for (int i = 0; i < len; i++) { \
  205. w[i] = (*arr)[i]; \
  206. } \
  207. } \
  208. return ret; \
  209. } \
  210. _FORCE_INLINE_ static void encode(DVector<m_type> p_vec, void *p_ptr) { \
  211. Array *arr = reinterpret_cast<Array *>(p_ptr); \
  212. int len = p_vec.size(); \
  213. arr->resize(len); \
  214. { \
  215. DVector<m_type>::Read r = p_vec.read(); \
  216. for (int i = 0; i < len; i++) { \
  217. (*arr)[i] = r[i]; \
  218. } \
  219. } \
  220. } \
  221. }; \
  222. template <> \
  223. struct PtrToArg<const DVector<m_type> &> { \
  224. _FORCE_INLINE_ static DVector<m_type> convert(const void *p_ptr) { \
  225. const Array *arr = reinterpret_cast<const Array *>(p_ptr); \
  226. DVector<m_type> ret; \
  227. int len = arr->size(); \
  228. ret.resize(len); \
  229. { \
  230. DVector<m_type>::Write w = ret.write(); \
  231. for (int i = 0; i < len; i++) { \
  232. w[i] = (*arr)[i]; \
  233. } \
  234. } \
  235. return ret; \
  236. } \
  237. }
  238. MAKE_DVECARR(Plane);
  239. //for special case StringName
  240. #define MAKE_STRINGCONV(m_type) \
  241. template <> \
  242. struct PtrToArg<m_type> { \
  243. _FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
  244. m_type s = *reinterpret_cast<const String *>(p_ptr); \
  245. return s; \
  246. } \
  247. _FORCE_INLINE_ static void encode(m_type p_vec, void *p_ptr) { \
  248. String *arr = reinterpret_cast<String *>(p_ptr); \
  249. *arr = p_vec; \
  250. } \
  251. }; \
  252. \
  253. template <> \
  254. struct PtrToArg<const m_type &> { \
  255. _FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
  256. m_type s = *reinterpret_cast<const String *>(p_ptr); \
  257. return s; \
  258. } \
  259. }
  260. MAKE_STRINGCONV(StringName);
  261. MAKE_STRINGCONV(IP_Address);
  262. template <>
  263. struct PtrToArg<DVector<Face3> > {
  264. _FORCE_INLINE_ static DVector<Face3> convert(const void *p_ptr) {
  265. const DVector<Vector3> *dvs = reinterpret_cast<const DVector<Vector3> *>(p_ptr);
  266. DVector<Face3> ret;
  267. int len = dvs->size() / 3;
  268. ret.resize(len);
  269. {
  270. DVector<Vector3>::Read r = dvs->read();
  271. DVector<Face3>::Write w = ret.write();
  272. for (int i = 0; i < len; i++) {
  273. w[i].vertex[0] = r[i * 3 + 0];
  274. w[i].vertex[1] = r[i * 3 + 1];
  275. w[i].vertex[2] = r[i * 3 + 2];
  276. }
  277. }
  278. return ret;
  279. }
  280. _FORCE_INLINE_ static void encode(DVector<Face3> p_vec, void *p_ptr) {
  281. DVector<Vector3> *arr = reinterpret_cast<DVector<Vector3> *>(p_ptr);
  282. int len = p_vec.size();
  283. arr->resize(len * 3);
  284. {
  285. DVector<Face3>::Read r = p_vec.read();
  286. DVector<Vector3>::Write w = arr->write();
  287. for (int i = 0; i < len; i++) {
  288. w[i * 3 + 0] = r[i].vertex[0];
  289. w[i * 3 + 1] = r[i].vertex[1];
  290. w[i * 3 + 2] = r[i].vertex[2];
  291. }
  292. }
  293. }
  294. };
  295. template <>
  296. struct PtrToArg<const DVector<Face3> &> {
  297. _FORCE_INLINE_ static DVector<Face3> convert(const void *p_ptr) {
  298. const DVector<Vector3> *dvs = reinterpret_cast<const DVector<Vector3> *>(p_ptr);
  299. DVector<Face3> ret;
  300. int len = dvs->size() / 3;
  301. ret.resize(len);
  302. {
  303. DVector<Vector3>::Read r = dvs->read();
  304. DVector<Face3>::Write w = ret.write();
  305. for (int i = 0; i < len; i++) {
  306. w[i].vertex[0] = r[i * 3 + 0];
  307. w[i].vertex[1] = r[i * 3 + 1];
  308. w[i].vertex[2] = r[i * 3 + 2];
  309. }
  310. }
  311. return ret;
  312. }
  313. };
  314. #endif // METHOD_PTRCALL_H
  315. #endif