variant_op.cpp 113 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018
  1. /*************************************************************************/
  2. /* variant_op.cpp */
  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. #include "variant.h"
  31. #include "core/core_string_names.h"
  32. #include "core/debugger/engine_debugger.h"
  33. #include "core/object/class_db.h"
  34. template <class R, class A, class B>
  35. class OperatorEvaluatorAdd {
  36. public:
  37. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  38. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  39. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  40. *r_ret = a + b;
  41. r_valid = true;
  42. }
  43. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  44. VariantTypeChanger<R>::change(r_ret);
  45. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) + *VariantGetInternalPtr<B>::get_ptr(right);
  46. }
  47. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  48. PtrToArg<R>::encode(PtrToArg<A>::convert(left) + PtrToArg<B>::convert(right), r_ret);
  49. }
  50. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  51. };
  52. template <class R, class A, class B>
  53. class OperatorEvaluatorSub {
  54. public:
  55. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  56. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  57. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  58. *r_ret = a - b;
  59. r_valid = true;
  60. }
  61. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  62. VariantTypeChanger<R>::change(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 void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  80. VariantTypeChanger<R>::change(r_ret);
  81. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) * *VariantGetInternalPtr<B>::get_ptr(right);
  82. }
  83. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  84. PtrToArg<R>::encode(PtrToArg<A>::convert(left) * PtrToArg<B>::convert(right), r_ret);
  85. }
  86. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  87. };
  88. template <class R, class A, class B>
  89. class OperatorEvaluatorXForm {
  90. public:
  91. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  92. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  93. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  94. *r_ret = a.xform(b);
  95. r_valid = true;
  96. }
  97. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  98. VariantTypeChanger<R>::change(r_ret);
  99. *VariantGetInternalPtr<R>::get_ptr(r_ret) = VariantGetInternalPtr<A>::get_ptr(left)->xform(*VariantGetInternalPtr<B>::get_ptr(right));
  100. }
  101. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  102. PtrToArg<R>::encode(PtrToArg<A>::convert(left).xform(PtrToArg<B>::convert(right)), r_ret);
  103. }
  104. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  105. };
  106. template <class R, class A, class B>
  107. class OperatorEvaluatorXFormInv {
  108. public:
  109. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  110. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  111. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  112. *r_ret = b.xform_inv(a);
  113. r_valid = true;
  114. }
  115. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  116. VariantTypeChanger<R>::change(r_ret);
  117. *VariantGetInternalPtr<R>::get_ptr(r_ret) = VariantGetInternalPtr<B>::get_ptr(right)->xform_inv(*VariantGetInternalPtr<A>::get_ptr(left));
  118. }
  119. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  120. PtrToArg<R>::encode(PtrToArg<B>::convert(right).xform_inv(PtrToArg<A>::convert(left)), r_ret);
  121. }
  122. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  123. };
  124. template <class R, class A, class B>
  125. class OperatorEvaluatorDiv {
  126. public:
  127. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  128. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  129. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  130. *r_ret = a / b;
  131. r_valid = true;
  132. }
  133. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  134. VariantTypeChanger<R>::change(r_ret);
  135. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) / *VariantGetInternalPtr<B>::get_ptr(right);
  136. }
  137. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  138. PtrToArg<R>::encode(PtrToArg<A>::convert(left) / PtrToArg<B>::convert(right), r_ret);
  139. }
  140. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  141. };
  142. template <class R, class A, class B>
  143. class OperatorEvaluatorDivNZ {
  144. public:
  145. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  146. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  147. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  148. if (b == 0) {
  149. r_valid = false;
  150. *r_ret = "Division by zero error";
  151. return;
  152. }
  153. *r_ret = a / b;
  154. r_valid = true;
  155. }
  156. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  157. VariantTypeChanger<R>::change(r_ret);
  158. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) / *VariantGetInternalPtr<B>::get_ptr(right);
  159. }
  160. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  161. PtrToArg<R>::encode(PtrToArg<A>::convert(left) / PtrToArg<B>::convert(right), r_ret);
  162. }
  163. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  164. };
  165. template <class R, class A, class B>
  166. class OperatorEvaluatorMod {
  167. public:
  168. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  169. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  170. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  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<R>::change(r_ret);
  176. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) % *VariantGetInternalPtr<B>::get_ptr(right);
  177. }
  178. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  179. PtrToArg<R>::encode(PtrToArg<A>::convert(left) % PtrToArg<B>::convert(right), r_ret);
  180. }
  181. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  182. };
  183. template <class R, class A, class B>
  184. class OperatorEvaluatorModNZ {
  185. public:
  186. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  187. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  188. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  189. if (b == 0) {
  190. r_valid = false;
  191. *r_ret = "Module 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<R>::change(r_ret);
  199. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) % *VariantGetInternalPtr<B>::get_ptr(right);
  200. }
  201. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  202. PtrToArg<R>::encode(PtrToArg<A>::convert(left) % PtrToArg<B>::convert(right), r_ret);
  203. }
  204. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  205. };
  206. template <class R, class A>
  207. class OperatorEvaluatorNeg {
  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. *r_ret = -a;
  212. r_valid = true;
  213. }
  214. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  215. VariantTypeChanger<R>::change(r_ret);
  216. *VariantGetInternalPtr<R>::get_ptr(r_ret) = -*VariantGetInternalPtr<A>::get_ptr(left);
  217. }
  218. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  219. PtrToArg<R>::encode(-PtrToArg<A>::convert(left), r_ret);
  220. }
  221. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  222. };
  223. template <class R, class A>
  224. class OperatorEvaluatorPos {
  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. *r_ret = a;
  229. r_valid = true;
  230. }
  231. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  232. VariantTypeChanger<R>::change(r_ret);
  233. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left);
  234. }
  235. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  236. PtrToArg<R>::encode(PtrToArg<A>::convert(left), r_ret);
  237. }
  238. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  239. };
  240. template <class R, class A, class B>
  241. class OperatorEvaluatorShiftLeft {
  242. public:
  243. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  244. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  245. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  246. *r_ret = a << b;
  247. r_valid = true;
  248. }
  249. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  250. VariantTypeChanger<R>::change(r_ret);
  251. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) << *VariantGetInternalPtr<B>::get_ptr(right);
  252. }
  253. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  254. PtrToArg<R>::encode(PtrToArg<A>::convert(left) << PtrToArg<B>::convert(right), r_ret);
  255. }
  256. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  257. };
  258. template <class R, class A, class B>
  259. class OperatorEvaluatorShiftRight {
  260. public:
  261. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  262. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  263. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  264. *r_ret = a >> b;
  265. r_valid = true;
  266. }
  267. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  268. VariantTypeChanger<R>::change(r_ret);
  269. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) >> *VariantGetInternalPtr<B>::get_ptr(right);
  270. }
  271. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  272. PtrToArg<R>::encode(PtrToArg<A>::convert(left) >> PtrToArg<B>::convert(right), r_ret);
  273. }
  274. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  275. };
  276. template <class R, class A, class B>
  277. class OperatorEvaluatorBitOr {
  278. public:
  279. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  280. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  281. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  282. *r_ret = a | b;
  283. r_valid = true;
  284. }
  285. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  286. VariantTypeChanger<R>::change(r_ret);
  287. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) | *VariantGetInternalPtr<B>::get_ptr(right);
  288. }
  289. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  290. PtrToArg<R>::encode(PtrToArg<A>::convert(left) | PtrToArg<B>::convert(right), r_ret);
  291. }
  292. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  293. };
  294. template <class R, class A, class B>
  295. class OperatorEvaluatorBitAnd {
  296. public:
  297. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  298. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  299. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  300. *r_ret = a & b;
  301. r_valid = true;
  302. }
  303. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  304. VariantTypeChanger<R>::change(r_ret);
  305. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) & *VariantGetInternalPtr<B>::get_ptr(right);
  306. }
  307. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  308. PtrToArg<R>::encode(PtrToArg<A>::convert(left) & PtrToArg<B>::convert(right), r_ret);
  309. }
  310. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  311. };
  312. template <class R, class A, class B>
  313. class OperatorEvaluatorBitXor {
  314. public:
  315. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  316. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  317. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  318. *r_ret = a ^ b;
  319. r_valid = true;
  320. }
  321. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  322. VariantTypeChanger<R>::change(r_ret);
  323. *VariantGetInternalPtr<R>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) ^ *VariantGetInternalPtr<B>::get_ptr(right);
  324. }
  325. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  326. PtrToArg<R>::encode(PtrToArg<A>::convert(left) ^ PtrToArg<B>::convert(right), r_ret);
  327. }
  328. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  329. };
  330. template <class R, class A>
  331. class OperatorEvaluatorBitNeg {
  332. public:
  333. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  334. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  335. *r_ret = ~a;
  336. r_valid = true;
  337. }
  338. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  339. VariantTypeChanger<R>::change(r_ret);
  340. *VariantGetInternalPtr<R>::get_ptr(r_ret) = ~*VariantGetInternalPtr<A>::get_ptr(left);
  341. }
  342. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  343. PtrToArg<R>::encode(~PtrToArg<A>::convert(left), r_ret);
  344. }
  345. static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
  346. };
  347. template <class A, class B>
  348. class OperatorEvaluatorEqual {
  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. *r_ret = a == b;
  354. r_valid = true;
  355. }
  356. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  357. VariantTypeChanger<bool>::change(r_ret);
  358. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) == *VariantGetInternalPtr<B>::get_ptr(right);
  359. }
  360. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  361. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) == PtrToArg<B>::convert(right), r_ret);
  362. }
  363. static Variant::Type get_return_type() { return Variant::BOOL; }
  364. };
  365. class OperatorEvaluatorEqualObject {
  366. public:
  367. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  368. const Object *a = p_left.get_validated_object();
  369. const Object *b = p_right.get_validated_object();
  370. *r_ret = a == b;
  371. r_valid = true;
  372. }
  373. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  374. const Object *a = left->get_validated_object();
  375. const Object *b = right->get_validated_object();
  376. VariantTypeChanger<bool>::change(r_ret);
  377. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a == b;
  378. }
  379. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  380. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) == PtrToArg<Object *>::convert(right), r_ret);
  381. }
  382. static Variant::Type get_return_type() { return Variant::BOOL; }
  383. };
  384. class OperatorEvaluatorEqualObjectNil {
  385. public:
  386. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  387. const Object *a = p_left.get_validated_object();
  388. *r_ret = a == nullptr;
  389. r_valid = true;
  390. }
  391. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  392. const Object *a = left->get_validated_object();
  393. VariantTypeChanger<bool>::change(r_ret);
  394. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a == nullptr;
  395. }
  396. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  397. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) == nullptr, r_ret);
  398. }
  399. static Variant::Type get_return_type() { return Variant::BOOL; }
  400. };
  401. class OperatorEvaluatorEqualNilObject {
  402. public:
  403. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  404. const Object *b = p_right.get_validated_object();
  405. *r_ret = nullptr == b;
  406. r_valid = true;
  407. }
  408. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  409. const Object *b = right->get_validated_object();
  410. VariantTypeChanger<bool>::change(r_ret);
  411. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = nullptr == b;
  412. }
  413. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  414. PtrToArg<bool>::encode(nullptr == PtrToArg<Object *>::convert(right), r_ret);
  415. }
  416. static Variant::Type get_return_type() { return Variant::BOOL; }
  417. };
  418. template <class A, class B>
  419. class OperatorEvaluatorNotEqual {
  420. public:
  421. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  422. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  423. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  424. *r_ret = a != b;
  425. r_valid = true;
  426. }
  427. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  428. VariantTypeChanger<bool>::change(r_ret);
  429. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) != *VariantGetInternalPtr<B>::get_ptr(right);
  430. }
  431. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  432. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) != PtrToArg<B>::convert(right), r_ret);
  433. }
  434. static Variant::Type get_return_type() { return Variant::BOOL; }
  435. };
  436. class OperatorEvaluatorNotEqualObject {
  437. public:
  438. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  439. Object *a = p_left.get_validated_object();
  440. Object *b = p_right.get_validated_object();
  441. *r_ret = a != b;
  442. r_valid = true;
  443. }
  444. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  445. Object *a = left->get_validated_object();
  446. Object *b = right->get_validated_object();
  447. VariantTypeChanger<bool>::change(r_ret);
  448. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a != b;
  449. }
  450. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  451. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) != PtrToArg<Object *>::convert(right), r_ret);
  452. }
  453. static Variant::Type get_return_type() { return Variant::BOOL; }
  454. };
  455. class OperatorEvaluatorNotEqualObjectNil {
  456. public:
  457. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  458. Object *a = p_left.get_validated_object();
  459. *r_ret = a != nullptr;
  460. r_valid = true;
  461. }
  462. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  463. Object *a = left->get_validated_object();
  464. VariantTypeChanger<bool>::change(r_ret);
  465. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = a != nullptr;
  466. }
  467. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  468. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) != nullptr, r_ret);
  469. }
  470. static Variant::Type get_return_type() { return Variant::BOOL; }
  471. };
  472. class OperatorEvaluatorNotEqualNilObject {
  473. public:
  474. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  475. Object *b = p_right.get_validated_object();
  476. *r_ret = nullptr != b;
  477. r_valid = true;
  478. }
  479. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  480. Object *b = right->get_validated_object();
  481. VariantTypeChanger<bool>::change(r_ret);
  482. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = nullptr != b;
  483. }
  484. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  485. PtrToArg<bool>::encode(nullptr != PtrToArg<Object *>::convert(right), r_ret);
  486. }
  487. static Variant::Type get_return_type() { return Variant::BOOL; }
  488. };
  489. template <class A, class B>
  490. class OperatorEvaluatorLess {
  491. public:
  492. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  493. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  494. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  495. *r_ret = a < b;
  496. r_valid = true;
  497. }
  498. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  499. VariantTypeChanger<bool>::change(r_ret);
  500. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) < *VariantGetInternalPtr<B>::get_ptr(right);
  501. }
  502. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  503. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) < PtrToArg<B>::convert(right), r_ret);
  504. }
  505. static Variant::Type get_return_type() { return Variant::BOOL; }
  506. };
  507. template <class A, class B>
  508. class OperatorEvaluatorLessEqual {
  509. public:
  510. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  511. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  512. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  513. *r_ret = a <= b;
  514. r_valid = true;
  515. }
  516. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  517. VariantTypeChanger<bool>::change(r_ret);
  518. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) <= *VariantGetInternalPtr<B>::get_ptr(right);
  519. }
  520. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  521. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) <= PtrToArg<B>::convert(right), r_ret);
  522. }
  523. static Variant::Type get_return_type() { return Variant::BOOL; }
  524. };
  525. template <class A, class B>
  526. class OperatorEvaluatorGreater {
  527. public:
  528. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  529. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  530. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  531. *r_ret = a > b;
  532. r_valid = true;
  533. }
  534. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  535. VariantTypeChanger<bool>::change(r_ret);
  536. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) > *VariantGetInternalPtr<B>::get_ptr(right);
  537. }
  538. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  539. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) > PtrToArg<B>::convert(right), r_ret);
  540. }
  541. static Variant::Type get_return_type() { return Variant::BOOL; }
  542. };
  543. template <class A, class B>
  544. class OperatorEvaluatorGreaterEqual {
  545. public:
  546. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  547. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  548. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  549. *r_ret = a >= b;
  550. r_valid = true;
  551. }
  552. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  553. VariantTypeChanger<bool>::change(r_ret);
  554. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) >= *VariantGetInternalPtr<B>::get_ptr(right);
  555. }
  556. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  557. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) >= PtrToArg<B>::convert(right), r_ret);
  558. }
  559. static Variant::Type get_return_type() { return Variant::BOOL; }
  560. };
  561. template <class A, class B>
  562. class OperatorEvaluatorAnd {
  563. public:
  564. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  565. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  566. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  567. *r_ret = a && b;
  568. r_valid = true;
  569. }
  570. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  571. VariantTypeChanger<bool>::change(r_ret);
  572. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) && *VariantGetInternalPtr<B>::get_ptr(right);
  573. }
  574. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  575. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) && PtrToArg<B>::convert(right), r_ret);
  576. }
  577. static Variant::Type get_return_type() { return Variant::BOOL; }
  578. };
  579. template <class A, class B>
  580. class OperatorEvaluatorOr {
  581. public:
  582. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  583. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  584. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  585. *r_ret = a || b;
  586. r_valid = true;
  587. }
  588. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  589. VariantTypeChanger<bool>::change(r_ret);
  590. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = *VariantGetInternalPtr<A>::get_ptr(left) || *VariantGetInternalPtr<B>::get_ptr(right);
  591. }
  592. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  593. PtrToArg<bool>::encode(PtrToArg<A>::convert(left) || PtrToArg<B>::convert(right), r_ret);
  594. }
  595. static Variant::Type get_return_type() { return Variant::BOOL; }
  596. };
  597. #define XOR_OP(m_a, m_b) (((m_a) || (m_b)) && !((m_a) && (m_b)))
  598. template <class A, class B>
  599. class OperatorEvaluatorXor {
  600. public:
  601. _FORCE_INLINE_ static bool xor_op(const A &a, const B &b) {
  602. return ((a) || (b)) && !((a) && (b));
  603. }
  604. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  605. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  606. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  607. *r_ret = xor_op(a, b);
  608. r_valid = true;
  609. }
  610. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  611. VariantTypeChanger<bool>::change(r_ret);
  612. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = xor_op(*VariantGetInternalPtr<A>::get_ptr(left), *VariantGetInternalPtr<B>::get_ptr(right));
  613. }
  614. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  615. PtrToArg<bool>::encode(xor_op(PtrToArg<A>::convert(left), PtrToArg<B>::convert(right)), r_ret);
  616. }
  617. static Variant::Type get_return_type() { return Variant::BOOL; }
  618. };
  619. template <class A>
  620. class OperatorEvaluatorNot {
  621. public:
  622. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  623. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  624. *r_ret = !a;
  625. r_valid = true;
  626. }
  627. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  628. VariantTypeChanger<bool>::change(r_ret);
  629. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<A>::get_ptr(left);
  630. }
  631. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  632. PtrToArg<bool>::encode(!PtrToArg<A>::convert(left));
  633. }
  634. static Variant::Type get_return_type() { return Variant::BOOL; }
  635. };
  636. //// CUSTOM ////
  637. class OperatorEvaluatorAddArray {
  638. public:
  639. _FORCE_INLINE_ static void _add_arrays(Array &sum, const Array &array_a, const Array &array_b) {
  640. int asize = array_a.size();
  641. int bsize = array_b.size();
  642. sum.resize(asize + bsize);
  643. for (int i = 0; i < asize; i++) {
  644. sum[i] = array_a[i];
  645. }
  646. for (int i = 0; i < bsize; i++) {
  647. sum[i + asize] = array_b[i];
  648. }
  649. }
  650. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  651. const Array &array_a = *VariantGetInternalPtr<Array>::get_ptr(&p_left);
  652. const Array &array_b = *VariantGetInternalPtr<Array>::get_ptr(&p_right);
  653. Array sum;
  654. _add_arrays(sum, array_a, array_b);
  655. *r_ret = sum;
  656. r_valid = true;
  657. }
  658. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  659. VariantTypeChanger<Array>::change(r_ret);
  660. _add_arrays(*VariantGetInternalPtr<Array>::get_ptr(r_ret), *VariantGetInternalPtr<Array>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right));
  661. }
  662. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  663. Array ret;
  664. _add_arrays(ret, PtrToArg<Array>::convert(left), PtrToArg<Array>::convert(right));
  665. PtrToArg<Array>::encode(ret, r_ret);
  666. }
  667. static Variant::Type get_return_type() { return Variant::ARRAY; }
  668. };
  669. template <class T>
  670. class OperatorEvaluatorAppendArray {
  671. public:
  672. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  673. const Vector<T> &array_a = *VariantGetInternalPtr<Vector<T>>::get_ptr(&p_left);
  674. const Vector<T> &array_b = *VariantGetInternalPtr<Vector<T>>::get_ptr(&p_right);
  675. Vector<T> sum = array_a;
  676. sum.append_array(array_b);
  677. *r_ret = sum;
  678. r_valid = true;
  679. }
  680. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  681. VariantTypeChanger<Vector<T>>::change(r_ret);
  682. *VariantGetInternalPtr<Vector<T>>::get_ptr(r_ret) = *VariantGetInternalPtr<Vector<T>>::get_ptr(left);
  683. VariantGetInternalPtr<Vector<T>>::get_ptr(r_ret)->append_array(*VariantGetInternalPtr<Vector<T>>::get_ptr(right));
  684. }
  685. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  686. Vector<T> sum = PtrToArg<Vector<T>>::convert(left);
  687. sum.append_array(PtrToArg<Vector<T>>::convert(right));
  688. PtrToArg<Vector<T>>::encode(sum, r_ret);
  689. }
  690. static Variant::Type get_return_type() { return GetTypeInfo<Vector<T>>::VARIANT_TYPE; }
  691. };
  692. class OperatorEvaluatorStringModNil {
  693. public:
  694. _FORCE_INLINE_ static String do_mod(const String &s, bool *r_valid) {
  695. Array values;
  696. values.push_back(Variant());
  697. String a = s.sprintf(values, r_valid);
  698. if (r_valid) {
  699. *r_valid = !*r_valid;
  700. }
  701. return a;
  702. }
  703. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  704. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  705. *r_ret = do_mod(a, &r_valid);
  706. r_valid = true;
  707. }
  708. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  709. VariantTypeChanger<String>::change(r_ret);
  710. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), nullptr);
  711. }
  712. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  713. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), nullptr), r_ret);
  714. }
  715. static Variant::Type get_return_type() { return Variant::STRING; }
  716. };
  717. class OperatorEvaluatorStringModArray {
  718. public:
  719. _FORCE_INLINE_ static String do_mod(const String &s, const Array &p_values, bool *r_valid) {
  720. String a = s.sprintf(p_values, r_valid);
  721. if (r_valid) {
  722. *r_valid = !*r_valid;
  723. }
  724. return a;
  725. }
  726. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  727. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  728. *r_ret = do_mod(a, *VariantGetInternalPtr<Array>::get_ptr(&p_right), &r_valid);
  729. r_valid = true;
  730. }
  731. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  732. VariantTypeChanger<String>::change(r_ret);
  733. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right), nullptr);
  734. }
  735. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  736. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<Array>::convert(right), nullptr), r_ret);
  737. }
  738. static Variant::Type get_return_type() { return Variant::STRING; }
  739. };
  740. class OperatorEvaluatorStringModObject {
  741. public:
  742. _FORCE_INLINE_ static String do_mod(const String &s, const Object *p_object, bool *r_valid) {
  743. Array values;
  744. values.push_back(p_object);
  745. String a = s.sprintf(values, r_valid);
  746. if (r_valid) {
  747. *r_valid = !*r_valid;
  748. }
  749. return a;
  750. }
  751. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  752. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  753. *r_ret = do_mod(a, p_right.get_validated_object(), &r_valid);
  754. r_valid = true;
  755. }
  756. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  757. VariantTypeChanger<String>::change(r_ret);
  758. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), right->get_validated_object(), nullptr);
  759. }
  760. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  761. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<Object *>::convert(right), nullptr), r_ret);
  762. }
  763. static Variant::Type get_return_type() { return Variant::STRING; }
  764. };
  765. template <class T>
  766. class OperatorEvaluatorStringModT {
  767. public:
  768. _FORCE_INLINE_ static String do_mod(const String &s, const T &p_value, bool *r_valid) {
  769. Array values;
  770. values.push_back(p_value);
  771. String a = s.sprintf(values, r_valid);
  772. if (r_valid) {
  773. *r_valid = !*r_valid;
  774. }
  775. return a;
  776. }
  777. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  778. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  779. *r_ret = do_mod(a, *VariantGetInternalPtr<T>::get_ptr(&p_right), &r_valid);
  780. r_valid = true;
  781. }
  782. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  783. VariantTypeChanger<String>::change(r_ret);
  784. *VariantGetInternalPtr<String>::get_ptr(r_ret) = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), *VariantGetInternalPtr<T>::get_ptr(right), nullptr);
  785. }
  786. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  787. PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<T>::convert(right), nullptr), r_ret);
  788. }
  789. static Variant::Type get_return_type() { return Variant::STRING; }
  790. };
  791. template <Variant::Operator op, Variant::Type type_left, Variant::Type type_right>
  792. class OperatorEvaluatorAlwaysTrue {
  793. public:
  794. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  795. *r_ret = true;
  796. r_valid = true;
  797. }
  798. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  799. VariantTypeChanger<bool>::change(r_ret);
  800. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = true;
  801. }
  802. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  803. PtrToArg<bool>::encode(true, r_ret);
  804. }
  805. static Variant::Type get_return_type() { return Variant::BOOL; }
  806. };
  807. template <Variant::Operator op, Variant::Type type_left, Variant::Type type_right>
  808. class OperatorEvaluatorAlwaysFalse {
  809. public:
  810. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  811. *r_ret = false;
  812. r_valid = true;
  813. }
  814. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  815. VariantTypeChanger<bool>::change(r_ret);
  816. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = false;
  817. }
  818. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  819. PtrToArg<bool>::encode(false, r_ret);
  820. }
  821. static Variant::Type get_return_type() { return Variant::BOOL; }
  822. };
  823. ///// OR ///////
  824. _FORCE_INLINE_ static bool _operate_or(bool p_left, bool p_right) {
  825. return p_left || p_right;
  826. }
  827. _FORCE_INLINE_ static bool _operate_and(bool p_left, bool p_right) {
  828. return p_left && p_right;
  829. }
  830. _FORCE_INLINE_ static bool _operate_xor(bool p_left, bool p_right) {
  831. return (p_left || p_right) && !(p_left && p_right);
  832. }
  833. _FORCE_INLINE_ static bool _operate_get_nil(const Variant *p_ptr) {
  834. return p_ptr->get_validated_object() != nullptr;
  835. }
  836. _FORCE_INLINE_ static bool _operate_get_bool(const Variant *p_ptr) {
  837. return *VariantGetInternalPtr<bool>::get_ptr(p_ptr);
  838. }
  839. _FORCE_INLINE_ static bool _operate_get_int(const Variant *p_ptr) {
  840. return *VariantGetInternalPtr<int64_t>::get_ptr(p_ptr) != 0;
  841. }
  842. _FORCE_INLINE_ static bool _operate_get_float(const Variant *p_ptr) {
  843. return *VariantGetInternalPtr<double>::get_ptr(p_ptr) != 0.0;
  844. }
  845. _FORCE_INLINE_ static bool _operate_get_object(const Variant *p_ptr) {
  846. return p_ptr->get_validated_object() != nullptr;
  847. }
  848. _FORCE_INLINE_ static bool _operate_get_ptr_nil(const void *p_ptr) {
  849. return false;
  850. }
  851. _FORCE_INLINE_ static bool _operate_get_ptr_bool(const void *p_ptr) {
  852. return PtrToArg<bool>::convert(p_ptr);
  853. }
  854. _FORCE_INLINE_ static bool _operate_get_ptr_int(const void *p_ptr) {
  855. return PtrToArg<int64_t>::convert(p_ptr) != 0;
  856. }
  857. _FORCE_INLINE_ static bool _operate_get_ptr_float(const void *p_ptr) {
  858. return PtrToArg<double>::convert(p_ptr) != 0.0;
  859. }
  860. _FORCE_INLINE_ static bool _operate_get_ptr_object(const void *p_ptr) {
  861. return PtrToArg<Object *>::convert(p_ptr) != nullptr;
  862. }
  863. #define OP_EVALUATOR(m_class_name, m_left, m_right, m_op) \
  864. class m_class_name { \
  865. public: \
  866. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { \
  867. *r_ret = m_op(_operate_get_##m_left(&p_left), _operate_get_##m_right(&p_right)); \
  868. r_valid = true; \
  869. } \
  870. \
  871. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { \
  872. VariantTypeChanger<bool>::change(r_ret); \
  873. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = m_op(_operate_get_##m_left(left), _operate_get_##m_right(right)); \
  874. } \
  875. \
  876. static void ptr_evaluate(const void *left, const void *right, void *r_ret) { \
  877. PtrToArg<bool>::encode(m_op(_operate_get_ptr_##m_left(left), _operate_get_ptr_##m_right(right)), r_ret); \
  878. } \
  879. \
  880. static Variant::Type get_return_type() { \
  881. return Variant::BOOL; \
  882. } \
  883. };
  884. // OR
  885. // nil
  886. OP_EVALUATOR(OperatorEvaluatorNilXBoolOr, nil, bool, _operate_or)
  887. OP_EVALUATOR(OperatorEvaluatorBoolXNilOr, bool, nil, _operate_or)
  888. OP_EVALUATOR(OperatorEvaluatorNilXIntOr, nil, int, _operate_or)
  889. OP_EVALUATOR(OperatorEvaluatorIntXNilOr, int, nil, _operate_or)
  890. OP_EVALUATOR(OperatorEvaluatorNilXFloatOr, nil, float, _operate_or)
  891. OP_EVALUATOR(OperatorEvaluatorFloatXNilOr, float, nil, _operate_or)
  892. OP_EVALUATOR(OperatorEvaluatorObjectXNilOr, object, nil, _operate_or)
  893. OP_EVALUATOR(OperatorEvaluatorNilXObjectOr, nil, object, _operate_or)
  894. // bool
  895. OP_EVALUATOR(OperatorEvaluatorBoolXBoolOr, bool, bool, _operate_or)
  896. OP_EVALUATOR(OperatorEvaluatorBoolXIntOr, bool, int, _operate_or)
  897. OP_EVALUATOR(OperatorEvaluatorIntXBoolOr, int, bool, _operate_or)
  898. OP_EVALUATOR(OperatorEvaluatorBoolXFloatOr, bool, float, _operate_or)
  899. OP_EVALUATOR(OperatorEvaluatorFloatXBoolOr, float, bool, _operate_or)
  900. OP_EVALUATOR(OperatorEvaluatorBoolXObjectOr, bool, object, _operate_or)
  901. OP_EVALUATOR(OperatorEvaluatorObjectXBoolOr, object, bool, _operate_or)
  902. // int
  903. OP_EVALUATOR(OperatorEvaluatorIntXIntOr, int, int, _operate_or)
  904. OP_EVALUATOR(OperatorEvaluatorIntXFloatOr, int, float, _operate_or)
  905. OP_EVALUATOR(OperatorEvaluatorFloatXIntOr, float, int, _operate_or)
  906. OP_EVALUATOR(OperatorEvaluatorIntXObjectOr, int, object, _operate_or)
  907. OP_EVALUATOR(OperatorEvaluatorObjectXIntOr, object, int, _operate_or)
  908. // float
  909. OP_EVALUATOR(OperatorEvaluatorFloatXFloatOr, float, float, _operate_or)
  910. OP_EVALUATOR(OperatorEvaluatorFloatXObjectOr, float, object, _operate_or)
  911. OP_EVALUATOR(OperatorEvaluatorObjectXFloatOr, object, float, _operate_or)
  912. // object
  913. OP_EVALUATOR(OperatorEvaluatorObjectXObjectOr, object, object, _operate_or)
  914. // AND
  915. // nil
  916. OP_EVALUATOR(OperatorEvaluatorNilXBoolAnd, nil, bool, _operate_and)
  917. OP_EVALUATOR(OperatorEvaluatorBoolXNilAnd, bool, nil, _operate_and)
  918. OP_EVALUATOR(OperatorEvaluatorNilXIntAnd, nil, int, _operate_and)
  919. OP_EVALUATOR(OperatorEvaluatorIntXNilAnd, int, nil, _operate_and)
  920. OP_EVALUATOR(OperatorEvaluatorNilXFloatAnd, nil, float, _operate_and)
  921. OP_EVALUATOR(OperatorEvaluatorFloatXNilAnd, float, nil, _operate_and)
  922. OP_EVALUATOR(OperatorEvaluatorObjectXNilAnd, object, nil, _operate_and)
  923. OP_EVALUATOR(OperatorEvaluatorNilXObjectAnd, nil, object, _operate_and)
  924. // bool
  925. OP_EVALUATOR(OperatorEvaluatorBoolXBoolAnd, bool, bool, _operate_and)
  926. OP_EVALUATOR(OperatorEvaluatorBoolXIntAnd, bool, int, _operate_and)
  927. OP_EVALUATOR(OperatorEvaluatorIntXBoolAnd, int, bool, _operate_and)
  928. OP_EVALUATOR(OperatorEvaluatorBoolXFloatAnd, bool, float, _operate_and)
  929. OP_EVALUATOR(OperatorEvaluatorFloatXBoolAnd, float, bool, _operate_and)
  930. OP_EVALUATOR(OperatorEvaluatorBoolXObjectAnd, bool, object, _operate_and)
  931. OP_EVALUATOR(OperatorEvaluatorObjectXBoolAnd, object, bool, _operate_and)
  932. // int
  933. OP_EVALUATOR(OperatorEvaluatorIntXIntAnd, int, int, _operate_and)
  934. OP_EVALUATOR(OperatorEvaluatorIntXFloatAnd, int, float, _operate_and)
  935. OP_EVALUATOR(OperatorEvaluatorFloatXIntAnd, float, int, _operate_and)
  936. OP_EVALUATOR(OperatorEvaluatorIntXObjectAnd, int, object, _operate_and)
  937. OP_EVALUATOR(OperatorEvaluatorObjectXIntAnd, object, int, _operate_and)
  938. // float
  939. OP_EVALUATOR(OperatorEvaluatorFloatXFloatAnd, float, float, _operate_and)
  940. OP_EVALUATOR(OperatorEvaluatorFloatXObjectAnd, float, object, _operate_and)
  941. OP_EVALUATOR(OperatorEvaluatorObjectXFloatAnd, object, float, _operate_and)
  942. // object
  943. OP_EVALUATOR(OperatorEvaluatorObjectXObjectAnd, object, object, _operate_and)
  944. // XOR
  945. // nil
  946. OP_EVALUATOR(OperatorEvaluatorNilXBoolXor, nil, bool, _operate_xor)
  947. OP_EVALUATOR(OperatorEvaluatorBoolXNilXor, bool, nil, _operate_xor)
  948. OP_EVALUATOR(OperatorEvaluatorNilXIntXor, nil, int, _operate_xor)
  949. OP_EVALUATOR(OperatorEvaluatorIntXNilXor, int, nil, _operate_xor)
  950. OP_EVALUATOR(OperatorEvaluatorNilXFloatXor, nil, float, _operate_xor)
  951. OP_EVALUATOR(OperatorEvaluatorFloatXNilXor, float, nil, _operate_xor)
  952. OP_EVALUATOR(OperatorEvaluatorObjectXNilXor, object, nil, _operate_xor)
  953. OP_EVALUATOR(OperatorEvaluatorNilXObjectXor, nil, object, _operate_xor)
  954. // bool
  955. OP_EVALUATOR(OperatorEvaluatorBoolXBoolXor, bool, bool, _operate_xor)
  956. OP_EVALUATOR(OperatorEvaluatorBoolXIntXor, bool, int, _operate_xor)
  957. OP_EVALUATOR(OperatorEvaluatorIntXBoolXor, int, bool, _operate_xor)
  958. OP_EVALUATOR(OperatorEvaluatorBoolXFloatXor, bool, float, _operate_xor)
  959. OP_EVALUATOR(OperatorEvaluatorFloatXBoolXor, float, bool, _operate_xor)
  960. OP_EVALUATOR(OperatorEvaluatorBoolXObjectXor, bool, object, _operate_xor)
  961. OP_EVALUATOR(OperatorEvaluatorObjectXBoolXor, object, bool, _operate_xor)
  962. // int
  963. OP_EVALUATOR(OperatorEvaluatorIntXIntXor, int, int, _operate_xor)
  964. OP_EVALUATOR(OperatorEvaluatorIntXFloatXor, int, float, _operate_xor)
  965. OP_EVALUATOR(OperatorEvaluatorFloatXIntXor, float, int, _operate_xor)
  966. OP_EVALUATOR(OperatorEvaluatorIntXObjectXor, int, object, _operate_xor)
  967. OP_EVALUATOR(OperatorEvaluatorObjectXIntXor, object, int, _operate_xor)
  968. // float
  969. OP_EVALUATOR(OperatorEvaluatorFloatXFloatXor, float, float, _operate_xor)
  970. OP_EVALUATOR(OperatorEvaluatorFloatXObjectXor, float, object, _operate_xor)
  971. OP_EVALUATOR(OperatorEvaluatorObjectXFloatXor, object, float, _operate_xor)
  972. // object
  973. OP_EVALUATOR(OperatorEvaluatorObjectXObjectXor, object, object, _operate_xor)
  974. class OperatorEvaluatorNotBool {
  975. public:
  976. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  977. *r_ret = !*VariantGetInternalPtr<bool>::get_ptr(&p_left);
  978. r_valid = true;
  979. }
  980. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  981. VariantTypeChanger<bool>::change(r_ret);
  982. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<bool>::get_ptr(left);
  983. }
  984. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  985. PtrToArg<bool>::encode(!PtrToArg<bool>::convert(left), r_ret);
  986. }
  987. static Variant::Type get_return_type() { return Variant::BOOL; }
  988. };
  989. class OperatorEvaluatorNotInt {
  990. public:
  991. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  992. *r_ret = !*VariantGetInternalPtr<int64_t>::get_ptr(&p_left);
  993. r_valid = true;
  994. }
  995. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  996. VariantTypeChanger<bool>::change(r_ret);
  997. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<int64_t>::get_ptr(left);
  998. }
  999. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1000. PtrToArg<bool>::encode(!PtrToArg<int64_t>::convert(left), r_ret);
  1001. }
  1002. static Variant::Type get_return_type() { return Variant::BOOL; }
  1003. };
  1004. class OperatorEvaluatorNotFloat {
  1005. public:
  1006. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1007. *r_ret = !*VariantGetInternalPtr<double>::get_ptr(&p_left);
  1008. r_valid = true;
  1009. }
  1010. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1011. VariantTypeChanger<bool>::change(r_ret);
  1012. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = !*VariantGetInternalPtr<double>::get_ptr(left);
  1013. }
  1014. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1015. PtrToArg<bool>::encode(!PtrToArg<double>::convert(left), r_ret);
  1016. }
  1017. static Variant::Type get_return_type() { return Variant::BOOL; }
  1018. };
  1019. class OperatorEvaluatorNotObject {
  1020. public:
  1021. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1022. *r_ret = p_left.get_validated_object() == nullptr;
  1023. r_valid = true;
  1024. }
  1025. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1026. VariantTypeChanger<bool>::change(r_ret);
  1027. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = left->get_validated_object() == nullptr;
  1028. }
  1029. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1030. PtrToArg<bool>::encode(PtrToArg<Object *>::convert(left) == nullptr, r_ret);
  1031. }
  1032. static Variant::Type get_return_type() { return Variant::BOOL; }
  1033. };
  1034. ////
  1035. class OperatorEvaluatorInStringFind {
  1036. public:
  1037. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1038. const String &str_a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  1039. const String &str_b = *VariantGetInternalPtr<String>::get_ptr(&p_right);
  1040. *r_ret = str_b.find(str_a) != -1;
  1041. r_valid = true;
  1042. }
  1043. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1044. const String &str_a = *VariantGetInternalPtr<String>::get_ptr(left);
  1045. const String &str_b = *VariantGetInternalPtr<String>::get_ptr(right);
  1046. VariantTypeChanger<bool>::change(r_ret);
  1047. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = str_b.find(str_a) != -1;
  1048. }
  1049. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1050. PtrToArg<bool>::encode(PtrToArg<String>::convert(right).find(PtrToArg<String>::convert(left)) != -1, r_ret);
  1051. }
  1052. static Variant::Type get_return_type() { return Variant::BOOL; }
  1053. };
  1054. template <class A, class B>
  1055. class OperatorEvaluatorInArrayFind {
  1056. public:
  1057. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1058. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  1059. const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
  1060. *r_ret = b.find(a) != -1;
  1061. r_valid = true;
  1062. }
  1063. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1064. const A &a = *VariantGetInternalPtr<A>::get_ptr(left);
  1065. const B &b = *VariantGetInternalPtr<B>::get_ptr(right);
  1066. VariantTypeChanger<bool>::change(r_ret);
  1067. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.find(a) != -1;
  1068. }
  1069. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1070. PtrToArg<bool>::encode(PtrToArg<B>::convert(right).find(PtrToArg<A>::convert(left)) != -1, r_ret);
  1071. }
  1072. static Variant::Type get_return_type() { return Variant::BOOL; }
  1073. };
  1074. class OperatorEvaluatorInArrayFindNil {
  1075. public:
  1076. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1077. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(&p_right);
  1078. *r_ret = b.find(Variant()) != -1;
  1079. r_valid = true;
  1080. }
  1081. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1082. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(right);
  1083. VariantTypeChanger<bool>::change(r_ret);
  1084. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.find(Variant()) != -1;
  1085. }
  1086. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1087. PtrToArg<bool>::encode(PtrToArg<Array>::convert(right).find(Variant()) != -1, r_ret);
  1088. }
  1089. static Variant::Type get_return_type() { return Variant::BOOL; }
  1090. };
  1091. class OperatorEvaluatorInArrayFindObject {
  1092. public:
  1093. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1094. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(&p_right);
  1095. *r_ret = b.find(p_left) != -1;
  1096. r_valid = true;
  1097. }
  1098. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1099. const Array &b = *VariantGetInternalPtr<Array>::get_ptr(right);
  1100. VariantTypeChanger<bool>::change(r_ret);
  1101. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.find(*left) != -1;
  1102. }
  1103. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1104. PtrToArg<bool>::encode(PtrToArg<Array>::convert(right).find(PtrToArg<Object *>::convert(left)) != -1, r_ret);
  1105. }
  1106. static Variant::Type get_return_type() { return Variant::BOOL; }
  1107. };
  1108. template <class A>
  1109. class OperatorEvaluatorInDictionaryHas {
  1110. public:
  1111. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1112. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(&p_right);
  1113. const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
  1114. *r_ret = b.has(a);
  1115. r_valid = true;
  1116. }
  1117. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1118. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(right);
  1119. const A &a = *VariantGetInternalPtr<A>::get_ptr(left);
  1120. VariantTypeChanger<bool>::change(r_ret);
  1121. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.has(a);
  1122. }
  1123. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1124. PtrToArg<bool>::encode(PtrToArg<Dictionary>::convert(right).has(PtrToArg<A>::convert(left)), r_ret);
  1125. }
  1126. static Variant::Type get_return_type() { return Variant::BOOL; }
  1127. };
  1128. class OperatorEvaluatorInDictionaryHasNil {
  1129. public:
  1130. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1131. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(&p_right);
  1132. *r_ret = b.has(Variant());
  1133. r_valid = true;
  1134. }
  1135. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1136. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(right);
  1137. VariantTypeChanger<bool>::change(r_ret);
  1138. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.has(Variant());
  1139. }
  1140. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1141. PtrToArg<bool>::encode(PtrToArg<Dictionary>::convert(right).has(Variant()), r_ret);
  1142. }
  1143. static Variant::Type get_return_type() { return Variant::BOOL; }
  1144. };
  1145. class OperatorEvaluatorInDictionaryHasObject {
  1146. public:
  1147. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1148. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(&p_right);
  1149. *r_ret = b.has(p_left);
  1150. r_valid = true;
  1151. }
  1152. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1153. const Dictionary &b = *VariantGetInternalPtr<Dictionary>::get_ptr(right);
  1154. VariantTypeChanger<bool>::change(r_ret);
  1155. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = b.has(*left);
  1156. }
  1157. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1158. PtrToArg<bool>::encode(PtrToArg<Dictionary>::convert(right).has(PtrToArg<Object *>::convert(left)), r_ret);
  1159. }
  1160. static Variant::Type get_return_type() { return Variant::BOOL; }
  1161. };
  1162. class OperatorEvaluatorObjectHasPropertyString {
  1163. public:
  1164. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1165. Object *b = p_right.get_validated_object();
  1166. if (!b) {
  1167. *r_ret = "Invalid base object for 'in'";
  1168. r_valid = false;
  1169. return;
  1170. }
  1171. const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left);
  1172. b->get(a, &r_valid);
  1173. *r_ret = r_valid;
  1174. }
  1175. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1176. Object *l = right->get_validated_object();
  1177. ERR_FAIL_COND(l == nullptr);
  1178. const String &a = *VariantGetInternalPtr<String>::get_ptr(left);
  1179. bool valid;
  1180. l->get(a, &valid);
  1181. VariantTypeChanger<bool>::change(r_ret);
  1182. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = valid;
  1183. }
  1184. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1185. bool valid;
  1186. PtrToArg<Object *>::convert(right)->get(PtrToArg<String>::convert(left), &valid);
  1187. PtrToArg<bool>::encode(valid, r_ret);
  1188. }
  1189. static Variant::Type get_return_type() { return Variant::BOOL; }
  1190. };
  1191. class OperatorEvaluatorObjectHasPropertyStringName {
  1192. public:
  1193. static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
  1194. Object *b = p_right.get_validated_object();
  1195. if (!b) {
  1196. *r_ret = "Invalid base object for 'in'";
  1197. r_valid = false;
  1198. return;
  1199. }
  1200. const StringName &a = *VariantGetInternalPtr<StringName>::get_ptr(&p_left);
  1201. b->get(a, &r_valid);
  1202. *r_ret = r_valid;
  1203. }
  1204. static void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
  1205. Object *l = right->get_validated_object();
  1206. ERR_FAIL_COND(l == nullptr);
  1207. const StringName &a = *VariantGetInternalPtr<StringName>::get_ptr(left);
  1208. bool valid;
  1209. l->get(a, &valid);
  1210. VariantTypeChanger<bool>::change(r_ret);
  1211. *VariantGetInternalPtr<bool>::get_ptr(r_ret) = valid;
  1212. }
  1213. static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
  1214. bool valid;
  1215. PtrToArg<Object *>::convert(right)->get(PtrToArg<StringName>::convert(left), &valid);
  1216. PtrToArg<bool>::encode(valid, r_ret);
  1217. }
  1218. static Variant::Type get_return_type() { return Variant::BOOL; }
  1219. };
  1220. typedef void (*VariantEvaluatorFunction)(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid);
  1221. static Variant::Type operator_return_type_table[Variant::OP_MAX][Variant::VARIANT_MAX][Variant::VARIANT_MAX];
  1222. static VariantEvaluatorFunction operator_evaluator_table[Variant::OP_MAX][Variant::VARIANT_MAX][Variant::VARIANT_MAX];
  1223. static Variant::ValidatedOperatorEvaluator validated_operator_evaluator_table[Variant::OP_MAX][Variant::VARIANT_MAX][Variant::VARIANT_MAX];
  1224. static Variant::PTROperatorEvaluator ptr_operator_evaluator_table[Variant::OP_MAX][Variant::VARIANT_MAX][Variant::VARIANT_MAX];
  1225. template <class T>
  1226. void register_op(Variant::Operator p_op, Variant::Type p_type_a, Variant::Type p_type_b) {
  1227. operator_return_type_table[p_op][p_type_a][p_type_b] = T::get_return_type();
  1228. operator_evaluator_table[p_op][p_type_a][p_type_b] = T::evaluate;
  1229. validated_operator_evaluator_table[p_op][p_type_a][p_type_b] = T::validated_evaluate;
  1230. ptr_operator_evaluator_table[p_op][p_type_a][p_type_b] = T::ptr_evaluate;
  1231. }
  1232. void Variant::_register_variant_operators() {
  1233. zeromem(operator_return_type_table, sizeof(operator_return_type_table));
  1234. zeromem(operator_evaluator_table, sizeof(operator_evaluator_table));
  1235. zeromem(validated_operator_evaluator_table, sizeof(validated_operator_evaluator_table));
  1236. zeromem(ptr_operator_evaluator_table, sizeof(ptr_operator_evaluator_table));
  1237. register_op<OperatorEvaluatorAdd<int64_t, int64_t, int64_t>>(Variant::OP_ADD, Variant::INT, Variant::INT);
  1238. register_op<OperatorEvaluatorAdd<double, int64_t, double>>(Variant::OP_ADD, Variant::INT, Variant::FLOAT);
  1239. register_op<OperatorEvaluatorAdd<double, double, int64_t>>(Variant::OP_ADD, Variant::FLOAT, Variant::INT);
  1240. register_op<OperatorEvaluatorAdd<double, double, double>>(Variant::OP_ADD, Variant::FLOAT, Variant::FLOAT);
  1241. register_op<OperatorEvaluatorAdd<String, String, String>>(Variant::OP_ADD, Variant::STRING, Variant::STRING);
  1242. register_op<OperatorEvaluatorAdd<Vector2, Vector2, Vector2>>(Variant::OP_ADD, Variant::VECTOR2, Variant::VECTOR2);
  1243. register_op<OperatorEvaluatorAdd<Vector2i, Vector2i, Vector2i>>(Variant::OP_ADD, Variant::VECTOR2I, Variant::VECTOR2I);
  1244. register_op<OperatorEvaluatorAdd<Vector3, Vector3, Vector3>>(Variant::OP_ADD, Variant::VECTOR3, Variant::VECTOR3);
  1245. register_op<OperatorEvaluatorAdd<Vector3i, Vector3i, Vector3i>>(Variant::OP_ADD, Variant::VECTOR3I, Variant::VECTOR3I);
  1246. register_op<OperatorEvaluatorAdd<Quat, Quat, Quat>>(Variant::OP_ADD, Variant::QUAT, Variant::QUAT);
  1247. register_op<OperatorEvaluatorAdd<Color, Color, Color>>(Variant::OP_ADD, Variant::COLOR, Variant::COLOR);
  1248. register_op<OperatorEvaluatorAddArray>(Variant::OP_ADD, Variant::ARRAY, Variant::ARRAY);
  1249. register_op<OperatorEvaluatorAppendArray<uint8_t>>(Variant::OP_ADD, Variant::PACKED_BYTE_ARRAY, Variant::PACKED_BYTE_ARRAY);
  1250. register_op<OperatorEvaluatorAppendArray<int32_t>>(Variant::OP_ADD, Variant::PACKED_INT32_ARRAY, Variant::PACKED_INT32_ARRAY);
  1251. register_op<OperatorEvaluatorAppendArray<int64_t>>(Variant::OP_ADD, Variant::PACKED_INT64_ARRAY, Variant::PACKED_INT64_ARRAY);
  1252. register_op<OperatorEvaluatorAppendArray<float>>(Variant::OP_ADD, Variant::PACKED_FLOAT32_ARRAY, Variant::PACKED_FLOAT32_ARRAY);
  1253. register_op<OperatorEvaluatorAppendArray<double>>(Variant::OP_ADD, Variant::PACKED_FLOAT64_ARRAY, Variant::PACKED_FLOAT64_ARRAY);
  1254. register_op<OperatorEvaluatorAppendArray<String>>(Variant::OP_ADD, Variant::PACKED_STRING_ARRAY, Variant::PACKED_STRING_ARRAY);
  1255. register_op<OperatorEvaluatorAppendArray<Vector2>>(Variant::OP_ADD, Variant::PACKED_VECTOR2_ARRAY, Variant::PACKED_VECTOR2_ARRAY);
  1256. register_op<OperatorEvaluatorAppendArray<Vector3>>(Variant::OP_ADD, Variant::PACKED_VECTOR3_ARRAY, Variant::PACKED_VECTOR3_ARRAY);
  1257. register_op<OperatorEvaluatorAppendArray<Color>>(Variant::OP_ADD, Variant::PACKED_COLOR_ARRAY, Variant::PACKED_COLOR_ARRAY);
  1258. register_op<OperatorEvaluatorSub<int64_t, int64_t, int64_t>>(Variant::OP_SUBTRACT, Variant::INT, Variant::INT);
  1259. register_op<OperatorEvaluatorSub<double, int64_t, double>>(Variant::OP_SUBTRACT, Variant::INT, Variant::FLOAT);
  1260. register_op<OperatorEvaluatorSub<double, double, int64_t>>(Variant::OP_SUBTRACT, Variant::FLOAT, Variant::INT);
  1261. register_op<OperatorEvaluatorSub<double, double, double>>(Variant::OP_SUBTRACT, Variant::FLOAT, Variant::FLOAT);
  1262. register_op<OperatorEvaluatorSub<Vector2, Vector2, Vector2>>(Variant::OP_SUBTRACT, Variant::VECTOR2, Variant::VECTOR2);
  1263. register_op<OperatorEvaluatorSub<Vector2i, Vector2i, Vector2i>>(Variant::OP_SUBTRACT, Variant::VECTOR2I, Variant::VECTOR2I);
  1264. register_op<OperatorEvaluatorSub<Vector3, Vector3, Vector3>>(Variant::OP_SUBTRACT, Variant::VECTOR3, Variant::VECTOR3);
  1265. register_op<OperatorEvaluatorSub<Vector3i, Vector3i, Vector3i>>(Variant::OP_SUBTRACT, Variant::VECTOR3I, Variant::VECTOR3I);
  1266. register_op<OperatorEvaluatorSub<Quat, Quat, Quat>>(Variant::OP_SUBTRACT, Variant::QUAT, Variant::QUAT);
  1267. register_op<OperatorEvaluatorSub<Color, Color, Color>>(Variant::OP_SUBTRACT, Variant::COLOR, Variant::COLOR);
  1268. register_op<OperatorEvaluatorMul<int64_t, int64_t, int64_t>>(Variant::OP_MULTIPLY, Variant::INT, Variant::INT);
  1269. register_op<OperatorEvaluatorMul<double, int64_t, double>>(Variant::OP_MULTIPLY, Variant::INT, Variant::FLOAT);
  1270. register_op<OperatorEvaluatorMul<Vector2, int64_t, Vector2>>(Variant::OP_MULTIPLY, Variant::INT, Variant::VECTOR2);
  1271. register_op<OperatorEvaluatorMul<Vector2i, int64_t, Vector2i>>(Variant::OP_MULTIPLY, Variant::INT, Variant::VECTOR2I);
  1272. register_op<OperatorEvaluatorMul<Vector3, int64_t, Vector3>>(Variant::OP_MULTIPLY, Variant::INT, Variant::VECTOR3);
  1273. register_op<OperatorEvaluatorMul<Vector3i, int64_t, Vector3i>>(Variant::OP_MULTIPLY, Variant::INT, Variant::VECTOR3I);
  1274. register_op<OperatorEvaluatorMul<double, double, double>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::FLOAT);
  1275. register_op<OperatorEvaluatorMul<double, double, int64_t>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::INT);
  1276. register_op<OperatorEvaluatorMul<Vector2, double, Vector2>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::VECTOR2);
  1277. register_op<OperatorEvaluatorMul<Vector2i, double, Vector2i>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::VECTOR2I);
  1278. register_op<OperatorEvaluatorMul<Vector3, double, Vector3>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::VECTOR3);
  1279. register_op<OperatorEvaluatorMul<Vector3i, double, Vector3i>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::VECTOR3I);
  1280. register_op<OperatorEvaluatorMul<Vector2, Vector2, Vector2>>(Variant::OP_MULTIPLY, Variant::VECTOR2, Variant::VECTOR2);
  1281. register_op<OperatorEvaluatorMul<Vector2, Vector2, int64_t>>(Variant::OP_MULTIPLY, Variant::VECTOR2, Variant::INT);
  1282. register_op<OperatorEvaluatorMul<Vector2, Vector2, double>>(Variant::OP_MULTIPLY, Variant::VECTOR2, Variant::FLOAT);
  1283. register_op<OperatorEvaluatorMul<Vector2i, Vector2i, Vector2i>>(Variant::OP_MULTIPLY, Variant::VECTOR2I, Variant::VECTOR2I);
  1284. register_op<OperatorEvaluatorMul<Vector2i, Vector2i, int64_t>>(Variant::OP_MULTIPLY, Variant::VECTOR2I, Variant::INT);
  1285. register_op<OperatorEvaluatorMul<Vector2i, Vector2i, double>>(Variant::OP_MULTIPLY, Variant::VECTOR2I, Variant::FLOAT);
  1286. register_op<OperatorEvaluatorMul<Vector3, Vector3, Vector3>>(Variant::OP_MULTIPLY, Variant::VECTOR3, Variant::VECTOR3);
  1287. register_op<OperatorEvaluatorMul<Vector3, Vector3, int64_t>>(Variant::OP_MULTIPLY, Variant::VECTOR3, Variant::INT);
  1288. register_op<OperatorEvaluatorMul<Vector3, Vector3, double>>(Variant::OP_MULTIPLY, Variant::VECTOR3, Variant::FLOAT);
  1289. register_op<OperatorEvaluatorMul<Vector3i, Vector3i, Vector3i>>(Variant::OP_MULTIPLY, Variant::VECTOR3I, Variant::VECTOR3I);
  1290. register_op<OperatorEvaluatorMul<Vector3i, Vector3i, int64_t>>(Variant::OP_MULTIPLY, Variant::VECTOR3I, Variant::INT);
  1291. register_op<OperatorEvaluatorMul<Vector3i, Vector3i, double>>(Variant::OP_MULTIPLY, Variant::VECTOR3I, Variant::FLOAT);
  1292. register_op<OperatorEvaluatorMul<Quat, Quat, Quat>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::QUAT);
  1293. register_op<OperatorEvaluatorMul<Quat, Quat, int64_t>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::INT);
  1294. register_op<OperatorEvaluatorMul<Quat, Quat, double>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::FLOAT);
  1295. register_op<OperatorEvaluatorMul<Color, Color, Color>>(Variant::OP_MULTIPLY, Variant::COLOR, Variant::COLOR);
  1296. register_op<OperatorEvaluatorMul<Color, Color, int64_t>>(Variant::OP_MULTIPLY, Variant::COLOR, Variant::INT);
  1297. register_op<OperatorEvaluatorMul<Color, Color, double>>(Variant::OP_MULTIPLY, Variant::COLOR, Variant::FLOAT);
  1298. register_op<OperatorEvaluatorMul<Transform2D, Transform2D, Transform2D>>(Variant::OP_MULTIPLY, Variant::TRANSFORM2D, Variant::TRANSFORM2D);
  1299. register_op<OperatorEvaluatorXForm<Vector2, Transform2D, Vector2>>(Variant::OP_MULTIPLY, Variant::TRANSFORM2D, Variant::VECTOR2);
  1300. register_op<OperatorEvaluatorXFormInv<Vector2, Vector2, Transform2D>>(Variant::OP_MULTIPLY, Variant::VECTOR2, Variant::TRANSFORM2D);
  1301. register_op<OperatorEvaluatorXForm<Rect2, Transform2D, Rect2>>(Variant::OP_MULTIPLY, Variant::TRANSFORM2D, Variant::RECT2);
  1302. register_op<OperatorEvaluatorXFormInv<Rect2, Rect2, Transform2D>>(Variant::OP_MULTIPLY, Variant::RECT2, Variant::TRANSFORM2D);
  1303. register_op<OperatorEvaluatorXForm<Vector<Vector2>, Transform2D, Vector<Vector2>>>(Variant::OP_MULTIPLY, Variant::TRANSFORM2D, Variant::PACKED_VECTOR2_ARRAY);
  1304. register_op<OperatorEvaluatorXFormInv<Vector<Vector2>, Vector<Vector2>, Transform2D>>(Variant::OP_MULTIPLY, Variant::PACKED_VECTOR2_ARRAY, Variant::TRANSFORM2D);
  1305. register_op<OperatorEvaluatorMul<Transform, Transform, Transform>>(Variant::OP_MULTIPLY, Variant::TRANSFORM, Variant::TRANSFORM);
  1306. register_op<OperatorEvaluatorXForm<Vector3, Transform, Vector3>>(Variant::OP_MULTIPLY, Variant::TRANSFORM, Variant::VECTOR3);
  1307. register_op<OperatorEvaluatorXFormInv<Vector3, Vector3, Transform>>(Variant::OP_MULTIPLY, Variant::VECTOR3, Variant::TRANSFORM);
  1308. register_op<OperatorEvaluatorXForm<::AABB, Transform, ::AABB>>(Variant::OP_MULTIPLY, Variant::TRANSFORM, Variant::AABB);
  1309. register_op<OperatorEvaluatorXFormInv<::AABB, ::AABB, Transform>>(Variant::OP_MULTIPLY, Variant::AABB, Variant::TRANSFORM);
  1310. register_op<OperatorEvaluatorXForm<Vector<Vector3>, Transform, Vector<Vector3>>>(Variant::OP_MULTIPLY, Variant::TRANSFORM, Variant::PACKED_VECTOR3_ARRAY);
  1311. register_op<OperatorEvaluatorXFormInv<Vector<Vector3>, Vector<Vector3>, Transform>>(Variant::OP_MULTIPLY, Variant::PACKED_VECTOR3_ARRAY, Variant::TRANSFORM);
  1312. register_op<OperatorEvaluatorMul<Basis, Basis, Basis>>(Variant::OP_MULTIPLY, Variant::BASIS, Variant::BASIS);
  1313. register_op<OperatorEvaluatorXForm<Vector3, Basis, Vector3>>(Variant::OP_MULTIPLY, Variant::BASIS, Variant::VECTOR3);
  1314. register_op<OperatorEvaluatorXFormInv<Vector3, Vector3, Basis>>(Variant::OP_MULTIPLY, Variant::VECTOR3, Variant::BASIS);
  1315. register_op<OperatorEvaluatorMul<Quat, Quat, Quat>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::QUAT);
  1316. register_op<OperatorEvaluatorMul<Quat, Quat, int64_t>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::INT);
  1317. register_op<OperatorEvaluatorMul<Quat, int64_t, Quat>>(Variant::OP_MULTIPLY, Variant::INT, Variant::QUAT);
  1318. register_op<OperatorEvaluatorMul<Quat, Quat, double>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::FLOAT);
  1319. register_op<OperatorEvaluatorMul<Quat, double, Quat>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::QUAT);
  1320. register_op<OperatorEvaluatorXForm<Vector3, Quat, Vector3>>(Variant::OP_MULTIPLY, Variant::QUAT, Variant::VECTOR3);
  1321. register_op<OperatorEvaluatorXFormInv<Vector3, Vector3, Quat>>(Variant::OP_MULTIPLY, Variant::VECTOR3, Variant::QUAT);
  1322. register_op<OperatorEvaluatorMul<Color, Color, Color>>(Variant::OP_MULTIPLY, Variant::COLOR, Variant::COLOR);
  1323. register_op<OperatorEvaluatorMul<Color, Color, int64_t>>(Variant::OP_MULTIPLY, Variant::COLOR, Variant::INT);
  1324. register_op<OperatorEvaluatorMul<Color, int64_t, Color>>(Variant::OP_MULTIPLY, Variant::INT, Variant::COLOR);
  1325. register_op<OperatorEvaluatorMul<Color, Color, double>>(Variant::OP_MULTIPLY, Variant::COLOR, Variant::FLOAT);
  1326. register_op<OperatorEvaluatorMul<Color, double, Color>>(Variant::OP_MULTIPLY, Variant::FLOAT, Variant::COLOR);
  1327. register_op<OperatorEvaluatorDivNZ<int64_t, int64_t, int64_t>>(Variant::OP_DIVIDE, Variant::INT, Variant::INT);
  1328. register_op<OperatorEvaluatorDiv<double, double, int64_t>>(Variant::OP_DIVIDE, Variant::FLOAT, Variant::INT);
  1329. register_op<OperatorEvaluatorDiv<double, int64_t, double>>(Variant::OP_DIVIDE, Variant::INT, Variant::FLOAT);
  1330. register_op<OperatorEvaluatorDiv<double, double, double>>(Variant::OP_DIVIDE, Variant::FLOAT, Variant::FLOAT);
  1331. register_op<OperatorEvaluatorDiv<Vector2, Vector2, Vector2>>(Variant::OP_DIVIDE, Variant::VECTOR2, Variant::VECTOR2);
  1332. register_op<OperatorEvaluatorDiv<Vector2, Vector2, double>>(Variant::OP_DIVIDE, Variant::VECTOR2, Variant::FLOAT);
  1333. register_op<OperatorEvaluatorDiv<Vector2, Vector2, int64_t>>(Variant::OP_DIVIDE, Variant::VECTOR2, Variant::INT);
  1334. register_op<OperatorEvaluatorDiv<Vector2i, Vector2i, Vector2i>>(Variant::OP_DIVIDE, Variant::VECTOR2I, Variant::VECTOR2I);
  1335. register_op<OperatorEvaluatorDivNZ<Vector2i, Vector2i, double>>(Variant::OP_DIVIDE, Variant::VECTOR2I, Variant::FLOAT);
  1336. register_op<OperatorEvaluatorDivNZ<Vector2i, Vector2i, int64_t>>(Variant::OP_DIVIDE, Variant::VECTOR2I, Variant::INT);
  1337. register_op<OperatorEvaluatorDiv<Vector2, Vector2, Vector2>>(Variant::OP_DIVIDE, Variant::VECTOR2, Variant::VECTOR2);
  1338. register_op<OperatorEvaluatorDiv<Vector2, Vector2, double>>(Variant::OP_DIVIDE, Variant::VECTOR2, Variant::FLOAT);
  1339. register_op<OperatorEvaluatorDiv<Vector2, Vector2, int64_t>>(Variant::OP_DIVIDE, Variant::VECTOR2, Variant::INT);
  1340. register_op<OperatorEvaluatorDiv<Vector3, Vector3, Vector3>>(Variant::OP_DIVIDE, Variant::VECTOR3, Variant::VECTOR3);
  1341. register_op<OperatorEvaluatorDiv<Vector3, Vector3, double>>(Variant::OP_DIVIDE, Variant::VECTOR3, Variant::FLOAT);
  1342. register_op<OperatorEvaluatorDiv<Vector3, Vector3, int64_t>>(Variant::OP_DIVIDE, Variant::VECTOR3, Variant::INT);
  1343. register_op<OperatorEvaluatorDiv<Vector3i, Vector3i, Vector3i>>(Variant::OP_DIVIDE, Variant::VECTOR3I, Variant::VECTOR3I);
  1344. register_op<OperatorEvaluatorDivNZ<Vector3i, Vector3i, double>>(Variant::OP_DIVIDE, Variant::VECTOR3I, Variant::FLOAT);
  1345. register_op<OperatorEvaluatorDivNZ<Vector3i, Vector3i, int64_t>>(Variant::OP_DIVIDE, Variant::VECTOR3I, Variant::INT);
  1346. register_op<OperatorEvaluatorDiv<Quat, Quat, double>>(Variant::OP_DIVIDE, Variant::QUAT, Variant::FLOAT);
  1347. register_op<OperatorEvaluatorDiv<Quat, Quat, int64_t>>(Variant::OP_DIVIDE, Variant::QUAT, Variant::INT);
  1348. register_op<OperatorEvaluatorDiv<Color, Color, Color>>(Variant::OP_DIVIDE, Variant::COLOR, Variant::COLOR);
  1349. register_op<OperatorEvaluatorDiv<Color, Color, double>>(Variant::OP_DIVIDE, Variant::COLOR, Variant::FLOAT);
  1350. register_op<OperatorEvaluatorDiv<Color, Color, int64_t>>(Variant::OP_DIVIDE, Variant::COLOR, Variant::INT);
  1351. register_op<OperatorEvaluatorModNZ<int64_t, int64_t, int64_t>>(Variant::OP_MODULE, Variant::INT, Variant::INT);
  1352. register_op<OperatorEvaluatorMod<Vector2i, Vector2i, Vector2i>>(Variant::OP_MODULE, Variant::VECTOR2I, Variant::VECTOR2I);
  1353. register_op<OperatorEvaluatorModNZ<Vector2i, Vector2i, int64_t>>(Variant::OP_MODULE, Variant::VECTOR2I, Variant::INT);
  1354. register_op<OperatorEvaluatorMod<Vector3i, Vector3i, Vector3i>>(Variant::OP_MODULE, Variant::VECTOR3I, Variant::VECTOR3I);
  1355. register_op<OperatorEvaluatorModNZ<Vector3i, Vector3i, int64_t>>(Variant::OP_MODULE, Variant::VECTOR3I, Variant::INT);
  1356. register_op<OperatorEvaluatorStringModNil>(Variant::OP_MODULE, Variant::STRING, Variant::NIL);
  1357. register_op<OperatorEvaluatorStringModT<bool>>(Variant::OP_MODULE, Variant::STRING, Variant::BOOL);
  1358. register_op<OperatorEvaluatorStringModT<int64_t>>(Variant::OP_MODULE, Variant::STRING, Variant::INT);
  1359. register_op<OperatorEvaluatorStringModT<double>>(Variant::OP_MODULE, Variant::STRING, Variant::FLOAT);
  1360. register_op<OperatorEvaluatorStringModT<String>>(Variant::OP_MODULE, Variant::STRING, Variant::STRING);
  1361. register_op<OperatorEvaluatorStringModT<Vector2>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR2);
  1362. register_op<OperatorEvaluatorStringModT<Vector2i>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR2I);
  1363. register_op<OperatorEvaluatorStringModT<Rect2>>(Variant::OP_MODULE, Variant::STRING, Variant::RECT2);
  1364. register_op<OperatorEvaluatorStringModT<Rect2i>>(Variant::OP_MODULE, Variant::STRING, Variant::RECT2I);
  1365. register_op<OperatorEvaluatorStringModT<Vector3>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR3);
  1366. register_op<OperatorEvaluatorStringModT<Vector3i>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR3I);
  1367. register_op<OperatorEvaluatorStringModT<Transform2D>>(Variant::OP_MODULE, Variant::STRING, Variant::TRANSFORM2D);
  1368. register_op<OperatorEvaluatorStringModT<Plane>>(Variant::OP_MODULE, Variant::STRING, Variant::PLANE);
  1369. register_op<OperatorEvaluatorStringModT<Quat>>(Variant::OP_MODULE, Variant::STRING, Variant::QUAT);
  1370. register_op<OperatorEvaluatorStringModT<::AABB>>(Variant::OP_MODULE, Variant::STRING, Variant::AABB);
  1371. register_op<OperatorEvaluatorStringModT<Basis>>(Variant::OP_MODULE, Variant::STRING, Variant::BASIS);
  1372. register_op<OperatorEvaluatorStringModT<Transform>>(Variant::OP_MODULE, Variant::STRING, Variant::TRANSFORM);
  1373. register_op<OperatorEvaluatorStringModT<Color>>(Variant::OP_MODULE, Variant::STRING, Variant::COLOR);
  1374. register_op<OperatorEvaluatorStringModT<StringName>>(Variant::OP_MODULE, Variant::STRING, Variant::STRING_NAME);
  1375. register_op<OperatorEvaluatorStringModT<NodePath>>(Variant::OP_MODULE, Variant::STRING, Variant::NODE_PATH);
  1376. register_op<OperatorEvaluatorStringModObject>(Variant::OP_MODULE, Variant::STRING, Variant::OBJECT);
  1377. register_op<OperatorEvaluatorStringModT<Callable>>(Variant::OP_MODULE, Variant::STRING, Variant::CALLABLE);
  1378. register_op<OperatorEvaluatorStringModT<Signal>>(Variant::OP_MODULE, Variant::STRING, Variant::SIGNAL);
  1379. register_op<OperatorEvaluatorStringModT<Dictionary>>(Variant::OP_MODULE, Variant::STRING, Variant::DICTIONARY);
  1380. register_op<OperatorEvaluatorStringModArray>(Variant::OP_MODULE, Variant::STRING, Variant::ARRAY);
  1381. register_op<OperatorEvaluatorStringModT<PackedByteArray>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_BYTE_ARRAY);
  1382. register_op<OperatorEvaluatorStringModT<PackedInt32Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_INT32_ARRAY);
  1383. register_op<OperatorEvaluatorStringModT<PackedInt64Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_INT64_ARRAY);
  1384. register_op<OperatorEvaluatorStringModT<PackedFloat32Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_FLOAT32_ARRAY);
  1385. register_op<OperatorEvaluatorStringModT<PackedFloat64Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_FLOAT64_ARRAY);
  1386. register_op<OperatorEvaluatorStringModT<PackedStringArray>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_STRING_ARRAY);
  1387. register_op<OperatorEvaluatorStringModT<PackedVector2Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_VECTOR2_ARRAY);
  1388. register_op<OperatorEvaluatorStringModT<PackedVector3Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_VECTOR3_ARRAY);
  1389. register_op<OperatorEvaluatorStringModT<PackedColorArray>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_COLOR_ARRAY);
  1390. register_op<OperatorEvaluatorNeg<int64_t, int64_t>>(Variant::OP_NEGATE, Variant::INT, Variant::NIL);
  1391. register_op<OperatorEvaluatorNeg<double, double>>(Variant::OP_NEGATE, Variant::FLOAT, Variant::NIL);
  1392. register_op<OperatorEvaluatorNeg<Vector2, Vector2>>(Variant::OP_NEGATE, Variant::VECTOR2, Variant::NIL);
  1393. register_op<OperatorEvaluatorNeg<Vector2i, Vector2i>>(Variant::OP_NEGATE, Variant::VECTOR2I, Variant::NIL);
  1394. register_op<OperatorEvaluatorNeg<Vector3, Vector3>>(Variant::OP_NEGATE, Variant::VECTOR3, Variant::NIL);
  1395. register_op<OperatorEvaluatorNeg<Vector3i, Vector3i>>(Variant::OP_NEGATE, Variant::VECTOR3I, Variant::NIL);
  1396. register_op<OperatorEvaluatorNeg<Quat, Quat>>(Variant::OP_NEGATE, Variant::QUAT, Variant::NIL);
  1397. register_op<OperatorEvaluatorNeg<Plane, Plane>>(Variant::OP_NEGATE, Variant::PLANE, Variant::NIL);
  1398. register_op<OperatorEvaluatorNeg<Color, Color>>(Variant::OP_NEGATE, Variant::COLOR, Variant::NIL);
  1399. register_op<OperatorEvaluatorPos<int64_t, int64_t>>(Variant::OP_POSITIVE, Variant::INT, Variant::NIL);
  1400. register_op<OperatorEvaluatorPos<double, double>>(Variant::OP_POSITIVE, Variant::FLOAT, Variant::NIL);
  1401. register_op<OperatorEvaluatorPos<Vector2, Vector2>>(Variant::OP_POSITIVE, Variant::VECTOR2, Variant::NIL);
  1402. register_op<OperatorEvaluatorPos<Vector2i, Vector2i>>(Variant::OP_POSITIVE, Variant::VECTOR2I, Variant::NIL);
  1403. register_op<OperatorEvaluatorPos<Vector3, Vector3>>(Variant::OP_POSITIVE, Variant::VECTOR3, Variant::NIL);
  1404. register_op<OperatorEvaluatorPos<Vector3i, Vector3i>>(Variant::OP_POSITIVE, Variant::VECTOR3I, Variant::NIL);
  1405. register_op<OperatorEvaluatorPos<Quat, Quat>>(Variant::OP_POSITIVE, Variant::QUAT, Variant::NIL);
  1406. register_op<OperatorEvaluatorPos<Plane, Plane>>(Variant::OP_POSITIVE, Variant::PLANE, Variant::NIL);
  1407. register_op<OperatorEvaluatorPos<Color, Color>>(Variant::OP_POSITIVE, Variant::COLOR, Variant::NIL);
  1408. register_op<OperatorEvaluatorShiftLeft<int64_t, int64_t, int64_t>>(Variant::OP_SHIFT_LEFT, Variant::INT, Variant::INT);
  1409. register_op<OperatorEvaluatorShiftRight<int64_t, int64_t, int64_t>>(Variant::OP_SHIFT_RIGHT, Variant::INT, Variant::INT);
  1410. register_op<OperatorEvaluatorBitOr<int64_t, int64_t, int64_t>>(Variant::OP_BIT_OR, Variant::INT, Variant::INT);
  1411. register_op<OperatorEvaluatorBitAnd<int64_t, int64_t, int64_t>>(Variant::OP_BIT_AND, Variant::INT, Variant::INT);
  1412. register_op<OperatorEvaluatorBitXor<int64_t, int64_t, int64_t>>(Variant::OP_BIT_XOR, Variant::INT, Variant::INT);
  1413. register_op<OperatorEvaluatorBitNeg<int64_t, int64_t>>(Variant::OP_BIT_NEGATE, Variant::INT, Variant::NIL);
  1414. register_op<OperatorEvaluatorBitNeg<int64_t, int64_t>>(Variant::OP_BIT_NEGATE, Variant::INT, Variant::NIL);
  1415. register_op<OperatorEvaluatorAlwaysTrue<Variant::OP_EQUAL, Variant::NIL, Variant::NIL>>(Variant::OP_EQUAL, Variant::NIL, Variant::NIL);
  1416. register_op<OperatorEvaluatorEqual<bool, bool>>(Variant::OP_EQUAL, Variant::BOOL, Variant::BOOL);
  1417. register_op<OperatorEvaluatorEqual<int64_t, int64_t>>(Variant::OP_EQUAL, Variant::INT, Variant::INT);
  1418. register_op<OperatorEvaluatorEqual<int64_t, double>>(Variant::OP_EQUAL, Variant::INT, Variant::FLOAT);
  1419. register_op<OperatorEvaluatorEqual<double, int64_t>>(Variant::OP_EQUAL, Variant::FLOAT, Variant::INT);
  1420. register_op<OperatorEvaluatorEqual<double, double>>(Variant::OP_EQUAL, Variant::FLOAT, Variant::FLOAT);
  1421. register_op<OperatorEvaluatorEqual<String, String>>(Variant::OP_EQUAL, Variant::STRING, Variant::STRING);
  1422. register_op<OperatorEvaluatorEqual<Vector2, Vector2>>(Variant::OP_EQUAL, Variant::VECTOR2, Variant::VECTOR2);
  1423. register_op<OperatorEvaluatorEqual<Vector2i, Vector2i>>(Variant::OP_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I);
  1424. register_op<OperatorEvaluatorEqual<Rect2, Rect2>>(Variant::OP_EQUAL, Variant::RECT2, Variant::RECT2);
  1425. register_op<OperatorEvaluatorEqual<Rect2i, Rect2i>>(Variant::OP_EQUAL, Variant::RECT2I, Variant::RECT2I);
  1426. register_op<OperatorEvaluatorEqual<Vector3, Vector3>>(Variant::OP_EQUAL, Variant::VECTOR3, Variant::VECTOR3);
  1427. register_op<OperatorEvaluatorEqual<Vector3i, Vector3i>>(Variant::OP_EQUAL, Variant::VECTOR3I, Variant::VECTOR3I);
  1428. register_op<OperatorEvaluatorEqual<Transform2D, Transform2D>>(Variant::OP_EQUAL, Variant::TRANSFORM2D, Variant::TRANSFORM2D);
  1429. register_op<OperatorEvaluatorEqual<Plane, Plane>>(Variant::OP_EQUAL, Variant::PLANE, Variant::PLANE);
  1430. register_op<OperatorEvaluatorEqual<Quat, Quat>>(Variant::OP_EQUAL, Variant::QUAT, Variant::QUAT);
  1431. register_op<OperatorEvaluatorEqual<::AABB, ::AABB>>(Variant::OP_EQUAL, Variant::AABB, Variant::AABB);
  1432. register_op<OperatorEvaluatorEqual<Basis, Basis>>(Variant::OP_EQUAL, Variant::BASIS, Variant::BASIS);
  1433. register_op<OperatorEvaluatorEqual<Transform, Transform>>(Variant::OP_EQUAL, Variant::TRANSFORM, Variant::TRANSFORM);
  1434. register_op<OperatorEvaluatorEqual<Color, Color>>(Variant::OP_EQUAL, Variant::COLOR, Variant::COLOR);
  1435. register_op<OperatorEvaluatorEqual<StringName, String>>(Variant::OP_EQUAL, Variant::STRING_NAME, Variant::STRING);
  1436. register_op<OperatorEvaluatorEqual<String, StringName>>(Variant::OP_EQUAL, Variant::STRING, Variant::STRING_NAME);
  1437. register_op<OperatorEvaluatorEqual<StringName, StringName>>(Variant::OP_EQUAL, Variant::STRING_NAME, Variant::STRING_NAME);
  1438. register_op<OperatorEvaluatorEqual<NodePath, NodePath>>(Variant::OP_EQUAL, Variant::NODE_PATH, Variant::NODE_PATH);
  1439. register_op<OperatorEvaluatorEqual<::RID, ::RID>>(Variant::OP_EQUAL, Variant::RID, Variant::RID);
  1440. register_op<OperatorEvaluatorEqualObject>(Variant::OP_EQUAL, Variant::OBJECT, Variant::OBJECT);
  1441. register_op<OperatorEvaluatorEqualObjectNil>(Variant::OP_EQUAL, Variant::OBJECT, Variant::NIL);
  1442. register_op<OperatorEvaluatorEqualNilObject>(Variant::OP_EQUAL, Variant::NIL, Variant::OBJECT);
  1443. register_op<OperatorEvaluatorEqual<Callable, Callable>>(Variant::OP_EQUAL, Variant::CALLABLE, Variant::CALLABLE);
  1444. register_op<OperatorEvaluatorEqual<Signal, Signal>>(Variant::OP_EQUAL, Variant::SIGNAL, Variant::SIGNAL);
  1445. register_op<OperatorEvaluatorEqual<Dictionary, Dictionary>>(Variant::OP_EQUAL, Variant::DICTIONARY, Variant::DICTIONARY);
  1446. register_op<OperatorEvaluatorEqual<Array, Array>>(Variant::OP_EQUAL, Variant::ARRAY, Variant::ARRAY);
  1447. register_op<OperatorEvaluatorEqual<PackedByteArray, PackedByteArray>>(Variant::OP_EQUAL, Variant::PACKED_BYTE_ARRAY, Variant::PACKED_BYTE_ARRAY);
  1448. register_op<OperatorEvaluatorEqual<PackedInt32Array, PackedInt32Array>>(Variant::OP_EQUAL, Variant::PACKED_INT32_ARRAY, Variant::PACKED_INT32_ARRAY);
  1449. register_op<OperatorEvaluatorEqual<PackedInt64Array, PackedInt64Array>>(Variant::OP_EQUAL, Variant::PACKED_INT64_ARRAY, Variant::PACKED_INT64_ARRAY);
  1450. register_op<OperatorEvaluatorEqual<PackedFloat32Array, PackedFloat32Array>>(Variant::OP_EQUAL, Variant::PACKED_FLOAT32_ARRAY, Variant::PACKED_FLOAT32_ARRAY);
  1451. register_op<OperatorEvaluatorEqual<PackedFloat64Array, PackedFloat64Array>>(Variant::OP_EQUAL, Variant::PACKED_FLOAT64_ARRAY, Variant::PACKED_FLOAT64_ARRAY);
  1452. register_op<OperatorEvaluatorEqual<PackedStringArray, PackedStringArray>>(Variant::OP_EQUAL, Variant::PACKED_STRING_ARRAY, Variant::PACKED_STRING_ARRAY);
  1453. register_op<OperatorEvaluatorEqual<PackedVector2Array, PackedVector2Array>>(Variant::OP_EQUAL, Variant::PACKED_VECTOR2_ARRAY, Variant::PACKED_VECTOR2_ARRAY);
  1454. register_op<OperatorEvaluatorEqual<PackedVector3Array, PackedVector3Array>>(Variant::OP_EQUAL, Variant::PACKED_VECTOR3_ARRAY, Variant::PACKED_VECTOR3_ARRAY);
  1455. register_op<OperatorEvaluatorEqual<PackedColorArray, PackedColorArray>>(Variant::OP_EQUAL, Variant::PACKED_COLOR_ARRAY, Variant::PACKED_COLOR_ARRAY);
  1456. register_op<OperatorEvaluatorAlwaysFalse<Variant::OP_NOT_EQUAL, Variant::NIL, Variant::NIL>>(Variant::OP_NOT_EQUAL, Variant::NIL, Variant::NIL);
  1457. register_op<OperatorEvaluatorNotEqual<bool, bool>>(Variant::OP_NOT_EQUAL, Variant::BOOL, Variant::BOOL);
  1458. register_op<OperatorEvaluatorNotEqual<int64_t, int64_t>>(Variant::OP_NOT_EQUAL, Variant::INT, Variant::INT);
  1459. register_op<OperatorEvaluatorNotEqual<int64_t, double>>(Variant::OP_NOT_EQUAL, Variant::INT, Variant::FLOAT);
  1460. register_op<OperatorEvaluatorNotEqual<double, int64_t>>(Variant::OP_NOT_EQUAL, Variant::FLOAT, Variant::INT);
  1461. register_op<OperatorEvaluatorNotEqual<double, double>>(Variant::OP_NOT_EQUAL, Variant::FLOAT, Variant::FLOAT);
  1462. register_op<OperatorEvaluatorNotEqual<String, String>>(Variant::OP_NOT_EQUAL, Variant::STRING, Variant::STRING);
  1463. register_op<OperatorEvaluatorNotEqual<Vector2, Vector2>>(Variant::OP_NOT_EQUAL, Variant::VECTOR2, Variant::VECTOR2);
  1464. register_op<OperatorEvaluatorNotEqual<Vector2i, Vector2i>>(Variant::OP_NOT_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I);
  1465. register_op<OperatorEvaluatorNotEqual<Rect2, Rect2>>(Variant::OP_NOT_EQUAL, Variant::RECT2, Variant::RECT2);
  1466. register_op<OperatorEvaluatorNotEqual<Rect2i, Rect2i>>(Variant::OP_NOT_EQUAL, Variant::RECT2I, Variant::RECT2I);
  1467. register_op<OperatorEvaluatorNotEqual<Vector3, Vector3>>(Variant::OP_NOT_EQUAL, Variant::VECTOR3, Variant::VECTOR3);
  1468. register_op<OperatorEvaluatorNotEqual<Vector3i, Vector3i>>(Variant::OP_NOT_EQUAL, Variant::VECTOR3I, Variant::VECTOR3I);
  1469. register_op<OperatorEvaluatorNotEqual<Transform2D, Transform2D>>(Variant::OP_NOT_EQUAL, Variant::TRANSFORM2D, Variant::TRANSFORM2D);
  1470. register_op<OperatorEvaluatorNotEqual<Plane, Plane>>(Variant::OP_NOT_EQUAL, Variant::PLANE, Variant::PLANE);
  1471. register_op<OperatorEvaluatorNotEqual<Quat, Quat>>(Variant::OP_NOT_EQUAL, Variant::QUAT, Variant::QUAT);
  1472. register_op<OperatorEvaluatorNotEqual<::AABB, ::AABB>>(Variant::OP_NOT_EQUAL, Variant::AABB, Variant::AABB);
  1473. register_op<OperatorEvaluatorNotEqual<Basis, Basis>>(Variant::OP_NOT_EQUAL, Variant::BASIS, Variant::BASIS);
  1474. register_op<OperatorEvaluatorNotEqual<Transform, Transform>>(Variant::OP_NOT_EQUAL, Variant::TRANSFORM, Variant::TRANSFORM);
  1475. register_op<OperatorEvaluatorNotEqual<Color, Color>>(Variant::OP_NOT_EQUAL, Variant::COLOR, Variant::COLOR);
  1476. register_op<OperatorEvaluatorNotEqual<StringName, String>>(Variant::OP_NOT_EQUAL, Variant::STRING_NAME, Variant::STRING);
  1477. register_op<OperatorEvaluatorNotEqual<String, StringName>>(Variant::OP_NOT_EQUAL, Variant::STRING, Variant::STRING_NAME);
  1478. register_op<OperatorEvaluatorNotEqual<StringName, StringName>>(Variant::OP_NOT_EQUAL, Variant::STRING_NAME, Variant::STRING_NAME);
  1479. register_op<OperatorEvaluatorNotEqual<NodePath, NodePath>>(Variant::OP_NOT_EQUAL, Variant::NODE_PATH, Variant::NODE_PATH);
  1480. register_op<OperatorEvaluatorNotEqual<::RID, ::RID>>(Variant::OP_NOT_EQUAL, Variant::RID, Variant::RID);
  1481. register_op<OperatorEvaluatorNotEqualObject>(Variant::OP_NOT_EQUAL, Variant::OBJECT, Variant::OBJECT);
  1482. register_op<OperatorEvaluatorNotEqualObjectNil>(Variant::OP_NOT_EQUAL, Variant::OBJECT, Variant::NIL);
  1483. register_op<OperatorEvaluatorNotEqualNilObject>(Variant::OP_NOT_EQUAL, Variant::NIL, Variant::OBJECT);
  1484. register_op<OperatorEvaluatorNotEqual<Callable, Callable>>(Variant::OP_NOT_EQUAL, Variant::CALLABLE, Variant::CALLABLE);
  1485. register_op<OperatorEvaluatorNotEqual<Signal, Signal>>(Variant::OP_NOT_EQUAL, Variant::SIGNAL, Variant::SIGNAL);
  1486. register_op<OperatorEvaluatorNotEqual<Dictionary, Dictionary>>(Variant::OP_NOT_EQUAL, Variant::DICTIONARY, Variant::DICTIONARY);
  1487. register_op<OperatorEvaluatorNotEqual<Array, Array>>(Variant::OP_NOT_EQUAL, Variant::ARRAY, Variant::ARRAY);
  1488. register_op<OperatorEvaluatorNotEqual<PackedByteArray, PackedByteArray>>(Variant::OP_NOT_EQUAL, Variant::PACKED_BYTE_ARRAY, Variant::PACKED_BYTE_ARRAY);
  1489. register_op<OperatorEvaluatorNotEqual<PackedInt32Array, PackedInt32Array>>(Variant::OP_NOT_EQUAL, Variant::PACKED_INT32_ARRAY, Variant::PACKED_INT32_ARRAY);
  1490. register_op<OperatorEvaluatorNotEqual<PackedInt64Array, PackedInt64Array>>(Variant::OP_NOT_EQUAL, Variant::PACKED_INT64_ARRAY, Variant::PACKED_INT64_ARRAY);
  1491. register_op<OperatorEvaluatorNotEqual<PackedFloat32Array, PackedFloat32Array>>(Variant::OP_NOT_EQUAL, Variant::PACKED_FLOAT32_ARRAY, Variant::PACKED_FLOAT32_ARRAY);
  1492. register_op<OperatorEvaluatorNotEqual<PackedFloat64Array, PackedFloat64Array>>(Variant::OP_NOT_EQUAL, Variant::PACKED_FLOAT64_ARRAY, Variant::PACKED_FLOAT64_ARRAY);
  1493. register_op<OperatorEvaluatorNotEqual<PackedStringArray, PackedStringArray>>(Variant::OP_NOT_EQUAL, Variant::PACKED_STRING_ARRAY, Variant::PACKED_STRING_ARRAY);
  1494. register_op<OperatorEvaluatorNotEqual<PackedVector2Array, PackedVector2Array>>(Variant::OP_NOT_EQUAL, Variant::PACKED_VECTOR2_ARRAY, Variant::PACKED_VECTOR2_ARRAY);
  1495. register_op<OperatorEvaluatorNotEqual<PackedVector3Array, PackedVector3Array>>(Variant::OP_NOT_EQUAL, Variant::PACKED_VECTOR3_ARRAY, Variant::PACKED_VECTOR3_ARRAY);
  1496. register_op<OperatorEvaluatorNotEqual<PackedColorArray, PackedColorArray>>(Variant::OP_NOT_EQUAL, Variant::PACKED_COLOR_ARRAY, Variant::PACKED_COLOR_ARRAY);
  1497. register_op<OperatorEvaluatorLess<bool, bool>>(Variant::OP_LESS, Variant::BOOL, Variant::BOOL);
  1498. register_op<OperatorEvaluatorLess<int64_t, int64_t>>(Variant::OP_LESS, Variant::INT, Variant::INT);
  1499. register_op<OperatorEvaluatorLess<int64_t, double>>(Variant::OP_LESS, Variant::INT, Variant::FLOAT);
  1500. register_op<OperatorEvaluatorLess<double, int64_t>>(Variant::OP_LESS, Variant::FLOAT, Variant::INT);
  1501. register_op<OperatorEvaluatorLess<double, double>>(Variant::OP_LESS, Variant::FLOAT, Variant::FLOAT);
  1502. register_op<OperatorEvaluatorLess<String, String>>(Variant::OP_LESS, Variant::STRING, Variant::STRING);
  1503. register_op<OperatorEvaluatorLess<Vector2, Vector2>>(Variant::OP_LESS, Variant::VECTOR2, Variant::VECTOR2);
  1504. register_op<OperatorEvaluatorLess<Vector2i, Vector2i>>(Variant::OP_LESS, Variant::VECTOR2I, Variant::VECTOR2I);
  1505. register_op<OperatorEvaluatorLess<Vector3, Vector3>>(Variant::OP_LESS, Variant::VECTOR3, Variant::VECTOR3);
  1506. register_op<OperatorEvaluatorLess<Vector3i, Vector3i>>(Variant::OP_LESS, Variant::VECTOR3I, Variant::VECTOR3I);
  1507. register_op<OperatorEvaluatorLess<::RID, ::RID>>(Variant::OP_LESS, Variant::RID, Variant::RID);
  1508. register_op<OperatorEvaluatorLess<Array, Array>>(Variant::OP_LESS, Variant::ARRAY, Variant::ARRAY);
  1509. register_op<OperatorEvaluatorLessEqual<int64_t, int64_t>>(Variant::OP_LESS_EQUAL, Variant::INT, Variant::INT);
  1510. register_op<OperatorEvaluatorLessEqual<int64_t, double>>(Variant::OP_LESS_EQUAL, Variant::INT, Variant::FLOAT);
  1511. register_op<OperatorEvaluatorLessEqual<double, int64_t>>(Variant::OP_LESS_EQUAL, Variant::FLOAT, Variant::INT);
  1512. register_op<OperatorEvaluatorLessEqual<double, double>>(Variant::OP_LESS_EQUAL, Variant::FLOAT, Variant::FLOAT);
  1513. register_op<OperatorEvaluatorLessEqual<String, String>>(Variant::OP_LESS_EQUAL, Variant::STRING, Variant::STRING);
  1514. register_op<OperatorEvaluatorLessEqual<Vector2, Vector2>>(Variant::OP_LESS_EQUAL, Variant::VECTOR2, Variant::VECTOR2);
  1515. register_op<OperatorEvaluatorLessEqual<Vector2i, Vector2i>>(Variant::OP_LESS_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I);
  1516. register_op<OperatorEvaluatorLessEqual<Vector3, Vector3>>(Variant::OP_LESS_EQUAL, Variant::VECTOR3, Variant::VECTOR3);
  1517. register_op<OperatorEvaluatorLessEqual<Vector3i, Vector3i>>(Variant::OP_LESS_EQUAL, Variant::VECTOR3I, Variant::VECTOR3I);
  1518. register_op<OperatorEvaluatorLessEqual<::RID, ::RID>>(Variant::OP_LESS_EQUAL, Variant::RID, Variant::RID);
  1519. register_op<OperatorEvaluatorLessEqual<Array, Array>>(Variant::OP_LESS_EQUAL, Variant::ARRAY, Variant::ARRAY);
  1520. register_op<OperatorEvaluatorGreater<bool, bool>>(Variant::OP_GREATER, Variant::BOOL, Variant::BOOL);
  1521. register_op<OperatorEvaluatorGreater<int64_t, int64_t>>(Variant::OP_GREATER, Variant::INT, Variant::INT);
  1522. register_op<OperatorEvaluatorGreater<int64_t, double>>(Variant::OP_GREATER, Variant::INT, Variant::FLOAT);
  1523. register_op<OperatorEvaluatorGreater<double, int64_t>>(Variant::OP_GREATER, Variant::FLOAT, Variant::INT);
  1524. register_op<OperatorEvaluatorGreater<double, double>>(Variant::OP_GREATER, Variant::FLOAT, Variant::FLOAT);
  1525. register_op<OperatorEvaluatorGreater<String, String>>(Variant::OP_GREATER, Variant::STRING, Variant::STRING);
  1526. register_op<OperatorEvaluatorGreater<Vector2, Vector2>>(Variant::OP_GREATER, Variant::VECTOR2, Variant::VECTOR2);
  1527. register_op<OperatorEvaluatorGreater<Vector2i, Vector2i>>(Variant::OP_GREATER, Variant::VECTOR2I, Variant::VECTOR2I);
  1528. register_op<OperatorEvaluatorGreater<Vector3, Vector3>>(Variant::OP_GREATER, Variant::VECTOR3, Variant::VECTOR3);
  1529. register_op<OperatorEvaluatorGreater<Vector3i, Vector3i>>(Variant::OP_GREATER, Variant::VECTOR3I, Variant::VECTOR3I);
  1530. register_op<OperatorEvaluatorGreater<::RID, ::RID>>(Variant::OP_GREATER, Variant::RID, Variant::RID);
  1531. register_op<OperatorEvaluatorGreater<Array, Array>>(Variant::OP_GREATER, Variant::ARRAY, Variant::ARRAY);
  1532. register_op<OperatorEvaluatorGreaterEqual<int64_t, int64_t>>(Variant::OP_GREATER_EQUAL, Variant::INT, Variant::INT);
  1533. register_op<OperatorEvaluatorGreaterEqual<int64_t, double>>(Variant::OP_GREATER_EQUAL, Variant::INT, Variant::FLOAT);
  1534. register_op<OperatorEvaluatorGreaterEqual<double, int64_t>>(Variant::OP_GREATER_EQUAL, Variant::FLOAT, Variant::INT);
  1535. register_op<OperatorEvaluatorGreaterEqual<double, double>>(Variant::OP_GREATER_EQUAL, Variant::FLOAT, Variant::FLOAT);
  1536. register_op<OperatorEvaluatorGreaterEqual<String, String>>(Variant::OP_GREATER_EQUAL, Variant::STRING, Variant::STRING);
  1537. register_op<OperatorEvaluatorGreaterEqual<Vector2, Vector2>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR2, Variant::VECTOR2);
  1538. register_op<OperatorEvaluatorGreaterEqual<Vector2i, Vector2i>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I);
  1539. register_op<OperatorEvaluatorGreaterEqual<Vector3, Vector3>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR3, Variant::VECTOR3);
  1540. register_op<OperatorEvaluatorGreaterEqual<Vector3i, Vector3i>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR3I, Variant::VECTOR3I);
  1541. register_op<OperatorEvaluatorGreaterEqual<::RID, ::RID>>(Variant::OP_GREATER_EQUAL, Variant::RID, Variant::RID);
  1542. register_op<OperatorEvaluatorGreaterEqual<Array, Array>>(Variant::OP_GREATER_EQUAL, Variant::ARRAY, Variant::ARRAY);
  1543. register_op<OperatorEvaluatorAlwaysFalse<Variant::OP_OR, Variant::NIL, Variant::NIL>>(Variant::OP_OR, Variant::NIL, Variant::NIL);
  1544. // OR
  1545. register_op<OperatorEvaluatorNilXBoolOr>(Variant::OP_OR, Variant::NIL, Variant::BOOL);
  1546. register_op<OperatorEvaluatorBoolXNilOr>(Variant::OP_OR, Variant::BOOL, Variant::NIL);
  1547. register_op<OperatorEvaluatorNilXIntOr>(Variant::OP_OR, Variant::NIL, Variant::INT);
  1548. register_op<OperatorEvaluatorIntXNilOr>(Variant::OP_OR, Variant::INT, Variant::NIL);
  1549. register_op<OperatorEvaluatorNilXFloatOr>(Variant::OP_OR, Variant::NIL, Variant::FLOAT);
  1550. register_op<OperatorEvaluatorFloatXNilOr>(Variant::OP_OR, Variant::FLOAT, Variant::NIL);
  1551. register_op<OperatorEvaluatorNilXObjectOr>(Variant::OP_OR, Variant::NIL, Variant::OBJECT);
  1552. register_op<OperatorEvaluatorObjectXNilOr>(Variant::OP_OR, Variant::OBJECT, Variant::NIL);
  1553. register_op<OperatorEvaluatorBoolXBoolOr>(Variant::OP_OR, Variant::BOOL, Variant::BOOL);
  1554. register_op<OperatorEvaluatorBoolXIntOr>(Variant::OP_OR, Variant::BOOL, Variant::INT);
  1555. register_op<OperatorEvaluatorIntXBoolOr>(Variant::OP_OR, Variant::INT, Variant::BOOL);
  1556. register_op<OperatorEvaluatorBoolXFloatOr>(Variant::OP_OR, Variant::BOOL, Variant::FLOAT);
  1557. register_op<OperatorEvaluatorFloatXBoolOr>(Variant::OP_OR, Variant::FLOAT, Variant::BOOL);
  1558. register_op<OperatorEvaluatorBoolXObjectOr>(Variant::OP_OR, Variant::BOOL, Variant::OBJECT);
  1559. register_op<OperatorEvaluatorObjectXBoolOr>(Variant::OP_OR, Variant::OBJECT, Variant::BOOL);
  1560. register_op<OperatorEvaluatorIntXIntOr>(Variant::OP_OR, Variant::INT, Variant::INT);
  1561. register_op<OperatorEvaluatorIntXFloatOr>(Variant::OP_OR, Variant::INT, Variant::FLOAT);
  1562. register_op<OperatorEvaluatorFloatXIntOr>(Variant::OP_OR, Variant::FLOAT, Variant::INT);
  1563. register_op<OperatorEvaluatorIntXObjectOr>(Variant::OP_OR, Variant::INT, Variant::OBJECT);
  1564. register_op<OperatorEvaluatorObjectXIntOr>(Variant::OP_OR, Variant::OBJECT, Variant::INT);
  1565. register_op<OperatorEvaluatorFloatXFloatOr>(Variant::OP_OR, Variant::FLOAT, Variant::FLOAT);
  1566. register_op<OperatorEvaluatorFloatXObjectOr>(Variant::OP_OR, Variant::FLOAT, Variant::OBJECT);
  1567. register_op<OperatorEvaluatorObjectXFloatOr>(Variant::OP_OR, Variant::OBJECT, Variant::FLOAT);
  1568. register_op<OperatorEvaluatorObjectXObjectOr>(Variant::OP_OR, Variant::OBJECT, Variant::OBJECT);
  1569. // AND
  1570. register_op<OperatorEvaluatorNilXBoolAnd>(Variant::OP_AND, Variant::NIL, Variant::BOOL);
  1571. register_op<OperatorEvaluatorBoolXNilAnd>(Variant::OP_AND, Variant::BOOL, Variant::NIL);
  1572. register_op<OperatorEvaluatorNilXIntAnd>(Variant::OP_AND, Variant::NIL, Variant::INT);
  1573. register_op<OperatorEvaluatorIntXNilAnd>(Variant::OP_AND, Variant::INT, Variant::NIL);
  1574. register_op<OperatorEvaluatorNilXFloatAnd>(Variant::OP_AND, Variant::NIL, Variant::FLOAT);
  1575. register_op<OperatorEvaluatorFloatXNilAnd>(Variant::OP_AND, Variant::FLOAT, Variant::NIL);
  1576. register_op<OperatorEvaluatorNilXObjectAnd>(Variant::OP_AND, Variant::NIL, Variant::OBJECT);
  1577. register_op<OperatorEvaluatorObjectXNilAnd>(Variant::OP_AND, Variant::OBJECT, Variant::NIL);
  1578. register_op<OperatorEvaluatorBoolXBoolAnd>(Variant::OP_AND, Variant::BOOL, Variant::BOOL);
  1579. register_op<OperatorEvaluatorBoolXIntAnd>(Variant::OP_AND, Variant::BOOL, Variant::INT);
  1580. register_op<OperatorEvaluatorIntXBoolAnd>(Variant::OP_AND, Variant::INT, Variant::BOOL);
  1581. register_op<OperatorEvaluatorBoolXFloatAnd>(Variant::OP_AND, Variant::BOOL, Variant::FLOAT);
  1582. register_op<OperatorEvaluatorFloatXBoolAnd>(Variant::OP_AND, Variant::FLOAT, Variant::BOOL);
  1583. register_op<OperatorEvaluatorBoolXObjectAnd>(Variant::OP_AND, Variant::BOOL, Variant::OBJECT);
  1584. register_op<OperatorEvaluatorObjectXBoolAnd>(Variant::OP_AND, Variant::OBJECT, Variant::BOOL);
  1585. register_op<OperatorEvaluatorIntXIntAnd>(Variant::OP_AND, Variant::INT, Variant::INT);
  1586. register_op<OperatorEvaluatorIntXFloatAnd>(Variant::OP_AND, Variant::INT, Variant::FLOAT);
  1587. register_op<OperatorEvaluatorFloatXIntAnd>(Variant::OP_AND, Variant::FLOAT, Variant::INT);
  1588. register_op<OperatorEvaluatorIntXObjectAnd>(Variant::OP_AND, Variant::INT, Variant::OBJECT);
  1589. register_op<OperatorEvaluatorObjectXIntAnd>(Variant::OP_AND, Variant::OBJECT, Variant::INT);
  1590. register_op<OperatorEvaluatorFloatXFloatAnd>(Variant::OP_AND, Variant::FLOAT, Variant::FLOAT);
  1591. register_op<OperatorEvaluatorFloatXObjectAnd>(Variant::OP_AND, Variant::FLOAT, Variant::OBJECT);
  1592. register_op<OperatorEvaluatorObjectXFloatAnd>(Variant::OP_AND, Variant::OBJECT, Variant::FLOAT);
  1593. register_op<OperatorEvaluatorObjectXObjectAnd>(Variant::OP_AND, Variant::OBJECT, Variant::OBJECT);
  1594. // XOR
  1595. register_op<OperatorEvaluatorNilXBoolXor>(Variant::OP_XOR, Variant::NIL, Variant::BOOL);
  1596. register_op<OperatorEvaluatorBoolXNilXor>(Variant::OP_XOR, Variant::BOOL, Variant::NIL);
  1597. register_op<OperatorEvaluatorNilXIntXor>(Variant::OP_XOR, Variant::NIL, Variant::INT);
  1598. register_op<OperatorEvaluatorIntXNilXor>(Variant::OP_XOR, Variant::INT, Variant::NIL);
  1599. register_op<OperatorEvaluatorNilXFloatXor>(Variant::OP_XOR, Variant::NIL, Variant::FLOAT);
  1600. register_op<OperatorEvaluatorFloatXNilXor>(Variant::OP_XOR, Variant::FLOAT, Variant::NIL);
  1601. register_op<OperatorEvaluatorNilXObjectXor>(Variant::OP_XOR, Variant::NIL, Variant::OBJECT);
  1602. register_op<OperatorEvaluatorObjectXNilXor>(Variant::OP_XOR, Variant::OBJECT, Variant::NIL);
  1603. register_op<OperatorEvaluatorBoolXBoolXor>(Variant::OP_XOR, Variant::BOOL, Variant::BOOL);
  1604. register_op<OperatorEvaluatorBoolXIntXor>(Variant::OP_XOR, Variant::BOOL, Variant::INT);
  1605. register_op<OperatorEvaluatorIntXBoolXor>(Variant::OP_XOR, Variant::INT, Variant::BOOL);
  1606. register_op<OperatorEvaluatorBoolXFloatXor>(Variant::OP_XOR, Variant::BOOL, Variant::FLOAT);
  1607. register_op<OperatorEvaluatorFloatXBoolXor>(Variant::OP_XOR, Variant::FLOAT, Variant::BOOL);
  1608. register_op<OperatorEvaluatorBoolXObjectXor>(Variant::OP_XOR, Variant::BOOL, Variant::OBJECT);
  1609. register_op<OperatorEvaluatorObjectXBoolXor>(Variant::OP_XOR, Variant::OBJECT, Variant::BOOL);
  1610. register_op<OperatorEvaluatorIntXIntXor>(Variant::OP_XOR, Variant::INT, Variant::INT);
  1611. register_op<OperatorEvaluatorIntXFloatXor>(Variant::OP_XOR, Variant::INT, Variant::FLOAT);
  1612. register_op<OperatorEvaluatorFloatXIntXor>(Variant::OP_XOR, Variant::FLOAT, Variant::INT);
  1613. register_op<OperatorEvaluatorIntXObjectXor>(Variant::OP_XOR, Variant::INT, Variant::OBJECT);
  1614. register_op<OperatorEvaluatorObjectXIntXor>(Variant::OP_XOR, Variant::OBJECT, Variant::INT);
  1615. register_op<OperatorEvaluatorFloatXFloatXor>(Variant::OP_XOR, Variant::FLOAT, Variant::FLOAT);
  1616. register_op<OperatorEvaluatorFloatXObjectXor>(Variant::OP_XOR, Variant::FLOAT, Variant::OBJECT);
  1617. register_op<OperatorEvaluatorObjectXFloatXor>(Variant::OP_XOR, Variant::OBJECT, Variant::FLOAT);
  1618. register_op<OperatorEvaluatorObjectXObjectXor>(Variant::OP_XOR, Variant::OBJECT, Variant::OBJECT);
  1619. register_op<OperatorEvaluatorAlwaysTrue<Variant::OP_NOT, Variant::NIL, Variant::NIL>>(Variant::OP_NOT, Variant::NIL, Variant::NIL);
  1620. register_op<OperatorEvaluatorNotBool>(Variant::OP_NOT, Variant::BOOL, Variant::NIL);
  1621. register_op<OperatorEvaluatorNotInt>(Variant::OP_NOT, Variant::INT, Variant::NIL);
  1622. register_op<OperatorEvaluatorNotFloat>(Variant::OP_NOT, Variant::FLOAT, Variant::NIL);
  1623. register_op<OperatorEvaluatorNotObject>(Variant::OP_NOT, Variant::OBJECT, Variant::NIL);
  1624. register_op<OperatorEvaluatorInStringFind>(Variant::OP_IN, Variant::STRING, Variant::STRING);
  1625. register_op<OperatorEvaluatorInDictionaryHasNil>(Variant::OP_IN, Variant::NIL, Variant::DICTIONARY);
  1626. register_op<OperatorEvaluatorInDictionaryHas<bool>>(Variant::OP_IN, Variant::BOOL, Variant::DICTIONARY);
  1627. register_op<OperatorEvaluatorInDictionaryHas<int64_t>>(Variant::OP_IN, Variant::INT, Variant::DICTIONARY);
  1628. register_op<OperatorEvaluatorInDictionaryHas<double>>(Variant::OP_IN, Variant::FLOAT, Variant::DICTIONARY);
  1629. register_op<OperatorEvaluatorInDictionaryHas<String>>(Variant::OP_IN, Variant::STRING, Variant::DICTIONARY);
  1630. register_op<OperatorEvaluatorInDictionaryHas<Vector2>>(Variant::OP_IN, Variant::VECTOR2, Variant::DICTIONARY);
  1631. register_op<OperatorEvaluatorInDictionaryHas<Vector2i>>(Variant::OP_IN, Variant::VECTOR2I, Variant::DICTIONARY);
  1632. register_op<OperatorEvaluatorInDictionaryHas<Rect2>>(Variant::OP_IN, Variant::RECT2, Variant::DICTIONARY);
  1633. register_op<OperatorEvaluatorInDictionaryHas<Rect2i>>(Variant::OP_IN, Variant::RECT2I, Variant::DICTIONARY);
  1634. register_op<OperatorEvaluatorInDictionaryHas<Vector3>>(Variant::OP_IN, Variant::VECTOR3, Variant::DICTIONARY);
  1635. register_op<OperatorEvaluatorInDictionaryHas<Vector3i>>(Variant::OP_IN, Variant::VECTOR3I, Variant::DICTIONARY);
  1636. register_op<OperatorEvaluatorInDictionaryHas<Transform2D>>(Variant::OP_IN, Variant::TRANSFORM2D, Variant::DICTIONARY);
  1637. register_op<OperatorEvaluatorInDictionaryHas<Plane>>(Variant::OP_IN, Variant::PLANE, Variant::DICTIONARY);
  1638. register_op<OperatorEvaluatorInDictionaryHas<Quat>>(Variant::OP_IN, Variant::QUAT, Variant::DICTIONARY);
  1639. register_op<OperatorEvaluatorInDictionaryHas<::AABB>>(Variant::OP_IN, Variant::AABB, Variant::DICTIONARY);
  1640. register_op<OperatorEvaluatorInDictionaryHas<Basis>>(Variant::OP_IN, Variant::BASIS, Variant::DICTIONARY);
  1641. register_op<OperatorEvaluatorInDictionaryHas<Transform>>(Variant::OP_IN, Variant::TRANSFORM, Variant::DICTIONARY);
  1642. register_op<OperatorEvaluatorInDictionaryHas<Color>>(Variant::OP_IN, Variant::COLOR, Variant::DICTIONARY);
  1643. register_op<OperatorEvaluatorInDictionaryHas<StringName>>(Variant::OP_IN, Variant::STRING_NAME, Variant::DICTIONARY);
  1644. register_op<OperatorEvaluatorInDictionaryHas<NodePath>>(Variant::OP_IN, Variant::NODE_PATH, Variant::DICTIONARY);
  1645. register_op<OperatorEvaluatorInDictionaryHasObject>(Variant::OP_IN, Variant::OBJECT, Variant::DICTIONARY);
  1646. register_op<OperatorEvaluatorInDictionaryHas<Callable>>(Variant::OP_IN, Variant::CALLABLE, Variant::DICTIONARY);
  1647. register_op<OperatorEvaluatorInDictionaryHas<Signal>>(Variant::OP_IN, Variant::SIGNAL, Variant::DICTIONARY);
  1648. register_op<OperatorEvaluatorInDictionaryHas<Dictionary>>(Variant::OP_IN, Variant::DICTIONARY, Variant::DICTIONARY);
  1649. register_op<OperatorEvaluatorInDictionaryHas<Array>>(Variant::OP_IN, Variant::ARRAY, Variant::DICTIONARY);
  1650. register_op<OperatorEvaluatorInDictionaryHas<PackedByteArray>>(Variant::OP_IN, Variant::PACKED_BYTE_ARRAY, Variant::DICTIONARY);
  1651. register_op<OperatorEvaluatorInDictionaryHas<PackedInt32Array>>(Variant::OP_IN, Variant::PACKED_INT32_ARRAY, Variant::DICTIONARY);
  1652. register_op<OperatorEvaluatorInDictionaryHas<PackedInt64Array>>(Variant::OP_IN, Variant::PACKED_INT64_ARRAY, Variant::DICTIONARY);
  1653. register_op<OperatorEvaluatorInDictionaryHas<PackedFloat32Array>>(Variant::OP_IN, Variant::PACKED_FLOAT32_ARRAY, Variant::DICTIONARY);
  1654. register_op<OperatorEvaluatorInDictionaryHas<PackedFloat64Array>>(Variant::OP_IN, Variant::PACKED_FLOAT64_ARRAY, Variant::DICTIONARY);
  1655. register_op<OperatorEvaluatorInDictionaryHas<PackedStringArray>>(Variant::OP_IN, Variant::PACKED_STRING_ARRAY, Variant::DICTIONARY);
  1656. register_op<OperatorEvaluatorInDictionaryHas<PackedVector2Array>>(Variant::OP_IN, Variant::PACKED_VECTOR2_ARRAY, Variant::DICTIONARY);
  1657. register_op<OperatorEvaluatorInDictionaryHas<PackedVector3Array>>(Variant::OP_IN, Variant::PACKED_VECTOR3_ARRAY, Variant::DICTIONARY);
  1658. register_op<OperatorEvaluatorInDictionaryHas<PackedColorArray>>(Variant::OP_IN, Variant::PACKED_COLOR_ARRAY, Variant::DICTIONARY);
  1659. register_op<OperatorEvaluatorInArrayFindNil>(Variant::OP_IN, Variant::NIL, Variant::ARRAY);
  1660. register_op<OperatorEvaluatorInArrayFind<bool, Array>>(Variant::OP_IN, Variant::BOOL, Variant::ARRAY);
  1661. register_op<OperatorEvaluatorInArrayFind<int64_t, Array>>(Variant::OP_IN, Variant::INT, Variant::ARRAY);
  1662. register_op<OperatorEvaluatorInArrayFind<double, Array>>(Variant::OP_IN, Variant::FLOAT, Variant::ARRAY);
  1663. register_op<OperatorEvaluatorInArrayFind<String, Array>>(Variant::OP_IN, Variant::STRING, Variant::ARRAY);
  1664. register_op<OperatorEvaluatorInArrayFind<Vector2, Array>>(Variant::OP_IN, Variant::VECTOR2, Variant::ARRAY);
  1665. register_op<OperatorEvaluatorInArrayFind<Vector2i, Array>>(Variant::OP_IN, Variant::VECTOR2I, Variant::ARRAY);
  1666. register_op<OperatorEvaluatorInArrayFind<Rect2, Array>>(Variant::OP_IN, Variant::RECT2, Variant::ARRAY);
  1667. register_op<OperatorEvaluatorInArrayFind<Rect2i, Array>>(Variant::OP_IN, Variant::RECT2I, Variant::ARRAY);
  1668. register_op<OperatorEvaluatorInArrayFind<Vector3, Array>>(Variant::OP_IN, Variant::VECTOR3, Variant::ARRAY);
  1669. register_op<OperatorEvaluatorInArrayFind<Vector3i, Array>>(Variant::OP_IN, Variant::VECTOR3I, Variant::ARRAY);
  1670. register_op<OperatorEvaluatorInArrayFind<Transform2D, Array>>(Variant::OP_IN, Variant::TRANSFORM2D, Variant::ARRAY);
  1671. register_op<OperatorEvaluatorInArrayFind<Plane, Array>>(Variant::OP_IN, Variant::PLANE, Variant::ARRAY);
  1672. register_op<OperatorEvaluatorInArrayFind<Quat, Array>>(Variant::OP_IN, Variant::QUAT, Variant::ARRAY);
  1673. register_op<OperatorEvaluatorInArrayFind<::AABB, Array>>(Variant::OP_IN, Variant::AABB, Variant::ARRAY);
  1674. register_op<OperatorEvaluatorInArrayFind<Basis, Array>>(Variant::OP_IN, Variant::BASIS, Variant::ARRAY);
  1675. register_op<OperatorEvaluatorInArrayFind<Transform, Array>>(Variant::OP_IN, Variant::TRANSFORM, Variant::ARRAY);
  1676. register_op<OperatorEvaluatorInArrayFind<Color, Array>>(Variant::OP_IN, Variant::COLOR, Variant::ARRAY);
  1677. register_op<OperatorEvaluatorInArrayFind<StringName, Array>>(Variant::OP_IN, Variant::STRING_NAME, Variant::ARRAY);
  1678. register_op<OperatorEvaluatorInArrayFind<NodePath, Array>>(Variant::OP_IN, Variant::NODE_PATH, Variant::ARRAY);
  1679. register_op<OperatorEvaluatorInArrayFindObject>(Variant::OP_IN, Variant::OBJECT, Variant::ARRAY);
  1680. register_op<OperatorEvaluatorInArrayFind<Callable, Array>>(Variant::OP_IN, Variant::CALLABLE, Variant::ARRAY);
  1681. register_op<OperatorEvaluatorInArrayFind<Signal, Array>>(Variant::OP_IN, Variant::SIGNAL, Variant::ARRAY);
  1682. register_op<OperatorEvaluatorInArrayFind<Dictionary, Array>>(Variant::OP_IN, Variant::DICTIONARY, Variant::ARRAY);
  1683. register_op<OperatorEvaluatorInArrayFind<Array, Array>>(Variant::OP_IN, Variant::ARRAY, Variant::ARRAY);
  1684. register_op<OperatorEvaluatorInArrayFind<PackedByteArray, Array>>(Variant::OP_IN, Variant::PACKED_BYTE_ARRAY, Variant::ARRAY);
  1685. register_op<OperatorEvaluatorInArrayFind<PackedInt32Array, Array>>(Variant::OP_IN, Variant::PACKED_INT32_ARRAY, Variant::ARRAY);
  1686. register_op<OperatorEvaluatorInArrayFind<PackedInt64Array, Array>>(Variant::OP_IN, Variant::PACKED_INT64_ARRAY, Variant::ARRAY);
  1687. register_op<OperatorEvaluatorInArrayFind<PackedFloat32Array, Array>>(Variant::OP_IN, Variant::PACKED_FLOAT32_ARRAY, Variant::ARRAY);
  1688. register_op<OperatorEvaluatorInArrayFind<PackedFloat64Array, Array>>(Variant::OP_IN, Variant::PACKED_FLOAT64_ARRAY, Variant::ARRAY);
  1689. register_op<OperatorEvaluatorInArrayFind<PackedStringArray, Array>>(Variant::OP_IN, Variant::PACKED_STRING_ARRAY, Variant::ARRAY);
  1690. register_op<OperatorEvaluatorInArrayFind<PackedVector2Array, Array>>(Variant::OP_IN, Variant::PACKED_VECTOR2_ARRAY, Variant::ARRAY);
  1691. register_op<OperatorEvaluatorInArrayFind<PackedVector3Array, Array>>(Variant::OP_IN, Variant::PACKED_VECTOR3_ARRAY, Variant::ARRAY);
  1692. register_op<OperatorEvaluatorInArrayFind<PackedColorArray, Array>>(Variant::OP_IN, Variant::PACKED_COLOR_ARRAY, Variant::ARRAY);
  1693. register_op<OperatorEvaluatorInArrayFind<int, PackedByteArray>>(Variant::OP_IN, Variant::INT, Variant::PACKED_BYTE_ARRAY);
  1694. register_op<OperatorEvaluatorInArrayFind<float, PackedByteArray>>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_BYTE_ARRAY);
  1695. register_op<OperatorEvaluatorInArrayFind<int, PackedInt32Array>>(Variant::OP_IN, Variant::INT, Variant::PACKED_INT32_ARRAY);
  1696. register_op<OperatorEvaluatorInArrayFind<float, PackedInt32Array>>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_INT32_ARRAY);
  1697. register_op<OperatorEvaluatorInArrayFind<int, PackedInt64Array>>(Variant::OP_IN, Variant::INT, Variant::PACKED_INT64_ARRAY);
  1698. register_op<OperatorEvaluatorInArrayFind<float, PackedInt64Array>>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_INT64_ARRAY);
  1699. register_op<OperatorEvaluatorInArrayFind<int, PackedFloat32Array>>(Variant::OP_IN, Variant::INT, Variant::PACKED_FLOAT32_ARRAY);
  1700. register_op<OperatorEvaluatorInArrayFind<float, PackedFloat32Array>>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT32_ARRAY);
  1701. register_op<OperatorEvaluatorInArrayFind<int, PackedFloat64Array>>(Variant::OP_IN, Variant::INT, Variant::PACKED_FLOAT64_ARRAY);
  1702. register_op<OperatorEvaluatorInArrayFind<float, PackedFloat64Array>>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT64_ARRAY);
  1703. register_op<OperatorEvaluatorInArrayFind<String, PackedStringArray>>(Variant::OP_IN, Variant::STRING, Variant::PACKED_STRING_ARRAY);
  1704. register_op<OperatorEvaluatorInArrayFind<Vector2, PackedVector2Array>>(Variant::OP_IN, Variant::VECTOR2, Variant::PACKED_VECTOR2_ARRAY);
  1705. register_op<OperatorEvaluatorInArrayFind<Vector3, PackedVector3Array>>(Variant::OP_IN, Variant::VECTOR3, Variant::PACKED_VECTOR3_ARRAY);
  1706. register_op<OperatorEvaluatorInArrayFind<Color, PackedColorArray>>(Variant::OP_IN, Variant::COLOR, Variant::PACKED_COLOR_ARRAY);
  1707. register_op<OperatorEvaluatorObjectHasPropertyString>(Variant::OP_IN, Variant::STRING, Variant::OBJECT);
  1708. register_op<OperatorEvaluatorObjectHasPropertyStringName>(Variant::OP_IN, Variant::STRING_NAME, Variant::OBJECT);
  1709. }
  1710. void Variant::_unregister_variant_operators() {
  1711. }
  1712. void Variant::evaluate(const Operator &p_op, const Variant &p_a,
  1713. const Variant &p_b, Variant &r_ret, bool &r_valid) {
  1714. ERR_FAIL_INDEX(p_op, Variant::OP_MAX);
  1715. Variant::Type type_a = p_a.get_type();
  1716. Variant::Type type_b = p_b.get_type();
  1717. ERR_FAIL_INDEX(type_a, Variant::VARIANT_MAX);
  1718. ERR_FAIL_INDEX(type_b, Variant::VARIANT_MAX);
  1719. VariantEvaluatorFunction ev = operator_evaluator_table[p_op][type_a][type_b];
  1720. if (unlikely(!ev)) {
  1721. r_valid = false;
  1722. r_ret = Variant();
  1723. return;
  1724. }
  1725. ev(p_a, p_b, &r_ret, r_valid);
  1726. }
  1727. Variant::Type Variant::get_operator_return_type(Operator p_operator, Type p_type_a, Type p_type_b) {
  1728. ERR_FAIL_INDEX_V(p_operator, Variant::OP_MAX, Variant::NIL);
  1729. ERR_FAIL_INDEX_V(p_type_a, Variant::VARIANT_MAX, Variant::NIL);
  1730. ERR_FAIL_INDEX_V(p_type_b, Variant::VARIANT_MAX, Variant::NIL);
  1731. return operator_return_type_table[p_operator][p_type_a][p_type_b];
  1732. }
  1733. Variant::ValidatedOperatorEvaluator Variant::get_validated_operator_evaluator(Operator p_operator, Type p_type_a, Type p_type_b) {
  1734. ERR_FAIL_INDEX_V(p_operator, Variant::OP_MAX, nullptr);
  1735. ERR_FAIL_INDEX_V(p_type_a, Variant::VARIANT_MAX, nullptr);
  1736. ERR_FAIL_INDEX_V(p_type_b, Variant::VARIANT_MAX, nullptr);
  1737. return validated_operator_evaluator_table[p_operator][p_type_a][p_type_b];
  1738. }
  1739. Variant::PTROperatorEvaluator Variant::get_ptr_operator_evaluator(Operator p_operator, Type p_type_a, Type p_type_b) {
  1740. ERR_FAIL_INDEX_V(p_operator, Variant::OP_MAX, nullptr);
  1741. ERR_FAIL_INDEX_V(p_type_a, Variant::VARIANT_MAX, nullptr);
  1742. ERR_FAIL_INDEX_V(p_type_b, Variant::VARIANT_MAX, nullptr);
  1743. return ptr_operator_evaluator_table[p_operator][p_type_a][p_type_b];
  1744. }
  1745. static const char *_op_names[Variant::OP_MAX] = {
  1746. "==",
  1747. "!=",
  1748. "<",
  1749. "<=",
  1750. ">",
  1751. ">=",
  1752. "+",
  1753. "-",
  1754. "*",
  1755. "/",
  1756. "-",
  1757. "+",
  1758. "%",
  1759. "<<",
  1760. ">>",
  1761. "&",
  1762. "|",
  1763. "^",
  1764. "~",
  1765. "and",
  1766. "or",
  1767. "xor",
  1768. "not",
  1769. "in"
  1770. };
  1771. String Variant::get_operator_name(Operator p_op) {
  1772. ERR_FAIL_INDEX_V(p_op, OP_MAX, "");
  1773. return _op_names[p_op];
  1774. }
  1775. Variant::operator bool() const {
  1776. return booleanize();
  1777. }
  1778. // We consider all uninitialized or empty types to be false based on the type's
  1779. // zeroiness.
  1780. bool Variant::booleanize() const {
  1781. return !is_zero();
  1782. }
  1783. bool Variant::in(const Variant &p_index, bool *r_valid) const {
  1784. bool valid;
  1785. Variant ret;
  1786. evaluate(OP_IN, p_index, *this, ret, valid);
  1787. if (r_valid) {
  1788. *r_valid = valid;
  1789. return false;
  1790. }
  1791. ERR_FAIL_COND_V(ret.type != BOOL, false);
  1792. return *VariantGetInternalPtr<bool>::get_ptr(&ret);
  1793. }