variant_op.h 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438
  1. /*************************************************************************/
  2. /* variant_op.h */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #ifndef VARIANT_OP_H
  31. #define VARIANT_OP_H
  32. #include "variant.h"
  33. #include "core/core_string_names.h"
  34. #include "core/debugger/engine_debugger.h"
  35. #include "core/object/class_db.h"
  36. template <class R, class A, class B>
  37. class OperatorEvaluatorAdd {
  38. public:
  39. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  40. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  41. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  42. *r_ret = a + b;
  43. r_valid = true;
  44. }
  45. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  46. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) + *VariantGetInternalPtr<B>::get_ptr(right);
  47. }
  48. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  49. PtrToArg<R>::encode(PtrToArg<A>::convert(left) + PtrToArg<B>::convert(right), r_ret);
  50. }
  51. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  52. };
  53. template <class R, class A, class B>
  54. class OperatorEvaluatorSub {
  55. public:
  56. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  57. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  58. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  59. *r_ret = a - b;
  60. r_valid = true;
  61. }
  62. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  63. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) - *VariantGetInternalPtr<B>::get_ptr(right);
  64. }
  65. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  66. PtrToArg<R>::encode(PtrToArg<A>::convert(left) - PtrToArg<B>::convert(right), r_ret);
  67. }
  68. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  69. };
  70. template <class R, class A, class B>
  71. class OperatorEvaluatorMul {
  72. public:
  73. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  74. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  75. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  76. *r_ret = a * b;
  77. r_valid = true;
  78. }
  79. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  80. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) * *VariantGetInternalPtr<B>::get_ptr(right);
  81. }
  82. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  83. PtrToArg<R>::encode(PtrToArg<A>::convert(left) * PtrToArg<B>::convert(right), r_ret);
  84. }
  85. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  86. };
  87. template <class R, class A, class B>
  88. class OperatorEvaluatorXForm {
  89. public:
  90. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  91. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  92. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  93. *r_ret = a.xform(b);
  94. r_valid = true;
  95. }
  96. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  97. *VariantGetInternalPtr<R>::get_ptr(r_ret) = VariantGetInternalPtr<A>::get_ptr(left)->xform(*VariantGetInternalPtr<B>::get_ptr(right));
  98. }
  99. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  100. PtrToArg<R>::encode(PtrToArg<A>::convert(left).xform(PtrToArg<B>::convert(right)), r_ret);
  101. }
  102. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  103. };
  104. template <class R, class A, class B>
  105. class OperatorEvaluatorXFormInv {
  106. public:
  107. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  108. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  109. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  110. *r_ret = b.xform_inv(a);
  111. r_valid = true;
  112. }
  113. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  114. *VariantGetInternalPtr<R>::get_ptr(r_ret) = VariantGetInternalPtr<B>::get_ptr(right)->xform_inv(*VariantGetInternalPtr<A>::get_ptr(left));
  115. }
  116. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  117. PtrToArg<R>::encode(PtrToArg<B>::convert(right).xform_inv(PtrToArg<A>::convert(left)), r_ret);
  118. }
  119. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  120. };
  121. template <class R, class A, class B>
  122. class OperatorEvaluatorDiv {
  123. public:
  124. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  125. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  126. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  127. *r_ret = a / b;
  128. r_valid = true;
  129. }
  130. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  131. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) / *VariantGetInternalPtr<B>::get_ptr(right);
  132. }
  133. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  134. PtrToArg<R>::encode(PtrToArg<A>::convert(left) / PtrToArg<B>::convert(right), r_ret);
  135. }
  136. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  137. };
  138. template <class R, class A, class B>
  139. class OperatorEvaluatorDivNZ {
  140. public:
  141. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  142. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  143. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  144. if (b == 0) {
  145. r_valid = false;
  146. *r_ret = "Division by zero error";
  147. return;
  148. }
  149. *r_ret = a / b;
  150. r_valid = true;
  151. }
  152. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  153. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) / *VariantGetInternalPtr<B>::get_ptr(right);
  154. }
  155. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  156. PtrToArg<R>::encode(PtrToArg<A>::convert(left) / PtrToArg<B>::convert(right), r_ret);
  157. }
  158. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  159. };
  160. template <>
  161. class OperatorEvaluatorDivNZ<Vector2i, Vector2i, Vector2i> {
  162. public:
  163. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  164. const Vector2i &a = *VariantGetInternalPtr<Vector2i>::get_ptr(&p_left);
  165. const Vector2i &b = *VariantGetInternalPtr<Vector2i>::get_ptr(&p_right);
  166. if (unlikely(b.x == 0 || b.y == 0)) {
  167. r_valid = false;
  168. *r_ret = "Division by zero error";
  169. return;
  170. }
  171. *r_ret = a / b;
  172. r_valid = true;
  173. }
  174. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  175. VariantTypeChanger<Vector2i>::change(r_ret);
  176. *VariantGetInternalPtr<Vector2i>::get_ptr(r_ret) = *VariantGetInternalPtr<Vector2i>::get_ptr(left) / *VariantGetInternalPtr<Vector2i>::get_ptr(right);
  177. }
  178. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  179. PtrToArg<Vector2i>::encode(PtrToArg<Vector2i>::convert(left) / PtrToArg<Vector2i>::convert(right), r_ret);
  180. }
  181. static Variant::Type get_return_type() { return GetTypeInfo<Vector2i>::VARIANT_TYPE; }
  182. };
  183. template <>
  184. class OperatorEvaluatorDivNZ<Vector3i, Vector3i, Vector3i> {
  185. public:
  186. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  187. const Vector3i &a = *VariantGetInternalPtr<Vector3i>::get_ptr(&p_left);
  188. const Vector3i &b = *VariantGetInternalPtr<Vector3i>::get_ptr(&p_right);
  189. if (unlikely(b.x == 0 || b.y == 0 || b.z == 0)) {
  190. r_valid = false;
  191. *r_ret = "Division by zero error";
  192. return;
  193. }
  194. *r_ret = a / b;
  195. r_valid = true;
  196. }
  197. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  198. VariantTypeChanger<Vector3i>::change(r_ret);
  199. *VariantGetInternalPtr<Vector3i>::get_ptr(r_ret) = *VariantGetInternalPtr<Vector3i>::get_ptr(left) / *VariantGetInternalPtr<Vector3i>::get_ptr(right);
  200. }
  201. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  202. PtrToArg<Vector3i>::encode(PtrToArg<Vector3i>::convert(left) / PtrToArg<Vector3i>::convert(right), r_ret);
  203. }
  204. static Variant::Type get_return_type() { return GetTypeInfo<Vector3i>::VARIANT_TYPE; }
  205. };
  206. template <class R, class A, class B>
  207. class OperatorEvaluatorMod {
  208. public:
  209. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  210. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  211. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  212. *r_ret = a % b;
  213. r_valid = true;
  214. }
  215. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  216. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) % *VariantGetInternalPtr<B>::get_ptr(right);
  217. }
  218. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  219. PtrToArg<R>::encode(PtrToArg<A>::convert(left) % PtrToArg<B>::convert(right), r_ret);
  220. }
  221. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  222. };
  223. template <class R, class A, class B>
  224. class OperatorEvaluatorModNZ {
  225. public:
  226. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  227. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  228. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  229. if (b == 0) {
  230. r_valid = false;
  231. *r_ret = "Module by zero error";
  232. return;
  233. }
  234. *r_ret = a % b;
  235. r_valid = true;
  236. }
  237. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  238. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) % *VariantGetInternalPtr<B>::get_ptr(right);
  239. }
  240. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  241. PtrToArg<R>::encode(PtrToArg<A>::convert(left) % PtrToArg<B>::convert(right), r_ret);
  242. }
  243. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  244. };
  245. template <>
  246. class OperatorEvaluatorModNZ<Vector2i, Vector2i, Vector2i> {
  247. public:
  248. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  249. const Vector2i &a = *VariantGetInternalPtr<Vector2i>::get_ptr(&p_left);
  250. const Vector2i &b = *VariantGetInternalPtr<Vector2i>::get_ptr(&p_right);
  251. if (unlikely(b.x == 0 || b.y == 0)) {
  252. r_valid = false;
  253. *r_ret = "Module by zero error";
  254. return;
  255. }
  256. *r_ret = a % b;
  257. r_valid = true;
  258. }
  259. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  260. VariantTypeChanger<Vector2i>::change(r_ret);
  261. *VariantGetInternalPtr<Vector2i>::get_ptr(r_ret) = *VariantGetInternalPtr<Vector2i>::get_ptr(left) % *VariantGetInternalPtr<Vector2i>::get_ptr(right);
  262. }
  263. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  264. PtrToArg<Vector2i>::encode(PtrToArg<Vector2i>::convert(left) / PtrToArg<Vector2i>::convert(right), r_ret);
  265. }
  266. static Variant::Type get_return_type() { return GetTypeInfo<Vector2i>::VARIANT_TYPE; }
  267. };
  268. template <>
  269. class OperatorEvaluatorModNZ<Vector3i, Vector3i, Vector3i> {
  270. public:
  271. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  272. const Vector3i &a = *VariantGetInternalPtr<Vector3i>::get_ptr(&p_left);
  273. const Vector3i &b = *VariantGetInternalPtr<Vector3i>::get_ptr(&p_right);
  274. if (unlikely(b.x == 0 || b.y == 0 || b.z == 0)) {
  275. r_valid = false;
  276. *r_ret = "Module by zero error";
  277. return;
  278. }
  279. *r_ret = a % b;
  280. r_valid = true;
  281. }
  282. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  283. VariantTypeChanger<Vector3i>::change(r_ret);
  284. *VariantGetInternalPtr<Vector3i>::get_ptr(r_ret) = *VariantGetInternalPtr<Vector3i>::get_ptr(left) % *VariantGetInternalPtr<Vector3i>::get_ptr(right);
  285. }
  286. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  287. PtrToArg<Vector3i>::encode(PtrToArg<Vector3i>::convert(left) % PtrToArg<Vector3i>::convert(right), r_ret);
  288. }
  289. static Variant::Type get_return_type() { return GetTypeInfo<Vector3i>::VARIANT_TYPE; }
  290. };
  291. template <class R, class A>
  292. class OperatorEvaluatorNeg {
  293. public:
  294. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  295. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  296. *r_ret = -a;
  297. r_valid = true;
  298. }
  299. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  300. *VariantGetInternalPtr<R>::get_ptr(r_ret) = -*VariantGetInternalPtr<A>::get_ptr(left);
  301. }
  302. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  303. PtrToArg<R>::encode(-PtrToArg<A>::convert(left), r_ret);
  304. }
  305. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  306. };
  307. template <class R, class A>
  308. class OperatorEvaluatorPos {
  309. public:
  310. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  311. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  312. *r_ret = a;
  313. r_valid = true;
  314. }
  315. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  316. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left);
  317. }
  318. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  319. PtrToArg<R>::encode(PtrToArg<A>::convert(left), r_ret);
  320. }
  321. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  322. };
  323. template <class R, class A, class B>
  324. class OperatorEvaluatorShiftLeft {
  325. public:
  326. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  327. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  328. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  329. #if defined(DEBUG_ENABLED)
  330. if (b < 0 || a < 0) {
  331. *r_ret = "Invalid operands for bit shifting. Only positive operands are supported.";
  332. r_valid = false;
  333. return;
  334. }
  335. #endif
  336. *r_ret = a << b;
  337. r_valid = true;
  338. }
  339. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  340. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) << *VariantGetInternalPtr<B>::get_ptr(right);
  341. }
  342. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  343. PtrToArg<R>::encode(PtrToArg<A>::convert(left) << PtrToArg<B>::convert(right), r_ret);
  344. }
  345. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  346. };
  347. template <class R, class A, class B>
  348. class OperatorEvaluatorShiftRight {
  349. public:
  350. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  351. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  352. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  353. #if defined(DEBUG_ENABLED)
  354. if (b < 0 || a < 0) {
  355. *r_ret = "Invalid operands for bit shifting. Only positive operands are supported.";
  356. r_valid = false;
  357. return;
  358. }
  359. #endif
  360. *r_ret = a >> b;
  361. r_valid = true;
  362. }
  363. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  364. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) >> *VariantGetInternalPtr<B>::get_ptr(right);
  365. }
  366. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  367. PtrToArg<R>::encode(PtrToArg<A>::convert(left) >> PtrToArg<B>::convert(right), r_ret);
  368. }
  369. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  370. };
  371. template <class R, class A, class B>
  372. class OperatorEvaluatorBitOr {
  373. public:
  374. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  375. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  376. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  377. *r_ret = a | b;
  378. r_valid = true;
  379. }
  380. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  381. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) | *VariantGetInternalPtr<B>::get_ptr(right);
  382. }
  383. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  384. PtrToArg<R>::encode(PtrToArg<A>::convert(left) | PtrToArg<B>::convert(right), r_ret);
  385. }
  386. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  387. };
  388. template <class R, class A, class B>
  389. class OperatorEvaluatorBitAnd {
  390. public:
  391. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  392. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  393. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  394. *r_ret = a & b;
  395. r_valid = true;
  396. }
  397. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  398. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) & *VariantGetInternalPtr<B>::get_ptr(right);
  399. }
  400. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  401. PtrToArg<R>::encode(PtrToArg<A>::convert(left) & PtrToArg<B>::convert(right), r_ret);
  402. }
  403. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  404. };
  405. template <class R, class A, class B>
  406. class OperatorEvaluatorBitXor {
  407. public:
  408. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  409. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  410. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  411. *r_ret = a ^ b;
  412. r_valid = true;
  413. }
  414. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  415. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) ^ *VariantGetInternalPtr<B>::get_ptr(right);
  416. }
  417. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  418. PtrToArg<R>::encode(PtrToArg<A>::convert(left) ^ PtrToArg<B>::convert(right), r_ret);
  419. }
  420. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  421. };
  422. template <class R, class A>
  423. class OperatorEvaluatorBitNeg {
  424. public:
  425. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  426. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  427. *r_ret = ~a;
  428. r_valid = true;
  429. }
  430. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  431. *VariantGetInternalPtr<R>::get_ptr(r_ret) = ~*VariantGetInternalPtr<A>::get_ptr(left);
  432. }
  433. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  434. PtrToArg<R>::encode(~PtrToArg<A>::convert(left), r_ret);
  435. }
  436. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  437. };
  438. template <class A, class B>
  439. class OperatorEvaluatorEqual {
  440. public:
  441. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  442. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  443. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  444. *r_ret = a == b;
  445. r_valid = true;
  446. }
  447. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  448. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) == *VariantGetInternalPtr<B>::get_ptr(right);
  449. }
  450. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  451. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) == PtrToArg<B>::convert(right), r_ret);
  452. }
  453. static Variant::Type get_return_type() { return Variant::BOOL; }
  454. };
  455. class OperatorEvaluatorEqualObject {
  456. public:
  457. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  458. const Object *a = p_left.get_validated_object();
  459. const Object *b = p_right.get_validated_object();
  460. *r_ret = a == b;
  461. r_valid = true;
  462. }
  463. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  464. const Object *a = left->get_validated_object();
  465. const Object *b = right->get_validated_object();
  466. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a == b;
  467. }
  468. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  469. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) == PtrToArg<Object *>::convert(right), r_ret);
  470. }
  471. static Variant::Type get_return_type() { return Variant::BOOL; }
  472. };
  473. class OperatorEvaluatorEqualObjectNil {
  474. public:
  475. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  476. const Object *a = p_left.get_validated_object();
  477. *r_ret = a == nullptr;
  478. r_valid = true;
  479. }
  480. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  481. const Object *a = left->get_validated_object();
  482. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a == nullptr;
  483. }
  484. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  485. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) == nullptr, r_ret);
  486. }
  487. static Variant::Type get_return_type() { return Variant::BOOL; }
  488. };
  489. class OperatorEvaluatorEqualNilObject {
  490. public:
  491. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  492. const Object *b = p_right.get_validated_object();
  493. *r_ret = nullptr == b;
  494. r_valid = true;
  495. }
  496. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  497. const Object *b = right->get_validated_object();
  498. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = nullptr == b;
  499. }
  500. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  501. PtrToArg<bool>::encode(nullptr == PtrToArg<Object *>::convert(right), r_ret);
  502. }
  503. static Variant::Type get_return_type() { return Variant::BOOL; }
  504. };
  505. template <class A, class B>
  506. class OperatorEvaluatorNotEqual {
  507. public:
  508. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  509. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  510. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  511. *r_ret = a != b;
  512. r_valid = true;
  513. }
  514. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  515. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) != *VariantGetInternalPtr<B>::get_ptr(right);
  516. }
  517. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  518. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) != PtrToArg<B>::convert(right), r_ret);
  519. }
  520. static Variant::Type get_return_type() { return Variant::BOOL; }
  521. };
  522. class OperatorEvaluatorNotEqualObject {
  523. public:
  524. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  525. Object *a = p_left.get_validated_object();
  526. Object *b = p_right.get_validated_object();
  527. *r_ret = a != b;
  528. r_valid = true;
  529. }
  530. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  531. Object *a = left->get_validated_object();
  532. Object *b = right->get_validated_object();
  533. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a != b;
  534. }
  535. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  536. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) != PtrToArg<Object *>::convert(right), r_ret);
  537. }
  538. static Variant::Type get_return_type() { return Variant::BOOL; }
  539. };
  540. class OperatorEvaluatorNotEqualObjectNil {
  541. public:
  542. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  543. Object *a = p_left.get_validated_object();
  544. *r_ret = a != nullptr;
  545. r_valid = true;
  546. }
  547. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  548. Object *a = left->get_validated_object();
  549. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a != nullptr;
  550. }
  551. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  552. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) != nullptr, r_ret);
  553. }
  554. static Variant::Type get_return_type() { return Variant::BOOL; }
  555. };
  556. class OperatorEvaluatorNotEqualNilObject {
  557. public:
  558. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  559. Object *b = p_right.get_validated_object();
  560. *r_ret = nullptr != b;
  561. r_valid = true;
  562. }
  563. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  564. Object *b = right->get_validated_object();
  565. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = nullptr != b;
  566. }
  567. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  568. PtrToArg<bool>::encode(nullptr != PtrToArg<Object *>::convert(right), r_ret);
  569. }
  570. static Variant::Type get_return_type() { return Variant::BOOL; }
  571. };
  572. template <class A, class B>
  573. class OperatorEvaluatorLess {
  574. public:
  575. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  576. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  577. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  578. *r_ret = a < b;
  579. r_valid = true;
  580. }
  581. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  582. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) < *VariantGetInternalPtr<B>::get_ptr(right);
  583. }
  584. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  585. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) < PtrToArg<B>::convert(right), r_ret);
  586. }
  587. static Variant::Type get_return_type() { return Variant::BOOL; }
  588. };
  589. template <class A, class B>
  590. class OperatorEvaluatorLessEqual {
  591. public:
  592. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  593. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  594. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  595. *r_ret = a <= b;
  596. r_valid = true;
  597. }
  598. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  599. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) <= *VariantGetInternalPtr<B>::get_ptr(right);
  600. }
  601. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  602. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) <= PtrToArg<B>::convert(right), r_ret);
  603. }
  604. static Variant::Type get_return_type() { return Variant::BOOL; }
  605. };
  606. template <class A, class B>
  607. class OperatorEvaluatorGreater {
  608. public:
  609. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  610. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  611. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  612. *r_ret = a > b;
  613. r_valid = true;
  614. }
  615. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  616. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) > *VariantGetInternalPtr<B>::get_ptr(right);
  617. }
  618. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  619. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) > PtrToArg<B>::convert(right), r_ret);
  620. }
  621. static Variant::Type get_return_type() { return Variant::BOOL; }
  622. };
  623. template <class A, class B>
  624. class OperatorEvaluatorGreaterEqual {
  625. public:
  626. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  627. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  628. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  629. *r_ret = a >= b;
  630. r_valid = true;
  631. }
  632. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  633. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) >= *VariantGetInternalPtr<B>::get_ptr(right);
  634. }
  635. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  636. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) >= PtrToArg<B>::convert(right), r_ret);
  637. }
  638. static Variant::Type get_return_type() { return Variant::BOOL; }
  639. };
  640. template <class A, class B>
  641. class OperatorEvaluatorAnd {
  642. public:
  643. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  644. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  645. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  646. *r_ret = a && b;
  647. r_valid = true;
  648. }
  649. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  650. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) && *VariantGetInternalPtr<B>::get_ptr(right);
  651. }
  652. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  653. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) && PtrToArg<B>::convert(right), r_ret);
  654. }
  655. static Variant::Type get_return_type() { return Variant::BOOL; }
  656. };
  657. template <class A, class B>
  658. class OperatorEvaluatorOr {
  659. public:
  660. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  661. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  662. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  663. *r_ret = a || b;
  664. r_valid = true;
  665. }
  666. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  667. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) || *VariantGetInternalPtr<B>::get_ptr(right);
  668. }
  669. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  670. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) || PtrToArg<B>::convert(right), r_ret);
  671. }
  672. static Variant::Type get_return_type() { return Variant::BOOL; }
  673. };
  674. #define XOR_OP(m_a, m_b) (((m_a) || (m_b)) && !((m_a) && (m_b)))
  675. template <class A, class B>
  676. class OperatorEvaluatorXor {
  677. public:
  678. _FORCE_INLINE_ static bool xor_op(const A &a, const B &b) {
  679. return ((a) || (b)) && !((a) && (b));
  680. }
  681. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  682. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  683. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  684. *r_ret = xor_op(a, b);
  685. r_valid = true;
  686. }
  687. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  688. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = xor_op(*VariantGetInternalPtr<A>::get_ptr(left), *VariantGetInternalPtr<B>::get_ptr(right));
  689. }
  690. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  691. PtrToArg<bool>::encode(xor_op(PtrToArg<A>::convert(left), PtrToArg<B>::convert(right)), r_ret);
  692. }
  693. static Variant::Type get_return_type() { return Variant::BOOL; }
  694. };
  695. template <class A>
  696. class OperatorEvaluatorNot {
  697. public:
  698. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  699. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  700. *r_ret = !a;
  701. r_valid = true;
  702. }
  703. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  704. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<A>::get_ptr(left);
  705. }
  706. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  707. PtrToArg<bool>::encode(!PtrToArg<A>::convert(left));
  708. }
  709. static Variant::Type get_return_type() { return Variant::BOOL; }
  710. };
  711. //// CUSTOM ////
  712. class OperatorEvaluatorAddArray {
  713. public:
  714. _FORCE_INLINE_ static void _add_arrays(Array &sum, const Array &array_a, const Array &array_b) {
  715. int asize = array_a.size();
  716. int bsize = array_b.size();
  717. sum.resize(asize + bsize);
  718. for (int i = 0; i < asize; i++) {
  719. sum[i] = array_a[i];
  720. }
  721. for (int i = 0; i < bsize; i++) {
  722. sum[i + asize] = array_b[i];
  723. }
  724. }
  725. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  726. const Array &array_a = *VariantGetInternalPtr<Array>::get_ptr(&p_left);
  727. const Array &array_b = *VariantGetInternalPtr<Array>::get_ptr(&p_right);
  728. Array sum;
  729. _add_arrays(sum, array_a, array_b);
  730. *r_ret = sum;
  731. r_valid = true;
  732. }
  733. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  734. _add_arrays(*VariantGetInternalPtr<Array>::get_ptr(r_ret), *VariantGetInternalPtr<Array>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right));
  735. }
  736. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  737. Array ret;
  738. _add_arrays(ret, PtrToArg<Array>::convert(left), PtrToArg<Array>::convert(right));
  739. PtrToArg<Array>::encode(ret, r_ret);
  740. }
  741. static Variant::Type get_return_type() { return Variant::ARRAY; }
  742. };
  743. template <class T>
  744. class OperatorEvaluatorAppendArray {
  745. public:
  746. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  747. const Vector<T> &array_a = *VariantGetInternalPtr<Vector<T>>::get_ptr(&p_left);
  748. const Vector<T> &array_b = *VariantGetInternalPtr<Vector<T>>::get_ptr(&p_right);
  749. Vector<T> sum = array_a;
  750. sum.append_array(array_b);
  751. *r_ret = sum;
  752. r_valid = true;
  753. }
  754. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  755. *VariantGetInternalPtr<Vector<T>>::get_ptr(r_ret) = *VariantGetInternalPtr<Vector<T>>::get_ptr(left);
  756. VariantGetInternalPtr<Vector<T>>::get_ptr(r_ret)->append_array(*VariantGetInternalPtr<Vector<T>>::get_ptr(right));
  757. }
  758. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  759. Vector<T> sum = PtrToArg<Vector<T>>::convert(left);
  760. sum.append_array(PtrToArg<Vector<T>>::convert(right));
  761. PtrToArg<Vector<T>>::encode(sum, r_ret);
  762. }
  763. static Variant::Type get_return_type() { return GetTypeInfo<Vector<T>>::VARIANT_TYPE; }
  764. };
  765. class OperatorEvaluatorStringModNil {
  766. public:
  767. _FORCE_INLINE_ static String do_mod(const String &s, bool *r_valid) {
  768. Array values;
  769. values.push_back(Variant());
  770. String a = s.sprintf(values, r_valid);
  771. if (r_valid) {
  772. *r_valid = !*r_valid;
  773. }
  774. return a;
  775. }
  776. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  777. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  778. *r_ret = do_mod(a, &r_valid);
  779. r_valid = true;
  780. }
  781. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  782. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), nullptr);
  783. }
  784. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  785. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), nullptr), r_ret);
  786. }
  787. static Variant::Type get_return_type() { return Variant::STRING; }
  788. };
  789. class OperatorEvaluatorStringModArray {
  790. public:
  791. _FORCE_INLINE_ static String do_mod(const String &s, const Array &p_values, bool *r_valid) {
  792. String a = s.sprintf(p_values, r_valid);
  793. if (r_valid) {
  794. *r_valid = !*r_valid;
  795. }
  796. return a;
  797. }
  798. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  799. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  800. *r_ret = do_mod(a, *VariantGetInternalPtr<Array>::get_ptr(&p_right), &r_valid);
  801. r_valid = true;
  802. }
  803. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  804. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right), nullptr);
  805. }
  806. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  807. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<Array>::convert(right), nullptr), r_ret);
  808. }
  809. static Variant::Type get_return_type() { return Variant::STRING; }
  810. };
  811. class OperatorEvaluatorStringModObject {
  812. public:
  813. _FORCE_INLINE_ static String do_mod(const String &s, const Object *p_object, bool *r_valid) {
  814. Array values;
  815. values.push_back(p_object);
  816. String a = s.sprintf(values, r_valid);
  817. if (r_valid) {
  818. *r_valid = !*r_valid;
  819. }
  820. return a;
  821. }
  822. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  823. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  824. *r_ret = do_mod(a, p_right.get_validated_object(), &r_valid);
  825. r_valid = true;
  826. }
  827. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  828. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), right->get_validated_object(), nullptr);
  829. }
  830. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  831. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<Object *>::convert(right), nullptr), r_ret);
  832. }
  833. static Variant::Type get_return_type() { return Variant::STRING; }
  834. };
  835. template <class T>
  836. class OperatorEvaluatorStringModT {
  837. public:
  838. _FORCE_INLINE_ static String do_mod(const String &s, const T &p_value, bool *r_valid) {
  839. Array values;
  840. values.push_back(p_value);
  841. String a = s.sprintf(values, r_valid);
  842. if (r_valid) {
  843. *r_valid = !*r_valid;
  844. }
  845. return a;
  846. }
  847. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  848. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  849. *r_ret = do_mod(a, *VariantGetInternalPtr<T>::get_ptr(&p_right), &r_valid);
  850. r_valid = true;
  851. }
  852. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  853. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), *VariantGetInternalPtr<T>::get_ptr(right), nullptr);
  854. }
  855. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  856. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<T>::convert(right), nullptr), r_ret);
  857. }
  858. static Variant::Type get_return_type() { return Variant::STRING; }
  859. };
  860. template <Variant::Operator op, Variant::Type type_left, Variant::Type type_right>
  861. class OperatorEvaluatorAlwaysTrue {
  862. public:
  863. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  864. *r_ret = true;
  865. r_valid = true;
  866. }
  867. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  868. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = true;
  869. }
  870. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  871. PtrToArg<bool>::encode(true, r_ret);
  872. }
  873. static Variant::Type get_return_type() { return Variant::BOOL; }
  874. };
  875. template <Variant::Operator op, Variant::Type type_left, Variant::Type type_right>
  876. class OperatorEvaluatorAlwaysFalse {
  877. public:
  878. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  879. *r_ret = false;
  880. r_valid = true;
  881. }
  882. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  883. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = false;
  884. }
  885. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  886. PtrToArg<bool>::encode(false, r_ret);
  887. }
  888. static Variant::Type get_return_type() { return Variant::BOOL; }
  889. };
  890. ///// OR ///////
  891. _FORCE_INLINE_ static bool _operate_or(bool p_left, bool p_right) {
  892. return p_left || p_right;
  893. }
  894. _FORCE_INLINE_ static bool _operate_and(bool p_left, bool p_right) {
  895. return p_left && p_right;
  896. }
  897. _FORCE_INLINE_ static bool _operate_xor(bool p_left, bool p_right) {
  898. return (p_left || p_right) && !(p_left && p_right);
  899. }
  900. _FORCE_INLINE_ static bool _operate_get_nil(const Variant *p_ptr) {
  901. return p_ptr->get_validated_object() != nullptr;
  902. }
  903. _FORCE_INLINE_ static bool _operate_get_bool(const Variant *p_ptr) {
  904. return *VariantGetInternalPtr<bool>::get_ptr(p_ptr);
  905. }
  906. _FORCE_INLINE_ static bool _operate_get_int(const Variant *p_ptr) {
  907. return *VariantGetInternalPtr<int64_t>::get_ptr(p_ptr) != 0;
  908. }
  909. _FORCE_INLINE_ static bool _operate_get_float(const Variant *p_ptr) {
  910. return *VariantGetInternalPtr<double>::get_ptr(p_ptr) != 0.0;
  911. }
  912. _FORCE_INLINE_ static bool _operate_get_object(const Variant *p_ptr) {
  913. return p_ptr->get_validated_object() != nullptr;
  914. }
  915. _FORCE_INLINE_ static bool _operate_get_ptr_nil(const void *p_ptr) {
  916. return false;
  917. }
  918. _FORCE_INLINE_ static bool _operate_get_ptr_bool(const void *p_ptr) {
  919. return PtrToArg<bool>::convert(p_ptr);
  920. }
  921. _FORCE_INLINE_ static bool _operate_get_ptr_int(const void *p_ptr) {
  922. return PtrToArg<int64_t>::convert(p_ptr) != 0;
  923. }
  924. _FORCE_INLINE_ static bool _operate_get_ptr_float(const void *p_ptr) {
  925. return PtrToArg<double>::convert(p_ptr) != 0.0;
  926. }
  927. _FORCE_INLINE_ static bool _operate_get_ptr_object(const void *p_ptr) {
  928. return PtrToArg<Object *>::convert(p_ptr) != nullptr;
  929. }
  930. #define OP_EVALUATOR(m_class_name, m_left, m_right, m_op) \
  931. class m_class_name { \
  932. public: \
  933. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { \
  934. *r_ret = m_op(_operate_get_##m_left(&p_left), _operate_get_##m_right(&p_right)); \
  935. r_valid = true; \
  936. } \
  937. \
  938. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { \
  939. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = m_op(_operate_get_##m_left(left), _operate_get_##m_right(right)); \
  940. } \
  941. \
  942. static void ptr_evaluate(const void *left, const void *right, void *r_ret) { \
  943. PtrToArg<bool>::encode(m_op(_operate_get_ptr_##m_left(left), _operate_get_ptr_##m_right(right)), r_ret); \
  944. } \
  945. \
  946. static Variant::Type get_return_type() { \
  947. return Variant::BOOL; \
  948. } \
  949. };
  950. // OR
  951. // nil
  952. OP_EVALUATOR(OperatorEvaluatorNilXBoolOr, nil, bool, _operate_or)
  953. OP_EVALUATOR(OperatorEvaluatorBoolXNilOr, bool, nil, _operate_or)
  954. OP_EVALUATOR(OperatorEvaluatorNilXIntOr, nil, int, _operate_or)
  955. OP_EVALUATOR(OperatorEvaluatorIntXNilOr, int, nil, _operate_or)
  956. OP_EVALUATOR(OperatorEvaluatorNilXFloatOr, nil, float, _operate_or)
  957. OP_EVALUATOR(OperatorEvaluatorFloatXNilOr, float, nil, _operate_or)
  958. OP_EVALUATOR(OperatorEvaluatorObjectXNilOr, object, nil, _operate_or)
  959. OP_EVALUATOR(OperatorEvaluatorNilXObjectOr, nil, object, _operate_or)
  960. // bool
  961. OP_EVALUATOR(OperatorEvaluatorBoolXBoolOr, bool, bool, _operate_or)
  962. OP_EVALUATOR(OperatorEvaluatorBoolXIntOr, bool, int, _operate_or)
  963. OP_EVALUATOR(OperatorEvaluatorIntXBoolOr, int, bool, _operate_or)
  964. OP_EVALUATOR(OperatorEvaluatorBoolXFloatOr, bool, float, _operate_or)
  965. OP_EVALUATOR(OperatorEvaluatorFloatXBoolOr, float, bool, _operate_or)
  966. OP_EVALUATOR(OperatorEvaluatorBoolXObjectOr, bool, object, _operate_or)
  967. OP_EVALUATOR(OperatorEvaluatorObjectXBoolOr, object, bool, _operate_or)
  968. // int
  969. OP_EVALUATOR(OperatorEvaluatorIntXIntOr, int, int, _operate_or)
  970. OP_EVALUATOR(OperatorEvaluatorIntXFloatOr, int, float, _operate_or)
  971. OP_EVALUATOR(OperatorEvaluatorFloatXIntOr, float, int, _operate_or)
  972. OP_EVALUATOR(OperatorEvaluatorIntXObjectOr, int, object, _operate_or)
  973. OP_EVALUATOR(OperatorEvaluatorObjectXIntOr, object, int, _operate_or)
  974. // float
  975. OP_EVALUATOR(OperatorEvaluatorFloatXFloatOr, float, float, _operate_or)
  976. OP_EVALUATOR(OperatorEvaluatorFloatXObjectOr, float, object, _operate_or)
  977. OP_EVALUATOR(OperatorEvaluatorObjectXFloatOr, object, float, _operate_or)
  978. // object
  979. OP_EVALUATOR(OperatorEvaluatorObjectXObjectOr, object, object, _operate_or)
  980. // AND
  981. // nil
  982. OP_EVALUATOR(OperatorEvaluatorNilXBoolAnd, nil, bool, _operate_and)
  983. OP_EVALUATOR(OperatorEvaluatorBoolXNilAnd, bool, nil, _operate_and)
  984. OP_EVALUATOR(OperatorEvaluatorNilXIntAnd, nil, int, _operate_and)
  985. OP_EVALUATOR(OperatorEvaluatorIntXNilAnd, int, nil, _operate_and)
  986. OP_EVALUATOR(OperatorEvaluatorNilXFloatAnd, nil, float, _operate_and)
  987. OP_EVALUATOR(OperatorEvaluatorFloatXNilAnd, float, nil, _operate_and)
  988. OP_EVALUATOR(OperatorEvaluatorObjectXNilAnd, object, nil, _operate_and)
  989. OP_EVALUATOR(OperatorEvaluatorNilXObjectAnd, nil, object, _operate_and)
  990. // bool
  991. OP_EVALUATOR(OperatorEvaluatorBoolXBoolAnd, bool, bool, _operate_and)
  992. OP_EVALUATOR(OperatorEvaluatorBoolXIntAnd, bool, int, _operate_and)
  993. OP_EVALUATOR(OperatorEvaluatorIntXBoolAnd, int, bool, _operate_and)
  994. OP_EVALUATOR(OperatorEvaluatorBoolXFloatAnd, bool, float, _operate_and)
  995. OP_EVALUATOR(OperatorEvaluatorFloatXBoolAnd, float, bool, _operate_and)
  996. OP_EVALUATOR(OperatorEvaluatorBoolXObjectAnd, bool, object, _operate_and)
  997. OP_EVALUATOR(OperatorEvaluatorObjectXBoolAnd, object, bool, _operate_and)
  998. // int
  999. OP_EVALUATOR(OperatorEvaluatorIntXIntAnd, int, int, _operate_and)
  1000. OP_EVALUATOR(OperatorEvaluatorIntXFloatAnd, int, float, _operate_and)
  1001. OP_EVALUATOR(OperatorEvaluatorFloatXIntAnd, float, int, _operate_and)
  1002. OP_EVALUATOR(OperatorEvaluatorIntXObjectAnd, int, object, _operate_and)
  1003. OP_EVALUATOR(OperatorEvaluatorObjectXIntAnd, object, int, _operate_and)
  1004. // float
  1005. OP_EVALUATOR(OperatorEvaluatorFloatXFloatAnd, float, float, _operate_and)
  1006. OP_EVALUATOR(OperatorEvaluatorFloatXObjectAnd, float, object, _operate_and)
  1007. OP_EVALUATOR(OperatorEvaluatorObjectXFloatAnd, object, float, _operate_and)
  1008. // object
  1009. OP_EVALUATOR(OperatorEvaluatorObjectXObjectAnd, object, object, _operate_and)
  1010. // XOR
  1011. // nil
  1012. OP_EVALUATOR(OperatorEvaluatorNilXBoolXor, nil, bool, _operate_xor)
  1013. OP_EVALUATOR(OperatorEvaluatorBoolXNilXor, bool, nil, _operate_xor)
  1014. OP_EVALUATOR(OperatorEvaluatorNilXIntXor, nil, int, _operate_xor)
  1015. OP_EVALUATOR(OperatorEvaluatorIntXNilXor, int, nil, _operate_xor)
  1016. OP_EVALUATOR(OperatorEvaluatorNilXFloatXor, nil, float, _operate_xor)
  1017. OP_EVALUATOR(OperatorEvaluatorFloatXNilXor, float, nil, _operate_xor)
  1018. OP_EVALUATOR(OperatorEvaluatorObjectXNilXor, object, nil, _operate_xor)
  1019. OP_EVALUATOR(OperatorEvaluatorNilXObjectXor, nil, object, _operate_xor)
  1020. // bool
  1021. OP_EVALUATOR(OperatorEvaluatorBoolXBoolXor, bool, bool, _operate_xor)
  1022. OP_EVALUATOR(OperatorEvaluatorBoolXIntXor, bool, int, _operate_xor)
  1023. OP_EVALUATOR(OperatorEvaluatorIntXBoolXor, int, bool, _operate_xor)
  1024. OP_EVALUATOR(OperatorEvaluatorBoolXFloatXor, bool, float, _operate_xor)
  1025. OP_EVALUATOR(OperatorEvaluatorFloatXBoolXor, float, bool, _operate_xor)
  1026. OP_EVALUATOR(OperatorEvaluatorBoolXObjectXor, bool, object, _operate_xor)
  1027. OP_EVALUATOR(OperatorEvaluatorObjectXBoolXor, object, bool, _operate_xor)
  1028. // int
  1029. OP_EVALUATOR(OperatorEvaluatorIntXIntXor, int, int, _operate_xor)
  1030. OP_EVALUATOR(OperatorEvaluatorIntXFloatXor, int, float, _operate_xor)
  1031. OP_EVALUATOR(OperatorEvaluatorFloatXIntXor, float, int, _operate_xor)
  1032. OP_EVALUATOR(OperatorEvaluatorIntXObjectXor, int, object, _operate_xor)
  1033. OP_EVALUATOR(OperatorEvaluatorObjectXIntXor, object, int, _operate_xor)
  1034. // float
  1035. OP_EVALUATOR(OperatorEvaluatorFloatXFloatXor, float, float, _operate_xor)
  1036. OP_EVALUATOR(OperatorEvaluatorFloatXObjectXor, float, object, _operate_xor)
  1037. OP_EVALUATOR(OperatorEvaluatorObjectXFloatXor, object, float, _operate_xor)
  1038. // object
  1039. OP_EVALUATOR(OperatorEvaluatorObjectXObjectXor, object, object, _operate_xor)
  1040. class OperatorEvaluatorNotBool {
  1041. public:
  1042. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1043. *r_ret = !*VariantGetInternalPtr<bool>::get_ptr(&p_left);
  1044. r_valid = true;
  1045. }
  1046. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1047. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<bool>::get_ptr(left);
  1048. }
  1049. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1050. PtrToArg<bool>::encode(!PtrToArg<bool>::convert(left), r_ret);
  1051. }
  1052. static Variant::Type get_return_type() { return Variant::BOOL; }
  1053. };
  1054. class OperatorEvaluatorNotInt {
  1055. public:
  1056. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1057. *r_ret = !*VariantGetInternalPtr<int64_t>::get_ptr(&p_left);
  1058. r_valid = true;
  1059. }
  1060. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1061. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<int64_t>::get_ptr(left);
  1062. }
  1063. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1064. PtrToArg<bool>::encode(!PtrToArg<int64_t>::convert(left), r_ret);
  1065. }
  1066. static Variant::Type get_return_type() { return Variant::BOOL; }
  1067. };
  1068. class OperatorEvaluatorNotFloat {
  1069. public:
  1070. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1071. *r_ret = !*VariantGetInternalPtr<double>::get_ptr(&p_left);
  1072. r_valid = true;
  1073. }
  1074. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1075. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<double>::get_ptr(left);
  1076. }
  1077. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1078. PtrToArg<bool>::encode(!PtrToArg<double>::convert(left), r_ret);
  1079. }
  1080. static Variant::Type get_return_type() { return Variant::BOOL; }
  1081. };
  1082. class OperatorEvaluatorNotObject {
  1083. public:
  1084. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1085. *r_ret = p_left.get_validated_object() == nullptr;
  1086. r_valid = true;
  1087. }
  1088. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1089. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = left->get_validated_object() == nullptr;
  1090. }
  1091. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1092. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) == nullptr, r_ret);
  1093. }
  1094. static Variant::Type get_return_type() { return Variant::BOOL; }
  1095. };
  1096. ////
  1097. template <class Left>
  1098. class OperatorEvaluatorInStringFind {
  1099. public:
  1100. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1101. const Left &str_a = *VariantGetInternalPtr<Left>::get_ptr(&p_left);
  1102. const String &str_b = *VariantGetInternalPtr<String>::get_ptr(&p_right);
  1103. *r_ret = str_b.find(str_a) != -1;
  1104. r_valid = true;
  1105. }
  1106. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1107. const Left &str_a = *VariantGetInternalPtr<Left>::get_ptr(left);
  1108. const String &str_b = *VariantGetInternalPtr<String>::get_ptr(right);
  1109. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = str_b.find(str_a) != -1;
  1110. }
  1111. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1112. PtrToArg<bool>::encode(PtrToArg<String>::convert(right).find(PtrToArg<Left>::convert(left)) != -1, r_ret);
  1113. }
  1114. static Variant::Type get_return_type() { return Variant::BOOL; }
  1115. };
  1116. template <class Left>
  1117. class OperatorEvaluatorInStringNameFind {
  1118. public:
  1119. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1120. const Left &str_a = *VariantGetInternalPtr<Left>::get_ptr(&p_left);
  1121. const String str_b = VariantGetInternalPtr<StringName>::get_ptr(&p_right)->operator String();
  1122. *r_ret = str_b.find(str_a) != -1;
  1123. r_valid = true;
  1124. }
  1125. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1126. const Left &str_a = *VariantGetInternalPtr<Left>::get_ptr(left);
  1127. const String str_b = VariantGetInternalPtr<StringName>::get_ptr(right)->operator String();
  1128. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = str_b.find(str_a) != -1;
  1129. }
  1130. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1131. PtrToArg<bool>::encode(PtrToArg<StringName>::convert(right).operator String().find(PtrToArg<Left>::convert(left)) != -1, r_ret);
  1132. }
  1133. static Variant::Type get_return_type() { return Variant::BOOL; }
  1134. };
  1135. template <class A, class B>
  1136. class OperatorEvaluatorInArrayFind {
  1137. public:
  1138. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1139. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  1140. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  1141. *r_ret = b.find(a) != -1;
  1142. r_valid = true;
  1143. }
  1144. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1145. const A &a = *VariantGetInternalPtr<A>::get_ptr(left);
  1146. const B &b = *VariantGetInternalPtr<B>::get_ptr(right);
  1147. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.find(a) != -1;
  1148. }
  1149. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1150. PtrToArg<bool>::encode(PtrToArg<B>::convert(right).find(PtrToArg<A>::convert(left)) != -1, r_ret);
  1151. }
  1152. static Variant::Type get_return_type() { return Variant::BOOL; }
  1153. };
  1154. class OperatorEvaluatorInArrayFindNil {
  1155. public:
  1156. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1157. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(&p_right);
  1158. *r_ret = b.find(Variant()) != -1;
  1159. r_valid = true;
  1160. }
  1161. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1162. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(right);
  1163. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.find(Variant()) != -1;
  1164. }
  1165. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1166. PtrToArg<bool>::encode(PtrToArg<Array>::convert(right).find(Variant()) != -1, r_ret);
  1167. }
  1168. static Variant::Type get_return_type() { return Variant::BOOL; }
  1169. };
  1170. class OperatorEvaluatorInArrayFindObject {
  1171. public:
  1172. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1173. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(&p_right);
  1174. *r_ret = b.find(p_left) != -1;
  1175. r_valid = true;
  1176. }
  1177. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1178. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(right);
  1179. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.find(*left) != -1;
  1180. }
  1181. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1182. PtrToArg<bool>::encode(PtrToArg<Array>::convert(right).find(PtrToArg<Object *>::convert(left)) != -1, r_ret);
  1183. }
  1184. static Variant::Type get_return_type() { return Variant::BOOL; }
  1185. };
  1186. template <class A>
  1187. class OperatorEvaluatorInDictionaryHas {
  1188. public:
  1189. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1190. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(&p_right);
  1191. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  1192. *r_ret = b.has(a);
  1193. r_valid = true;
  1194. }
  1195. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1196. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(right);
  1197. const A &a = *VariantGetInternalPtr<A>::get_ptr(left);
  1198. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.has(a);
  1199. }
  1200. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1201. PtrToArg<bool>::encode(PtrToArg<Dictionary>::convert(right).has(PtrToArg<A>::convert(left)), r_ret);
  1202. }
  1203. static Variant::Type get_return_type() { return Variant::BOOL; }
  1204. };
  1205. class OperatorEvaluatorInDictionaryHasNil {
  1206. public:
  1207. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1208. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(&p_right);
  1209. *r_ret = b.has(Variant());
  1210. r_valid = true;
  1211. }
  1212. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1213. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(right);
  1214. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.has(Variant());
  1215. }
  1216. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1217. PtrToArg<bool>::encode(PtrToArg<Dictionary>::convert(right).has(Variant()), r_ret);
  1218. }
  1219. static Variant::Type get_return_type() { return Variant::BOOL; }
  1220. };
  1221. class OperatorEvaluatorInDictionaryHasObject {
  1222. public:
  1223. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1224. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(&p_right);
  1225. *r_ret = b.has(p_left);
  1226. r_valid = true;
  1227. }
  1228. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1229. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(right);
  1230. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.has(*left);
  1231. }
  1232. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1233. PtrToArg<bool>::encode(PtrToArg<Dictionary>::convert(right).has(PtrToArg<Object *>::convert(left)), r_ret);
  1234. }
  1235. static Variant::Type get_return_type() { return Variant::BOOL; }
  1236. };
  1237. class OperatorEvaluatorObjectHasPropertyString {
  1238. public:
  1239. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1240. Object *b = p_right.get_validated_object();
  1241. if (!b) {
  1242. *r_ret = "Invalid base object for 'in'";
  1243. r_valid = false;
  1244. return;
  1245. }
  1246. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  1247. bool exist;
  1248. b->get(a, &exist);
  1249. *r_ret = exist;
  1250. r_valid = true;
  1251. }
  1252. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1253. Object *l = right->get_validated_object();
  1254. ERR_FAIL_COND(l == nullptr);
  1255. const String &a = *VariantGetInternalPtr<String>::get_ptr(left);
  1256. bool valid;
  1257. l->get(a, &valid);
  1258. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = valid;
  1259. }
  1260. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1261. bool valid;
  1262. PtrToArg<Object *>::convert(right)->get(PtrToArg<String>::convert(left), &valid);
  1263. PtrToArg<bool>::encode(valid, r_ret);
  1264. }
  1265. static Variant::Type get_return_type() { return Variant::BOOL; }
  1266. };
  1267. class OperatorEvaluatorObjectHasPropertyStringName {
  1268. public:
  1269. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1270. Object *b = p_right.get_validated_object();
  1271. if (!b) {
  1272. *r_ret = "Invalid base object for 'in'";
  1273. r_valid = false;
  1274. return;
  1275. }
  1276. const StringName &a = *VariantGetInternalPtr<StringName>::get_ptr(&p_left);
  1277. bool exist;
  1278. b->get(a, &exist);
  1279. *r_ret = exist;
  1280. r_valid = true;
  1281. }
  1282. static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1283. Object *l = right->get_validated_object();
  1284. ERR_FAIL_COND(l == nullptr);
  1285. const StringName &a = *VariantGetInternalPtr<StringName>::get_ptr(left);
  1286. bool valid;
  1287. l->get(a, &valid);
  1288. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = valid;
  1289. }
  1290. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1291. bool valid;
  1292. PtrToArg<Object *>::convert(right)->get(PtrToArg<StringName>::convert(left), &valid);
  1293. PtrToArg<bool>::encode(valid, r_ret);
  1294. }
  1295. static Variant::Type get_return_type() { return Variant::BOOL; }
  1296. };
  1297. #endif // VARIANT_OP_H