variant_setget.cpp 88 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033
  1. /**************************************************************************/
  2. /* variant_setget.cpp */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  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_setget.h"
  31. #include "variant_callable.h"
  32. #include "core/io/resource.h"
  33. struct VariantSetterGetterInfo {
  34. void (*setter)(Variant *base, const Variant *value, bool &valid);
  35. void (*getter)(const Variant *base, Variant *value);
  36. Variant::ValidatedSetter validated_setter;
  37. Variant::ValidatedGetter validated_getter;
  38. Variant::PTRSetter ptr_setter;
  39. Variant::PTRGetter ptr_getter;
  40. Variant::Type member_type;
  41. };
  42. static LocalVector<VariantSetterGetterInfo> variant_setters_getters[Variant::VARIANT_MAX];
  43. static LocalVector<StringName> variant_setters_getters_names[Variant::VARIANT_MAX]; //one next to another to make it cache friendly
  44. template <typename T>
  45. static void register_member(Variant::Type p_type, const StringName &p_member) {
  46. VariantSetterGetterInfo sgi;
  47. sgi.setter = T::set;
  48. sgi.validated_setter = T::validated_set;
  49. sgi.ptr_setter = T::ptr_set;
  50. sgi.getter = T::get;
  51. sgi.validated_getter = T::validated_get;
  52. sgi.ptr_getter = T::ptr_get;
  53. sgi.member_type = T::get_type();
  54. variant_setters_getters[p_type].push_back(sgi);
  55. variant_setters_getters_names[p_type].push_back(p_member);
  56. }
  57. void register_named_setters_getters() {
  58. #define REGISTER_MEMBER(m_base_type, m_member) register_member<VariantSetGet_##m_base_type##_##m_member>(GetTypeInfo<m_base_type>::VARIANT_TYPE, #m_member)
  59. REGISTER_MEMBER(Vector2, x);
  60. REGISTER_MEMBER(Vector2, y);
  61. REGISTER_MEMBER(Vector2i, x);
  62. REGISTER_MEMBER(Vector2i, y);
  63. REGISTER_MEMBER(Vector3, x);
  64. REGISTER_MEMBER(Vector3, y);
  65. REGISTER_MEMBER(Vector3, z);
  66. REGISTER_MEMBER(Vector3i, x);
  67. REGISTER_MEMBER(Vector3i, y);
  68. REGISTER_MEMBER(Vector3i, z);
  69. REGISTER_MEMBER(Vector4, x);
  70. REGISTER_MEMBER(Vector4, y);
  71. REGISTER_MEMBER(Vector4, z);
  72. REGISTER_MEMBER(Vector4, w);
  73. REGISTER_MEMBER(Vector4i, x);
  74. REGISTER_MEMBER(Vector4i, y);
  75. REGISTER_MEMBER(Vector4i, z);
  76. REGISTER_MEMBER(Vector4i, w);
  77. REGISTER_MEMBER(Rect2, position);
  78. REGISTER_MEMBER(Rect2, size);
  79. REGISTER_MEMBER(Rect2, end);
  80. REGISTER_MEMBER(Rect2i, position);
  81. REGISTER_MEMBER(Rect2i, size);
  82. REGISTER_MEMBER(Rect2i, end);
  83. REGISTER_MEMBER(AABB, position);
  84. REGISTER_MEMBER(AABB, size);
  85. REGISTER_MEMBER(AABB, end);
  86. REGISTER_MEMBER(Transform2D, x);
  87. REGISTER_MEMBER(Transform2D, y);
  88. REGISTER_MEMBER(Transform2D, origin);
  89. REGISTER_MEMBER(Plane, x);
  90. REGISTER_MEMBER(Plane, y);
  91. REGISTER_MEMBER(Plane, z);
  92. REGISTER_MEMBER(Plane, d);
  93. REGISTER_MEMBER(Plane, normal);
  94. REGISTER_MEMBER(Quaternion, x);
  95. REGISTER_MEMBER(Quaternion, y);
  96. REGISTER_MEMBER(Quaternion, z);
  97. REGISTER_MEMBER(Quaternion, w);
  98. REGISTER_MEMBER(Basis, x);
  99. REGISTER_MEMBER(Basis, y);
  100. REGISTER_MEMBER(Basis, z);
  101. REGISTER_MEMBER(Transform3D, basis);
  102. REGISTER_MEMBER(Transform3D, origin);
  103. REGISTER_MEMBER(Projection, x);
  104. REGISTER_MEMBER(Projection, y);
  105. REGISTER_MEMBER(Projection, z);
  106. REGISTER_MEMBER(Projection, w);
  107. REGISTER_MEMBER(Color, r);
  108. REGISTER_MEMBER(Color, g);
  109. REGISTER_MEMBER(Color, b);
  110. REGISTER_MEMBER(Color, a);
  111. REGISTER_MEMBER(Color, r8);
  112. REGISTER_MEMBER(Color, g8);
  113. REGISTER_MEMBER(Color, b8);
  114. REGISTER_MEMBER(Color, a8);
  115. REGISTER_MEMBER(Color, h);
  116. REGISTER_MEMBER(Color, s);
  117. REGISTER_MEMBER(Color, v);
  118. REGISTER_MEMBER(Color, ok_hsl_h);
  119. REGISTER_MEMBER(Color, ok_hsl_s);
  120. REGISTER_MEMBER(Color, ok_hsl_l);
  121. }
  122. void unregister_named_setters_getters() {
  123. for (int i = 0; i < Variant::VARIANT_MAX; i++) {
  124. variant_setters_getters[i].clear();
  125. variant_setters_getters_names[i].clear();
  126. }
  127. }
  128. bool Variant::has_member(Variant::Type p_type, const StringName &p_member) {
  129. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, false);
  130. for (const StringName &member : variant_setters_getters_names[p_type]) {
  131. if (member == p_member) {
  132. return true;
  133. }
  134. }
  135. return false;
  136. }
  137. Variant::Type Variant::get_member_type(Variant::Type p_type, const StringName &p_member) {
  138. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, Variant::VARIANT_MAX);
  139. for (uint32_t i = 0; i < variant_setters_getters_names[p_type].size(); i++) {
  140. if (variant_setters_getters_names[p_type][i] == p_member) {
  141. return variant_setters_getters[p_type][i].member_type;
  142. }
  143. }
  144. return Variant::NIL;
  145. }
  146. void Variant::get_member_list(Variant::Type p_type, List<StringName> *r_members) {
  147. for (const StringName &member : variant_setters_getters_names[p_type]) {
  148. r_members->push_back(member);
  149. }
  150. }
  151. int Variant::get_member_count(Type p_type) {
  152. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, -1);
  153. return variant_setters_getters_names[p_type].size();
  154. }
  155. Variant::ValidatedSetter Variant::get_member_validated_setter(Variant::Type p_type, const StringName &p_member) {
  156. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  157. for (uint32_t i = 0; i < variant_setters_getters_names[p_type].size(); i++) {
  158. if (variant_setters_getters_names[p_type][i] == p_member) {
  159. return variant_setters_getters[p_type][i].validated_setter;
  160. }
  161. }
  162. return nullptr;
  163. }
  164. Variant::ValidatedGetter Variant::get_member_validated_getter(Variant::Type p_type, const StringName &p_member) {
  165. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  166. for (uint32_t i = 0; i < variant_setters_getters_names[p_type].size(); i++) {
  167. if (variant_setters_getters_names[p_type][i] == p_member) {
  168. return variant_setters_getters[p_type][i].validated_getter;
  169. }
  170. }
  171. return nullptr;
  172. }
  173. Variant::PTRSetter Variant::get_member_ptr_setter(Variant::Type p_type, const StringName &p_member) {
  174. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  175. for (uint32_t i = 0; i < variant_setters_getters_names[p_type].size(); i++) {
  176. if (variant_setters_getters_names[p_type][i] == p_member) {
  177. return variant_setters_getters[p_type][i].ptr_setter;
  178. }
  179. }
  180. return nullptr;
  181. }
  182. Variant::PTRGetter Variant::get_member_ptr_getter(Variant::Type p_type, const StringName &p_member) {
  183. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  184. for (uint32_t i = 0; i < variant_setters_getters_names[p_type].size(); i++) {
  185. if (variant_setters_getters_names[p_type][i] == p_member) {
  186. return variant_setters_getters[p_type][i].ptr_getter;
  187. }
  188. }
  189. return nullptr;
  190. }
  191. void Variant::set_named(const StringName &p_member, const Variant &p_value, bool &r_valid) {
  192. uint32_t s = variant_setters_getters[type].size();
  193. if (s) {
  194. for (uint32_t i = 0; i < s; i++) {
  195. if (variant_setters_getters_names[type][i] == p_member) {
  196. variant_setters_getters[type][i].setter(this, &p_value, r_valid);
  197. return;
  198. }
  199. }
  200. r_valid = false;
  201. } else if (type == Variant::OBJECT) {
  202. Object *obj = get_validated_object();
  203. if (!obj) {
  204. r_valid = false;
  205. } else {
  206. obj->set(p_member, p_value, &r_valid);
  207. return;
  208. }
  209. } else if (type == Variant::DICTIONARY) {
  210. Dictionary &dict = *VariantGetInternalPtr<Dictionary>::get_ptr(this);
  211. r_valid = dict.set(p_member, p_value);
  212. } else {
  213. r_valid = false;
  214. }
  215. }
  216. Variant Variant::get_named(const StringName &p_member, bool &r_valid) const {
  217. uint32_t s = variant_setters_getters[type].size();
  218. if (s) {
  219. for (uint32_t i = 0; i < s; i++) {
  220. if (variant_setters_getters_names[type][i] == p_member) {
  221. Variant ret;
  222. variant_setters_getters[type][i].getter(this, &ret);
  223. r_valid = true;
  224. return ret;
  225. }
  226. }
  227. }
  228. switch (type) {
  229. case Variant::OBJECT: {
  230. Object *obj = get_validated_object();
  231. if (!obj) {
  232. r_valid = false;
  233. return "Instance base is null.";
  234. } else {
  235. return obj->get(p_member, &r_valid);
  236. }
  237. } break;
  238. case Variant::DICTIONARY: {
  239. const Variant *v = VariantGetInternalPtr<Dictionary>::get_ptr(this)->getptr(p_member);
  240. if (v) {
  241. r_valid = true;
  242. return *v;
  243. }
  244. } break;
  245. default: {
  246. if (Variant::has_builtin_method(type, p_member)) {
  247. r_valid = true;
  248. return Callable(memnew(VariantCallable(*this, p_member)));
  249. }
  250. } break;
  251. }
  252. r_valid = false;
  253. return Variant();
  254. }
  255. /**** INDEXED SETTERS AND GETTERS ****/
  256. #ifdef DEBUG_ENABLED
  257. #define OOB_TEST(m_idx, m_v) \
  258. ERR_FAIL_INDEX(m_idx, m_v)
  259. #else
  260. #define OOB_TEST(m_idx, m_v)
  261. #endif
  262. #ifdef DEBUG_ENABLED
  263. #define NULL_TEST(m_key) \
  264. ERR_FAIL_NULL(m_key)
  265. #else
  266. #define NULL_TEST(m_key)
  267. #endif
  268. #define INDEXED_SETGET_STRUCT_TYPED(m_base_type, m_elem_type) \
  269. struct VariantIndexedSetGet_##m_base_type { \
  270. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) { \
  271. int64_t size = VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  272. if (index < 0) { \
  273. index += size; \
  274. } \
  275. if (index < 0 || index >= size) { \
  276. *oob = true; \
  277. return; \
  278. } \
  279. VariantTypeAdjust<m_elem_type>::adjust(value); \
  280. *VariantGetInternalPtr<m_elem_type>::get_ptr(value) = (*VariantGetInternalPtr<m_base_type>::get_ptr(base))[index]; \
  281. *oob = false; \
  282. } \
  283. static void ptr_get(const void *base, int64_t index, void *member) { \
  284. /* avoid ptrconvert for performance*/ \
  285. const m_base_type &v = *reinterpret_cast<const m_base_type *>(base); \
  286. if (index < 0) \
  287. index += v.size(); \
  288. OOB_TEST(index, v.size()); \
  289. PtrToArg<m_elem_type>::encode(v[index], member); \
  290. } \
  291. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) { \
  292. if (value->get_type() != GetTypeInfo<m_elem_type>::VARIANT_TYPE) { \
  293. *oob = false; \
  294. *valid = false; \
  295. return; \
  296. } \
  297. int64_t size = VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  298. if (index < 0) { \
  299. index += size; \
  300. } \
  301. if (index < 0 || index >= size) { \
  302. *oob = true; \
  303. *valid = false; \
  304. return; \
  305. } \
  306. (*VariantGetInternalPtr<m_base_type>::get_ptr(base)).write[index] = *VariantGetInternalPtr<m_elem_type>::get_ptr(value); \
  307. *oob = false; \
  308. *valid = true; \
  309. } \
  310. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) { \
  311. int64_t size = VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  312. if (index < 0) { \
  313. index += size; \
  314. } \
  315. if (index < 0 || index >= size) { \
  316. *oob = true; \
  317. return; \
  318. } \
  319. (*VariantGetInternalPtr<m_base_type>::get_ptr(base)).write[index] = *VariantGetInternalPtr<m_elem_type>::get_ptr(value); \
  320. *oob = false; \
  321. } \
  322. static void ptr_set(void *base, int64_t index, const void *member) { \
  323. /* avoid ptrconvert for performance*/ \
  324. m_base_type &v = *reinterpret_cast<m_base_type *>(base); \
  325. if (index < 0) \
  326. index += v.size(); \
  327. OOB_TEST(index, v.size()); \
  328. v.write[index] = PtrToArg<m_elem_type>::convert(member); \
  329. } \
  330. static Variant::Type get_index_type() { \
  331. return GetTypeInfo<m_elem_type>::VARIANT_TYPE; \
  332. } \
  333. static uint32_t get_index_usage() { \
  334. return GetTypeInfo<m_elem_type>::get_class_info().usage; \
  335. } \
  336. static uint64_t get_indexed_size(const Variant *base) { \
  337. return VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  338. } \
  339. };
  340. #define INDEXED_SETGET_STRUCT_TYPED_NUMERIC(m_base_type, m_elem_type, m_assign_type) \
  341. struct VariantIndexedSetGet_##m_base_type { \
  342. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) { \
  343. int64_t size = VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  344. if (index < 0) { \
  345. index += size; \
  346. } \
  347. if (index < 0 || index >= size) { \
  348. *oob = true; \
  349. return; \
  350. } \
  351. VariantTypeAdjust<m_elem_type>::adjust(value); \
  352. *VariantGetInternalPtr<m_elem_type>::get_ptr(value) = (*VariantGetInternalPtr<m_base_type>::get_ptr(base))[index]; \
  353. *oob = false; \
  354. } \
  355. static void ptr_get(const void *base, int64_t index, void *member) { \
  356. /* avoid ptrconvert for performance*/ \
  357. const m_base_type &v = *reinterpret_cast<const m_base_type *>(base); \
  358. if (index < 0) \
  359. index += v.size(); \
  360. OOB_TEST(index, v.size()); \
  361. PtrToArg<m_elem_type>::encode(v[index], member); \
  362. } \
  363. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) { \
  364. int64_t size = VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  365. if (index < 0) { \
  366. index += size; \
  367. } \
  368. if (index < 0 || index >= size) { \
  369. *oob = true; \
  370. *valid = false; \
  371. return; \
  372. } \
  373. m_assign_type num; \
  374. if (value->get_type() == Variant::INT) { \
  375. num = (m_assign_type) * VariantGetInternalPtr<int64_t>::get_ptr(value); \
  376. } else if (value->get_type() == Variant::FLOAT) { \
  377. num = (m_assign_type) * VariantGetInternalPtr<double>::get_ptr(value); \
  378. } else { \
  379. *oob = false; \
  380. *valid = false; \
  381. return; \
  382. } \
  383. (*VariantGetInternalPtr<m_base_type>::get_ptr(base)).write[index] = num; \
  384. *oob = false; \
  385. *valid = true; \
  386. } \
  387. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) { \
  388. int64_t size = VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  389. if (index < 0) { \
  390. index += size; \
  391. } \
  392. if (index < 0 || index >= size) { \
  393. *oob = true; \
  394. return; \
  395. } \
  396. (*VariantGetInternalPtr<m_base_type>::get_ptr(base)).write[index] = *VariantGetInternalPtr<m_elem_type>::get_ptr(value); \
  397. *oob = false; \
  398. } \
  399. static void ptr_set(void *base, int64_t index, const void *member) { \
  400. /* avoid ptrconvert for performance*/ \
  401. m_base_type &v = *reinterpret_cast<m_base_type *>(base); \
  402. if (index < 0) \
  403. index += v.size(); \
  404. OOB_TEST(index, v.size()); \
  405. v.write[index] = PtrToArg<m_elem_type>::convert(member); \
  406. } \
  407. static Variant::Type get_index_type() { \
  408. return GetTypeInfo<m_elem_type>::VARIANT_TYPE; \
  409. } \
  410. static uint32_t get_index_usage() { \
  411. return GetTypeInfo<m_elem_type>::get_class_info().usage; \
  412. } \
  413. static uint64_t get_indexed_size(const Variant *base) { \
  414. return VariantGetInternalPtr<m_base_type>::get_ptr(base)->size(); \
  415. } \
  416. };
  417. #define INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(m_base_type, m_elem_type, m_assign_type, m_max) \
  418. struct VariantIndexedSetGet_##m_base_type { \
  419. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) { \
  420. if (index < 0 || index >= m_max) { \
  421. *oob = true; \
  422. return; \
  423. } \
  424. VariantTypeAdjust<m_elem_type>::adjust(value); \
  425. *VariantGetInternalPtr<m_elem_type>::get_ptr(value) = (*VariantGetInternalPtr<m_base_type>::get_ptr(base))[index]; \
  426. *oob = false; \
  427. } \
  428. static void ptr_get(const void *base, int64_t index, void *member) { \
  429. /* avoid ptrconvert for performance*/ \
  430. const m_base_type &v = *reinterpret_cast<const m_base_type *>(base); \
  431. OOB_TEST(index, m_max); \
  432. PtrToArg<m_elem_type>::encode(v[index], member); \
  433. } \
  434. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) { \
  435. if (index < 0 || index >= m_max) { \
  436. *oob = true; \
  437. *valid = false; \
  438. return; \
  439. } \
  440. m_assign_type num; \
  441. if (value->get_type() == Variant::INT) { \
  442. num = (m_assign_type) * VariantGetInternalPtr<int64_t>::get_ptr(value); \
  443. } else if (value->get_type() == Variant::FLOAT) { \
  444. num = (m_assign_type) * VariantGetInternalPtr<double>::get_ptr(value); \
  445. } else { \
  446. *oob = false; \
  447. *valid = false; \
  448. return; \
  449. } \
  450. (*VariantGetInternalPtr<m_base_type>::get_ptr(base))[index] = num; \
  451. *oob = false; \
  452. *valid = true; \
  453. } \
  454. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) { \
  455. if (index < 0 || index >= m_max) { \
  456. *oob = true; \
  457. return; \
  458. } \
  459. (*VariantGetInternalPtr<m_base_type>::get_ptr(base))[index] = *VariantGetInternalPtr<m_elem_type>::get_ptr(value); \
  460. *oob = false; \
  461. } \
  462. static void ptr_set(void *base, int64_t index, const void *member) { \
  463. /* avoid ptrconvert for performance*/ \
  464. m_base_type &v = *reinterpret_cast<m_base_type *>(base); \
  465. OOB_TEST(index, m_max); \
  466. v[index] = PtrToArg<m_elem_type>::convert(member); \
  467. } \
  468. static Variant::Type get_index_type() { \
  469. return GetTypeInfo<m_elem_type>::VARIANT_TYPE; \
  470. } \
  471. static uint32_t get_index_usage() { \
  472. return GetTypeInfo<m_elem_type>::get_class_info().usage; \
  473. } \
  474. static uint64_t get_indexed_size(const Variant *base) { \
  475. return m_max; \
  476. } \
  477. };
  478. #define INDEXED_SETGET_STRUCT_BUILTIN_ACCESSOR(m_base_type, m_elem_type, m_accessor, m_max) \
  479. struct VariantIndexedSetGet_##m_base_type { \
  480. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) { \
  481. if (index < 0 || index >= m_max) { \
  482. *oob = true; \
  483. return; \
  484. } \
  485. VariantTypeAdjust<m_elem_type>::adjust(value); \
  486. *VariantGetInternalPtr<m_elem_type>::get_ptr(value) = (*VariantGetInternalPtr<m_base_type>::get_ptr(base))m_accessor[index]; \
  487. *oob = false; \
  488. } \
  489. static void ptr_get(const void *base, int64_t index, void *member) { \
  490. /* avoid ptrconvert for performance*/ \
  491. const m_base_type &v = *reinterpret_cast<const m_base_type *>(base); \
  492. OOB_TEST(index, m_max); \
  493. PtrToArg<m_elem_type>::encode(v m_accessor[index], member); \
  494. } \
  495. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) { \
  496. if (value->get_type() != GetTypeInfo<m_elem_type>::VARIANT_TYPE) { \
  497. *oob = false; \
  498. *valid = false; \
  499. } \
  500. if (index < 0 || index >= m_max) { \
  501. *oob = true; \
  502. *valid = false; \
  503. return; \
  504. } \
  505. (*VariantGetInternalPtr<m_base_type>::get_ptr(base)) m_accessor[index] = *VariantGetInternalPtr<m_elem_type>::get_ptr(value); \
  506. *oob = false; \
  507. *valid = true; \
  508. } \
  509. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) { \
  510. if (index < 0 || index >= m_max) { \
  511. *oob = true; \
  512. return; \
  513. } \
  514. (*VariantGetInternalPtr<m_base_type>::get_ptr(base)) m_accessor[index] = *VariantGetInternalPtr<m_elem_type>::get_ptr(value); \
  515. *oob = false; \
  516. } \
  517. static void ptr_set(void *base, int64_t index, const void *member) { \
  518. /* avoid ptrconvert for performance*/ \
  519. m_base_type &v = *reinterpret_cast<m_base_type *>(base); \
  520. OOB_TEST(index, m_max); \
  521. v m_accessor[index] = PtrToArg<m_elem_type>::convert(member); \
  522. } \
  523. static Variant::Type get_index_type() { \
  524. return GetTypeInfo<m_elem_type>::VARIANT_TYPE; \
  525. } \
  526. static uint32_t get_index_usage() { \
  527. return GetTypeInfo<m_elem_type>::get_class_info().usage; \
  528. } \
  529. static uint64_t get_indexed_size(const Variant *base) { \
  530. return m_max; \
  531. } \
  532. };
  533. #define INDEXED_SETGET_STRUCT_BUILTIN_FUNC(m_base_type, m_elem_type, m_set, m_get, m_max) \
  534. struct VariantIndexedSetGet_##m_base_type { \
  535. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) { \
  536. if (index < 0 || index >= m_max) { \
  537. *oob = true; \
  538. return; \
  539. } \
  540. VariantTypeAdjust<m_elem_type>::adjust(value); \
  541. *VariantGetInternalPtr<m_elem_type>::get_ptr(value) = VariantGetInternalPtr<m_base_type>::get_ptr(base)->m_get(index); \
  542. *oob = false; \
  543. } \
  544. static void ptr_get(const void *base, int64_t index, void *member) { \
  545. /* avoid ptrconvert for performance*/ \
  546. const m_base_type &v = *reinterpret_cast<const m_base_type *>(base); \
  547. OOB_TEST(index, m_max); \
  548. PtrToArg<m_elem_type>::encode(v.m_get(index), member); \
  549. } \
  550. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) { \
  551. if (value->get_type() != GetTypeInfo<m_elem_type>::VARIANT_TYPE) { \
  552. *oob = false; \
  553. *valid = false; \
  554. } \
  555. if (index < 0 || index >= m_max) { \
  556. *oob = true; \
  557. *valid = false; \
  558. return; \
  559. } \
  560. VariantGetInternalPtr<m_base_type>::get_ptr(base)->m_set(index, *VariantGetInternalPtr<m_elem_type>::get_ptr(value)); \
  561. *oob = false; \
  562. *valid = true; \
  563. } \
  564. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) { \
  565. if (index < 0 || index >= m_max) { \
  566. *oob = true; \
  567. return; \
  568. } \
  569. VariantGetInternalPtr<m_base_type>::get_ptr(base)->m_set(index, *VariantGetInternalPtr<m_elem_type>::get_ptr(value)); \
  570. *oob = false; \
  571. } \
  572. static void ptr_set(void *base, int64_t index, const void *member) { \
  573. /* avoid ptrconvert for performance*/ \
  574. m_base_type &v = *reinterpret_cast<m_base_type *>(base); \
  575. OOB_TEST(index, m_max); \
  576. v.m_set(index, PtrToArg<m_elem_type>::convert(member)); \
  577. } \
  578. static Variant::Type get_index_type() { \
  579. return GetTypeInfo<m_elem_type>::VARIANT_TYPE; \
  580. } \
  581. static uint32_t get_index_usage() { \
  582. return GetTypeInfo<m_elem_type>::get_class_info().usage; \
  583. } \
  584. static uint64_t get_indexed_size(const Variant *base) { \
  585. return m_max; \
  586. } \
  587. };
  588. struct VariantIndexedSetGet_Array {
  589. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) {
  590. int64_t size = VariantGetInternalPtr<Array>::get_ptr(base)->size();
  591. if (index < 0) {
  592. index += size;
  593. }
  594. if (index < 0 || index >= size) {
  595. *oob = true;
  596. return;
  597. }
  598. *value = (*VariantGetInternalPtr<Array>::get_ptr(base))[index];
  599. *oob = false;
  600. }
  601. static void ptr_get(const void *base, int64_t index, void *member) {
  602. /* avoid ptrconvert for performance*/
  603. const Array &v = *reinterpret_cast<const Array *>(base);
  604. if (index < 0) {
  605. index += v.size();
  606. }
  607. OOB_TEST(index, v.size());
  608. PtrToArg<Variant>::encode(v[index], member);
  609. }
  610. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) {
  611. if (VariantGetInternalPtr<Array>::get_ptr(base)->is_read_only()) {
  612. *valid = false;
  613. *oob = true;
  614. return;
  615. }
  616. int64_t size = VariantGetInternalPtr<Array>::get_ptr(base)->size();
  617. if (index < 0) {
  618. index += size;
  619. }
  620. if (index < 0 || index >= size) {
  621. *oob = true;
  622. *valid = false;
  623. return;
  624. }
  625. VariantGetInternalPtr<Array>::get_ptr(base)->set(index, *value);
  626. *oob = false;
  627. *valid = true;
  628. }
  629. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) {
  630. if (VariantGetInternalPtr<Array>::get_ptr(base)->is_read_only()) {
  631. *oob = true;
  632. return;
  633. }
  634. int64_t size = VariantGetInternalPtr<Array>::get_ptr(base)->size();
  635. if (index < 0) {
  636. index += size;
  637. }
  638. if (index < 0 || index >= size) {
  639. *oob = true;
  640. return;
  641. }
  642. VariantGetInternalPtr<Array>::get_ptr(base)->set(index, *value);
  643. *oob = false;
  644. }
  645. static void ptr_set(void *base, int64_t index, const void *member) {
  646. /* avoid ptrconvert for performance*/
  647. Array &v = *reinterpret_cast<Array *>(base);
  648. if (index < 0) {
  649. index += v.size();
  650. }
  651. OOB_TEST(index, v.size());
  652. v.set(index, PtrToArg<Variant>::convert(member));
  653. }
  654. static Variant::Type get_index_type() { return Variant::NIL; }
  655. static uint32_t get_index_usage() { return PROPERTY_USAGE_NIL_IS_VARIANT; }
  656. static uint64_t get_indexed_size(const Variant *base) { return 0; }
  657. };
  658. struct VariantIndexedSetGet_Dictionary {
  659. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) {
  660. const Variant *ptr = VariantGetInternalPtr<Dictionary>::get_ptr(base)->getptr(index);
  661. if (!ptr) {
  662. *oob = true;
  663. return;
  664. }
  665. *value = *ptr;
  666. *oob = false;
  667. }
  668. static void ptr_get(const void *base, int64_t index, void *member) {
  669. // Avoid ptrconvert for performance.
  670. const Dictionary &v = *reinterpret_cast<const Dictionary *>(base);
  671. const Variant *ptr = v.getptr(index);
  672. NULL_TEST(ptr);
  673. PtrToArg<Variant>::encode(*ptr, member);
  674. }
  675. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) {
  676. *valid = VariantGetInternalPtr<Dictionary>::get_ptr(base)->set(index, *value);
  677. *oob = VariantGetInternalPtr<Dictionary>::get_ptr(base)->is_read_only();
  678. }
  679. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) {
  680. VariantGetInternalPtr<Dictionary>::get_ptr(base)->set(index, *value);
  681. *oob = VariantGetInternalPtr<Dictionary>::get_ptr(base)->is_read_only();
  682. }
  683. static void ptr_set(void *base, int64_t index, const void *member) {
  684. Dictionary &v = *reinterpret_cast<Dictionary *>(base);
  685. v.set(index, PtrToArg<Variant>::convert(member));
  686. }
  687. static Variant::Type get_index_type() { return Variant::NIL; }
  688. static uint32_t get_index_usage() { return PROPERTY_USAGE_DEFAULT; }
  689. static uint64_t get_indexed_size(const Variant *base) { return VariantGetInternalPtr<Dictionary>::get_ptr(base)->size(); }
  690. };
  691. struct VariantIndexedSetGet_String {
  692. static void get(const Variant *base, int64_t index, Variant *value, bool *oob) {
  693. int64_t length = VariantGetInternalPtr<String>::get_ptr(base)->length();
  694. if (index < 0) {
  695. index += length;
  696. }
  697. if (index < 0 || index >= length) {
  698. *oob = true;
  699. return;
  700. }
  701. *value = String::chr((*VariantGetInternalPtr<String>::get_ptr(base))[index]);
  702. *oob = false;
  703. }
  704. static void ptr_get(const void *base, int64_t index, void *member) {
  705. /* avoid ptrconvert for performance*/
  706. const String &v = *reinterpret_cast<const String *>(base);
  707. if (index < 0) {
  708. index += v.length();
  709. }
  710. OOB_TEST(index, v.length());
  711. PtrToArg<String>::encode(String::chr(v[index]), member);
  712. }
  713. static void set(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) {
  714. if (value->get_type() != Variant::STRING) {
  715. *oob = false;
  716. *valid = false;
  717. return;
  718. }
  719. int64_t length = VariantGetInternalPtr<String>::get_ptr(base)->length();
  720. if (index < 0) {
  721. index += length;
  722. }
  723. if (index < 0 || index >= length) {
  724. *oob = true;
  725. *valid = false;
  726. return;
  727. }
  728. String *b = VariantGetInternalPtr<String>::get_ptr(base);
  729. const String *v = VariantInternal::get_string(value);
  730. if (v->length() == 0) {
  731. b->remove_at(index);
  732. } else {
  733. b->set(index, v->get(0));
  734. }
  735. *oob = false;
  736. *valid = true;
  737. }
  738. static void validated_set(Variant *base, int64_t index, const Variant *value, bool *oob) {
  739. int64_t length = VariantGetInternalPtr<String>::get_ptr(base)->length();
  740. if (index < 0) {
  741. index += length;
  742. }
  743. if (index < 0 || index >= length) {
  744. *oob = true;
  745. return;
  746. }
  747. String *b = VariantGetInternalPtr<String>::get_ptr(base);
  748. const String *v = VariantInternal::get_string(value);
  749. if (v->length() == 0) {
  750. b->remove_at(index);
  751. } else {
  752. b->set(index, v->get(0));
  753. }
  754. *oob = false;
  755. }
  756. static void ptr_set(void *base, int64_t index, const void *member) {
  757. /* avoid ptrconvert for performance*/
  758. String &v = *reinterpret_cast<String *>(base);
  759. if (index < 0) {
  760. index += v.length();
  761. }
  762. OOB_TEST(index, v.length());
  763. const String &m = *reinterpret_cast<const String *>(member);
  764. if (unlikely(m.length() == 0)) {
  765. v.remove_at(index);
  766. } else {
  767. v.set(index, m.unicode_at(0));
  768. }
  769. }
  770. static Variant::Type get_index_type() { return Variant::STRING; }
  771. static uint32_t get_index_usage() { return PROPERTY_USAGE_DEFAULT; }
  772. static uint64_t get_indexed_size(const Variant *base) { return VariantInternal::get_string(base)->length(); }
  773. };
  774. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Vector2, double, real_t, 2)
  775. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Vector2i, int64_t, int32_t, 2)
  776. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Vector3, double, real_t, 3)
  777. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Vector3i, int64_t, int32_t, 3)
  778. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Vector4, double, real_t, 4)
  779. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Vector4i, int64_t, int32_t, 4)
  780. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Quaternion, double, real_t, 4)
  781. INDEXED_SETGET_STRUCT_BUILTIN_NUMERIC(Color, double, float, 4)
  782. INDEXED_SETGET_STRUCT_BUILTIN_ACCESSOR(Transform2D, Vector2, .columns, 3)
  783. INDEXED_SETGET_STRUCT_BUILTIN_FUNC(Basis, Vector3, set_column, get_column, 3)
  784. INDEXED_SETGET_STRUCT_BUILTIN_ACCESSOR(Projection, Vector4, .columns, 4)
  785. INDEXED_SETGET_STRUCT_TYPED_NUMERIC(PackedByteArray, int64_t, uint8_t)
  786. INDEXED_SETGET_STRUCT_TYPED_NUMERIC(PackedInt32Array, int64_t, int32_t)
  787. INDEXED_SETGET_STRUCT_TYPED_NUMERIC(PackedInt64Array, int64_t, int64_t)
  788. INDEXED_SETGET_STRUCT_TYPED_NUMERIC(PackedFloat32Array, double, float)
  789. INDEXED_SETGET_STRUCT_TYPED_NUMERIC(PackedFloat64Array, double, double)
  790. INDEXED_SETGET_STRUCT_TYPED(PackedVector2Array, Vector2)
  791. INDEXED_SETGET_STRUCT_TYPED(PackedVector3Array, Vector3)
  792. INDEXED_SETGET_STRUCT_TYPED(PackedStringArray, String)
  793. INDEXED_SETGET_STRUCT_TYPED(PackedColorArray, Color)
  794. INDEXED_SETGET_STRUCT_TYPED(PackedVector4Array, Vector4)
  795. struct VariantIndexedSetterGetterInfo {
  796. void (*setter)(Variant *base, int64_t index, const Variant *value, bool *valid, bool *oob) = nullptr;
  797. void (*getter)(const Variant *base, int64_t index, Variant *value, bool *oob) = nullptr;
  798. Variant::ValidatedIndexedSetter validated_setter = nullptr;
  799. Variant::ValidatedIndexedGetter validated_getter = nullptr;
  800. Variant::PTRIndexedSetter ptr_setter = nullptr;
  801. Variant::PTRIndexedGetter ptr_getter = nullptr;
  802. uint64_t (*get_indexed_size)(const Variant *base) = nullptr;
  803. Variant::Type index_type = Variant::NIL;
  804. uint32_t index_usage = PROPERTY_USAGE_DEFAULT;
  805. bool valid = false;
  806. };
  807. static VariantIndexedSetterGetterInfo variant_indexed_setters_getters[Variant::VARIANT_MAX];
  808. template <typename T>
  809. static void register_indexed_member(Variant::Type p_type) {
  810. VariantIndexedSetterGetterInfo &sgi = variant_indexed_setters_getters[p_type];
  811. sgi.setter = T::set;
  812. sgi.validated_setter = T::validated_set;
  813. sgi.ptr_setter = T::ptr_set;
  814. sgi.getter = T::get;
  815. sgi.validated_getter = T::get;
  816. sgi.ptr_getter = T::ptr_get;
  817. sgi.index_type = T::get_index_type();
  818. sgi.index_usage = T::get_index_usage();
  819. sgi.get_indexed_size = T::get_indexed_size;
  820. sgi.valid = true;
  821. }
  822. void register_indexed_setters_getters() {
  823. #define REGISTER_INDEXED_MEMBER(m_base_type) register_indexed_member<VariantIndexedSetGet_##m_base_type>(GetTypeInfo<m_base_type>::VARIANT_TYPE)
  824. REGISTER_INDEXED_MEMBER(String);
  825. REGISTER_INDEXED_MEMBER(Vector2);
  826. REGISTER_INDEXED_MEMBER(Vector2i);
  827. REGISTER_INDEXED_MEMBER(Vector3);
  828. REGISTER_INDEXED_MEMBER(Vector3i);
  829. REGISTER_INDEXED_MEMBER(Vector4);
  830. REGISTER_INDEXED_MEMBER(Vector4i);
  831. REGISTER_INDEXED_MEMBER(Quaternion);
  832. REGISTER_INDEXED_MEMBER(Color);
  833. REGISTER_INDEXED_MEMBER(Transform2D);
  834. REGISTER_INDEXED_MEMBER(Basis);
  835. REGISTER_INDEXED_MEMBER(Projection);
  836. REGISTER_INDEXED_MEMBER(PackedByteArray);
  837. REGISTER_INDEXED_MEMBER(PackedInt32Array);
  838. REGISTER_INDEXED_MEMBER(PackedInt64Array);
  839. REGISTER_INDEXED_MEMBER(PackedFloat32Array);
  840. REGISTER_INDEXED_MEMBER(PackedFloat64Array);
  841. REGISTER_INDEXED_MEMBER(PackedVector2Array);
  842. REGISTER_INDEXED_MEMBER(PackedVector3Array);
  843. REGISTER_INDEXED_MEMBER(PackedStringArray);
  844. REGISTER_INDEXED_MEMBER(PackedColorArray);
  845. REGISTER_INDEXED_MEMBER(PackedVector4Array);
  846. REGISTER_INDEXED_MEMBER(Array);
  847. REGISTER_INDEXED_MEMBER(Dictionary);
  848. }
  849. static void unregister_indexed_setters_getters() {
  850. }
  851. bool Variant::has_indexing(Variant::Type p_type) {
  852. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, false);
  853. return variant_indexed_setters_getters[p_type].valid;
  854. }
  855. Variant::Type Variant::get_indexed_element_type(Variant::Type p_type) {
  856. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, Variant::VARIANT_MAX);
  857. return variant_indexed_setters_getters[p_type].index_type;
  858. }
  859. uint32_t Variant::get_indexed_element_usage(Variant::Type p_type) {
  860. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, PROPERTY_USAGE_DEFAULT);
  861. return variant_indexed_setters_getters[p_type].index_usage;
  862. }
  863. Variant::ValidatedIndexedSetter Variant::get_member_validated_indexed_setter(Variant::Type p_type) {
  864. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  865. return variant_indexed_setters_getters[p_type].validated_setter;
  866. }
  867. Variant::ValidatedIndexedGetter Variant::get_member_validated_indexed_getter(Variant::Type p_type) {
  868. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  869. return variant_indexed_setters_getters[p_type].validated_getter;
  870. }
  871. Variant::PTRIndexedSetter Variant::get_member_ptr_indexed_setter(Variant::Type p_type) {
  872. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  873. return variant_indexed_setters_getters[p_type].ptr_setter;
  874. }
  875. Variant::PTRIndexedGetter Variant::get_member_ptr_indexed_getter(Variant::Type p_type) {
  876. ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr);
  877. return variant_indexed_setters_getters[p_type].ptr_getter;
  878. }
  879. void Variant::set_indexed(int64_t p_index, const Variant &p_value, bool &r_valid, bool &r_oob) {
  880. if (likely(variant_indexed_setters_getters[type].valid)) {
  881. variant_indexed_setters_getters[type].setter(this, p_index, &p_value, &r_valid, &r_oob);
  882. } else {
  883. r_valid = false;
  884. r_oob = false;
  885. }
  886. }
  887. Variant Variant::get_indexed(int64_t p_index, bool &r_valid, bool &r_oob) const {
  888. if (likely(variant_indexed_setters_getters[type].valid)) {
  889. Variant ret;
  890. variant_indexed_setters_getters[type].getter(this, p_index, &ret, &r_oob);
  891. r_valid = !r_oob;
  892. return ret;
  893. } else {
  894. r_valid = false;
  895. r_oob = false;
  896. return Variant();
  897. }
  898. }
  899. uint64_t Variant::get_indexed_size() const {
  900. if (likely(variant_indexed_setters_getters[type].valid && variant_indexed_setters_getters[type].get_indexed_size)) {
  901. return variant_indexed_setters_getters[type].get_indexed_size(this);
  902. } else {
  903. return 0;
  904. }
  905. }
  906. struct VariantKeyedSetGetDictionary {
  907. static void get(const Variant *base, const Variant *key, Variant *value, bool *r_valid) {
  908. const Variant *ptr = VariantGetInternalPtr<Dictionary>::get_ptr(base)->getptr(*key);
  909. if (!ptr) {
  910. *r_valid = false;
  911. return;
  912. }
  913. *value = *ptr;
  914. *r_valid = true;
  915. }
  916. static void ptr_get(const void *base, const void *key, void *value) {
  917. /* avoid ptrconvert for performance*/
  918. const Dictionary &v = *reinterpret_cast<const Dictionary *>(base);
  919. const Variant *ptr = v.getptr(PtrToArg<Variant>::convert(key));
  920. NULL_TEST(ptr);
  921. PtrToArg<Variant>::encode(*ptr, value);
  922. }
  923. static void set(Variant *base, const Variant *key, const Variant *value, bool *r_valid) {
  924. *r_valid = VariantGetInternalPtr<Dictionary>::get_ptr(base)->set(*key, *value);
  925. }
  926. static void ptr_set(void *base, const void *key, const void *value) {
  927. Dictionary &v = *reinterpret_cast<Dictionary *>(base);
  928. v.set(PtrToArg<Variant>::convert(key), PtrToArg<Variant>::convert(value));
  929. }
  930. static bool has(const Variant *base, const Variant *key, bool *r_valid) {
  931. *r_valid = true;
  932. return VariantGetInternalPtr<Dictionary>::get_ptr(base)->has(*key);
  933. }
  934. static uint32_t ptr_has(const void *base, const void *key) {
  935. /* avoid ptrconvert for performance*/
  936. const Dictionary &v = *reinterpret_cast<const Dictionary *>(base);
  937. return v.has(PtrToArg<Variant>::convert(key));
  938. }
  939. };
  940. struct VariantKeyedSetGetObject {
  941. static void get(const Variant *base, const Variant *key, Variant *value, bool *r_valid) {
  942. Object *obj = base->get_validated_object();
  943. if (!obj) {
  944. *r_valid = false;
  945. *value = Variant();
  946. return;
  947. }
  948. *value = obj->getvar(*key, r_valid);
  949. }
  950. static void ptr_get(const void *base, const void *key, void *value) {
  951. const Object *obj = PtrToArg<Object *>::convert(base);
  952. NULL_TEST(obj);
  953. Variant v = obj->getvar(PtrToArg<Variant>::convert(key));
  954. PtrToArg<Variant>::encode(v, value);
  955. }
  956. static void set(Variant *base, const Variant *key, const Variant *value, bool *r_valid) {
  957. Object *obj = base->get_validated_object();
  958. if (!obj) {
  959. *r_valid = false;
  960. return;
  961. }
  962. obj->setvar(*key, *value, r_valid);
  963. }
  964. static void ptr_set(void *base, const void *key, const void *value) {
  965. Object *obj = PtrToArg<Object *>::convert(base);
  966. NULL_TEST(obj);
  967. obj->setvar(PtrToArg<Variant>::convert(key), PtrToArg<Variant>::convert(value));
  968. }
  969. static bool has(const Variant *base, const Variant *key, bool *r_valid) {
  970. Object *obj = base->get_validated_object();
  971. if (!obj) {
  972. *r_valid = false;
  973. return false;
  974. }
  975. *r_valid = true;
  976. bool exists;
  977. obj->getvar(*key, &exists);
  978. return exists;
  979. }
  980. static uint32_t ptr_has(const void *base, const void *key) {
  981. const Object *obj = PtrToArg<Object *>::convert(base);
  982. ERR_FAIL_NULL_V(obj, false);
  983. bool valid;
  984. obj->getvar(PtrToArg<Variant>::convert(key), &valid);
  985. return valid;
  986. }
  987. };
  988. struct VariantKeyedSetterGetterInfo {
  989. Variant::ValidatedKeyedSetter validated_setter = nullptr;
  990. Variant::ValidatedKeyedGetter validated_getter = nullptr;
  991. Variant::ValidatedKeyedChecker validated_checker = nullptr;
  992. Variant::PTRKeyedSetter ptr_setter = nullptr;
  993. Variant::PTRKeyedGetter ptr_getter = nullptr;
  994. Variant::PTRKeyedChecker ptr_checker = nullptr;
  995. bool valid = false;
  996. };
  997. static VariantKeyedSetterGetterInfo variant_keyed_setters_getters[Variant::VARIANT_MAX];
  998. template <typename T>
  999. static void register_keyed_member(Variant::Type p_type) {
  1000. VariantKeyedSetterGetterInfo &sgi = variant_keyed_setters_getters[p_type];
  1001. sgi.validated_setter = T::set;
  1002. sgi.ptr_setter = T::ptr_set;
  1003. sgi.validated_getter = T::get;
  1004. sgi.ptr_getter = T::ptr_get;
  1005. sgi.validated_checker = T::has;
  1006. sgi.ptr_checker = T::ptr_has;
  1007. sgi.valid = true;
  1008. }
  1009. static void register_keyed_setters_getters() {
  1010. register_keyed_member<VariantKeyedSetGetDictionary>(Variant::DICTIONARY);
  1011. register_keyed_member<VariantKeyedSetGetObject>(Variant::OBJECT);
  1012. }
  1013. bool Variant::is_keyed(Variant::Type p_type) {
  1014. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, false);
  1015. return variant_keyed_setters_getters[p_type].valid;
  1016. }
  1017. Variant::ValidatedKeyedSetter Variant::get_member_validated_keyed_setter(Variant::Type p_type) {
  1018. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, nullptr);
  1019. return variant_keyed_setters_getters[p_type].validated_setter;
  1020. }
  1021. Variant::ValidatedKeyedGetter Variant::get_member_validated_keyed_getter(Variant::Type p_type) {
  1022. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, nullptr);
  1023. return variant_keyed_setters_getters[p_type].validated_getter;
  1024. }
  1025. Variant::ValidatedKeyedChecker Variant::get_member_validated_keyed_checker(Variant::Type p_type) {
  1026. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, nullptr);
  1027. return variant_keyed_setters_getters[p_type].validated_checker;
  1028. }
  1029. Variant::PTRKeyedSetter Variant::get_member_ptr_keyed_setter(Variant::Type p_type) {
  1030. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, nullptr);
  1031. return variant_keyed_setters_getters[p_type].ptr_setter;
  1032. }
  1033. Variant::PTRKeyedGetter Variant::get_member_ptr_keyed_getter(Variant::Type p_type) {
  1034. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, nullptr);
  1035. return variant_keyed_setters_getters[p_type].ptr_getter;
  1036. }
  1037. Variant::PTRKeyedChecker Variant::get_member_ptr_keyed_checker(Variant::Type p_type) {
  1038. ERR_FAIL_INDEX_V(p_type, VARIANT_MAX, nullptr);
  1039. return variant_keyed_setters_getters[p_type].ptr_checker;
  1040. }
  1041. void Variant::set_keyed(const Variant &p_key, const Variant &p_value, bool &r_valid) {
  1042. if (likely(variant_keyed_setters_getters[type].valid)) {
  1043. variant_keyed_setters_getters[type].validated_setter(this, &p_key, &p_value, &r_valid);
  1044. } else {
  1045. r_valid = false;
  1046. }
  1047. }
  1048. Variant Variant::get_keyed(const Variant &p_key, bool &r_valid) const {
  1049. if (likely(variant_keyed_setters_getters[type].valid)) {
  1050. Variant ret;
  1051. variant_keyed_setters_getters[type].validated_getter(this, &p_key, &ret, &r_valid);
  1052. return ret;
  1053. } else {
  1054. r_valid = false;
  1055. return Variant();
  1056. }
  1057. }
  1058. bool Variant::has_key(const Variant &p_key, bool &r_valid) const {
  1059. if (likely(variant_keyed_setters_getters[type].valid)) {
  1060. return variant_keyed_setters_getters[type].validated_checker(this, &p_key, &r_valid);
  1061. } else {
  1062. r_valid = false;
  1063. return false;
  1064. }
  1065. }
  1066. void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid, VariantSetError *err_code) {
  1067. if (err_code) {
  1068. *err_code = VariantSetError::SET_OK;
  1069. }
  1070. if (type == DICTIONARY || type == OBJECT) {
  1071. bool valid;
  1072. set_keyed(p_index, p_value, valid);
  1073. if (r_valid) {
  1074. *r_valid = valid;
  1075. if (!valid && err_code) {
  1076. *err_code = VariantSetError::SET_KEYED_ERR;
  1077. }
  1078. }
  1079. } else {
  1080. bool valid = false;
  1081. if (p_index.get_type() == STRING_NAME) {
  1082. set_named(*VariantGetInternalPtr<StringName>::get_ptr(&p_index), p_value, valid);
  1083. if (!valid && err_code) {
  1084. *err_code = VariantSetError::SET_NAMED_ERR;
  1085. }
  1086. } else if (p_index.get_type() == INT) {
  1087. bool obb;
  1088. set_indexed(*VariantGetInternalPtr<int64_t>::get_ptr(&p_index), p_value, valid, obb);
  1089. if (obb) {
  1090. valid = false;
  1091. if (err_code) {
  1092. *err_code = VariantSetError::SET_INDEXED_ERR;
  1093. }
  1094. }
  1095. } else if (p_index.get_type() == STRING) { // less efficient version of named
  1096. set_named(*VariantGetInternalPtr<String>::get_ptr(&p_index), p_value, valid);
  1097. if (!valid && err_code) {
  1098. *err_code = VariantSetError::SET_NAMED_ERR;
  1099. }
  1100. } else if (p_index.get_type() == FLOAT) { // less efficient version of indexed
  1101. bool obb;
  1102. set_indexed(*VariantGetInternalPtr<double>::get_ptr(&p_index), p_value, valid, obb);
  1103. if (obb) {
  1104. valid = false;
  1105. if (err_code) {
  1106. *err_code = VariantSetError::SET_INDEXED_ERR;
  1107. }
  1108. }
  1109. }
  1110. if (r_valid) {
  1111. *r_valid = valid;
  1112. }
  1113. }
  1114. }
  1115. Variant Variant::get(const Variant &p_index, bool *r_valid, VariantGetError *err_code) const {
  1116. if (err_code) {
  1117. *err_code = VariantGetError::GET_OK;
  1118. }
  1119. Variant ret;
  1120. if (type == DICTIONARY || type == OBJECT) {
  1121. bool valid;
  1122. ret = get_keyed(p_index, valid);
  1123. if (r_valid) {
  1124. *r_valid = valid;
  1125. if (!valid && err_code) {
  1126. *err_code = VariantGetError::GET_KEYED_ERR;
  1127. }
  1128. }
  1129. } else {
  1130. bool valid = false;
  1131. if (p_index.get_type() == STRING_NAME) {
  1132. ret = get_named(*VariantGetInternalPtr<StringName>::get_ptr(&p_index), valid);
  1133. if (!valid && err_code) {
  1134. *err_code = VariantGetError::GET_NAMED_ERR;
  1135. }
  1136. } else if (p_index.get_type() == INT) {
  1137. bool obb;
  1138. ret = get_indexed(*VariantGetInternalPtr<int64_t>::get_ptr(&p_index), valid, obb);
  1139. if (obb) {
  1140. valid = false;
  1141. if (err_code) {
  1142. *err_code = VariantGetError::GET_INDEXED_ERR;
  1143. }
  1144. }
  1145. } else if (p_index.get_type() == STRING) { // less efficient version of named
  1146. ret = get_named(*VariantGetInternalPtr<String>::get_ptr(&p_index), valid);
  1147. if (!valid && err_code) {
  1148. *err_code = VariantGetError::GET_NAMED_ERR;
  1149. }
  1150. } else if (p_index.get_type() == FLOAT) { // less efficient version of indexed
  1151. bool obb;
  1152. ret = get_indexed(*VariantGetInternalPtr<double>::get_ptr(&p_index), valid, obb);
  1153. if (obb) {
  1154. valid = false;
  1155. if (err_code) {
  1156. *err_code = VariantGetError::GET_INDEXED_ERR;
  1157. }
  1158. }
  1159. }
  1160. if (r_valid) {
  1161. *r_valid = valid;
  1162. }
  1163. }
  1164. return ret;
  1165. }
  1166. void Variant::get_property_list(List<PropertyInfo> *p_list) const {
  1167. if (type == DICTIONARY) {
  1168. const Dictionary *dic = reinterpret_cast<const Dictionary *>(_data._mem);
  1169. for (const KeyValue<Variant, Variant> &kv : *dic) {
  1170. if (kv.key.is_string()) {
  1171. p_list->push_back(PropertyInfo(dic->get_valid(kv.key).get_type(), kv.key));
  1172. }
  1173. }
  1174. } else if (type == OBJECT) {
  1175. Object *obj = get_validated_object();
  1176. ERR_FAIL_NULL(obj);
  1177. obj->get_property_list(p_list);
  1178. } else {
  1179. List<StringName> members;
  1180. get_member_list(type, &members);
  1181. for (const StringName &E : members) {
  1182. PropertyInfo pi;
  1183. pi.name = E;
  1184. pi.type = get_member_type(type, E);
  1185. p_list->push_back(pi);
  1186. }
  1187. }
  1188. }
  1189. bool Variant::iter_init(Variant &r_iter, bool &valid) const {
  1190. valid = true;
  1191. switch (type) {
  1192. case INT: {
  1193. r_iter = 0;
  1194. return _data._int > 0;
  1195. } break;
  1196. case FLOAT: {
  1197. r_iter = 0.0;
  1198. return _data._float > 0.0;
  1199. } break;
  1200. case VECTOR2: {
  1201. double from = reinterpret_cast<const Vector2 *>(_data._mem)->x;
  1202. double to = reinterpret_cast<const Vector2 *>(_data._mem)->y;
  1203. r_iter = from;
  1204. return from < to;
  1205. } break;
  1206. case VECTOR2I: {
  1207. int64_t from = reinterpret_cast<const Vector2i *>(_data._mem)->x;
  1208. int64_t to = reinterpret_cast<const Vector2i *>(_data._mem)->y;
  1209. r_iter = from;
  1210. return from < to;
  1211. } break;
  1212. case VECTOR3: {
  1213. double from = reinterpret_cast<const Vector3 *>(_data._mem)->x;
  1214. double to = reinterpret_cast<const Vector3 *>(_data._mem)->y;
  1215. double step = reinterpret_cast<const Vector3 *>(_data._mem)->z;
  1216. r_iter = from;
  1217. if (from == to) {
  1218. return false;
  1219. } else if (from < to) {
  1220. return step > 0;
  1221. }
  1222. return step < 0;
  1223. } break;
  1224. case VECTOR3I: {
  1225. int64_t from = reinterpret_cast<const Vector3i *>(_data._mem)->x;
  1226. int64_t to = reinterpret_cast<const Vector3i *>(_data._mem)->y;
  1227. int64_t step = reinterpret_cast<const Vector3i *>(_data._mem)->z;
  1228. r_iter = from;
  1229. if (from == to) {
  1230. return false;
  1231. } else if (from < to) {
  1232. return step > 0;
  1233. }
  1234. return step < 0;
  1235. } break;
  1236. case OBJECT: {
  1237. if (!_get_obj().obj) {
  1238. valid = false;
  1239. return false;
  1240. }
  1241. #ifdef DEBUG_ENABLED
  1242. if (EngineDebugger::is_active() && !_get_obj().id.is_ref_counted() && ObjectDB::get_instance(_get_obj().id) == nullptr) {
  1243. valid = false;
  1244. return false;
  1245. }
  1246. #endif
  1247. Callable::CallError ce;
  1248. ce.error = Callable::CallError::CALL_OK;
  1249. Array ref = { r_iter };
  1250. Variant vref = ref;
  1251. const Variant *refp[] = { &vref };
  1252. Variant ret = _get_obj().obj->callp(CoreStringName(_iter_init), refp, 1, ce);
  1253. if (ref.size() != 1 || ce.error != Callable::CallError::CALL_OK) {
  1254. valid = false;
  1255. return false;
  1256. }
  1257. r_iter = ref[0];
  1258. return ret;
  1259. } break;
  1260. case STRING: {
  1261. const String *str = reinterpret_cast<const String *>(_data._mem);
  1262. if (str->is_empty()) {
  1263. return false;
  1264. }
  1265. r_iter = 0;
  1266. return true;
  1267. } break;
  1268. case DICTIONARY: {
  1269. const Dictionary *dic = reinterpret_cast<const Dictionary *>(_data._mem);
  1270. if (dic->is_empty()) {
  1271. return false;
  1272. }
  1273. const Variant *next = dic->next(nullptr);
  1274. r_iter = *next;
  1275. return true;
  1276. } break;
  1277. case ARRAY: {
  1278. const Array *arr = reinterpret_cast<const Array *>(_data._mem);
  1279. if (arr->is_empty()) {
  1280. return false;
  1281. }
  1282. r_iter = 0;
  1283. return true;
  1284. } break;
  1285. case PACKED_BYTE_ARRAY: {
  1286. const Vector<uint8_t> *arr = &PackedArrayRef<uint8_t>::get_array(_data.packed_array);
  1287. if (arr->size() == 0) {
  1288. return false;
  1289. }
  1290. r_iter = 0;
  1291. return true;
  1292. } break;
  1293. case PACKED_INT32_ARRAY: {
  1294. const Vector<int32_t> *arr = &PackedArrayRef<int32_t>::get_array(_data.packed_array);
  1295. if (arr->size() == 0) {
  1296. return false;
  1297. }
  1298. r_iter = 0;
  1299. return true;
  1300. } break;
  1301. case PACKED_INT64_ARRAY: {
  1302. const Vector<int64_t> *arr = &PackedArrayRef<int64_t>::get_array(_data.packed_array);
  1303. if (arr->size() == 0) {
  1304. return false;
  1305. }
  1306. r_iter = 0;
  1307. return true;
  1308. } break;
  1309. case PACKED_FLOAT32_ARRAY: {
  1310. const Vector<float> *arr = &PackedArrayRef<float>::get_array(_data.packed_array);
  1311. if (arr->size() == 0) {
  1312. return false;
  1313. }
  1314. r_iter = 0;
  1315. return true;
  1316. } break;
  1317. case PACKED_FLOAT64_ARRAY: {
  1318. const Vector<double> *arr = &PackedArrayRef<double>::get_array(_data.packed_array);
  1319. if (arr->size() == 0) {
  1320. return false;
  1321. }
  1322. r_iter = 0;
  1323. return true;
  1324. } break;
  1325. case PACKED_STRING_ARRAY: {
  1326. const Vector<String> *arr = &PackedArrayRef<String>::get_array(_data.packed_array);
  1327. if (arr->size() == 0) {
  1328. return false;
  1329. }
  1330. r_iter = 0;
  1331. return true;
  1332. } break;
  1333. case PACKED_VECTOR2_ARRAY: {
  1334. const Vector<Vector2> *arr = &PackedArrayRef<Vector2>::get_array(_data.packed_array);
  1335. if (arr->size() == 0) {
  1336. return false;
  1337. }
  1338. r_iter = 0;
  1339. return true;
  1340. } break;
  1341. case PACKED_VECTOR3_ARRAY: {
  1342. const Vector<Vector3> *arr = &PackedArrayRef<Vector3>::get_array(_data.packed_array);
  1343. if (arr->size() == 0) {
  1344. return false;
  1345. }
  1346. r_iter = 0;
  1347. return true;
  1348. } break;
  1349. case PACKED_COLOR_ARRAY: {
  1350. const Vector<Color> *arr = &PackedArrayRef<Color>::get_array(_data.packed_array);
  1351. if (arr->size() == 0) {
  1352. return false;
  1353. }
  1354. r_iter = 0;
  1355. return true;
  1356. } break;
  1357. case PACKED_VECTOR4_ARRAY: {
  1358. const Vector<Vector4> *arr = &PackedArrayRef<Vector4>::get_array(_data.packed_array);
  1359. if (arr->size() == 0) {
  1360. return false;
  1361. }
  1362. r_iter = 0;
  1363. return true;
  1364. } break;
  1365. default: {
  1366. }
  1367. }
  1368. valid = false;
  1369. return false;
  1370. }
  1371. bool Variant::iter_next(Variant &r_iter, bool &valid) const {
  1372. valid = true;
  1373. switch (type) {
  1374. case INT: {
  1375. int64_t idx = r_iter;
  1376. idx++;
  1377. if (idx >= _data._int) {
  1378. return false;
  1379. }
  1380. r_iter = idx;
  1381. return true;
  1382. } break;
  1383. case FLOAT: {
  1384. double idx = r_iter;
  1385. idx++;
  1386. if (idx >= _data._float) {
  1387. return false;
  1388. }
  1389. r_iter = idx;
  1390. return true;
  1391. } break;
  1392. case VECTOR2: {
  1393. double to = reinterpret_cast<const Vector2 *>(_data._mem)->y;
  1394. double idx = r_iter;
  1395. idx++;
  1396. if (idx >= to) {
  1397. return false;
  1398. }
  1399. r_iter = idx;
  1400. return true;
  1401. } break;
  1402. case VECTOR2I: {
  1403. int64_t to = reinterpret_cast<const Vector2i *>(_data._mem)->y;
  1404. int64_t idx = r_iter;
  1405. idx++;
  1406. if (idx >= to) {
  1407. return false;
  1408. }
  1409. r_iter = idx;
  1410. return true;
  1411. } break;
  1412. case VECTOR3: {
  1413. double to = reinterpret_cast<const Vector3 *>(_data._mem)->y;
  1414. double step = reinterpret_cast<const Vector3 *>(_data._mem)->z;
  1415. double idx = r_iter;
  1416. idx += step;
  1417. if (step < 0 && idx <= to) {
  1418. return false;
  1419. }
  1420. if (step > 0 && idx >= to) {
  1421. return false;
  1422. }
  1423. r_iter = idx;
  1424. return true;
  1425. } break;
  1426. case VECTOR3I: {
  1427. int64_t to = reinterpret_cast<const Vector3i *>(_data._mem)->y;
  1428. int64_t step = reinterpret_cast<const Vector3i *>(_data._mem)->z;
  1429. int64_t idx = r_iter;
  1430. idx += step;
  1431. if (step < 0 && idx <= to) {
  1432. return false;
  1433. }
  1434. if (step > 0 && idx >= to) {
  1435. return false;
  1436. }
  1437. r_iter = idx;
  1438. return true;
  1439. } break;
  1440. case OBJECT: {
  1441. if (!_get_obj().obj) {
  1442. valid = false;
  1443. return false;
  1444. }
  1445. #ifdef DEBUG_ENABLED
  1446. if (EngineDebugger::is_active() && !_get_obj().id.is_ref_counted() && ObjectDB::get_instance(_get_obj().id) == nullptr) {
  1447. valid = false;
  1448. return false;
  1449. }
  1450. #endif
  1451. Callable::CallError ce;
  1452. ce.error = Callable::CallError::CALL_OK;
  1453. Array ref = { r_iter };
  1454. Variant vref = ref;
  1455. const Variant *refp[] = { &vref };
  1456. Variant ret = _get_obj().obj->callp(CoreStringName(_iter_next), refp, 1, ce);
  1457. if (ref.size() != 1 || ce.error != Callable::CallError::CALL_OK) {
  1458. valid = false;
  1459. return false;
  1460. }
  1461. r_iter = ref[0];
  1462. return ret;
  1463. } break;
  1464. case STRING: {
  1465. const String *str = reinterpret_cast<const String *>(_data._mem);
  1466. int idx = r_iter;
  1467. idx++;
  1468. if (idx >= str->length()) {
  1469. return false;
  1470. }
  1471. r_iter = idx;
  1472. return true;
  1473. } break;
  1474. case DICTIONARY: {
  1475. const Dictionary *dic = reinterpret_cast<const Dictionary *>(_data._mem);
  1476. const Variant *next = dic->next(&r_iter);
  1477. if (!next) {
  1478. return false;
  1479. }
  1480. r_iter = *next;
  1481. return true;
  1482. } break;
  1483. case ARRAY: {
  1484. const Array *arr = reinterpret_cast<const Array *>(_data._mem);
  1485. int idx = r_iter;
  1486. idx++;
  1487. if (idx >= arr->size()) {
  1488. return false;
  1489. }
  1490. r_iter = idx;
  1491. return true;
  1492. } break;
  1493. case PACKED_BYTE_ARRAY: {
  1494. const Vector<uint8_t> *arr = &PackedArrayRef<uint8_t>::get_array(_data.packed_array);
  1495. int idx = r_iter;
  1496. idx++;
  1497. if (idx >= arr->size()) {
  1498. return false;
  1499. }
  1500. r_iter = idx;
  1501. return true;
  1502. } break;
  1503. case PACKED_INT32_ARRAY: {
  1504. const Vector<int32_t> *arr = &PackedArrayRef<int32_t>::get_array(_data.packed_array);
  1505. int32_t idx = r_iter;
  1506. idx++;
  1507. if (idx >= arr->size()) {
  1508. return false;
  1509. }
  1510. r_iter = idx;
  1511. return true;
  1512. } break;
  1513. case PACKED_INT64_ARRAY: {
  1514. const Vector<int64_t> *arr = &PackedArrayRef<int64_t>::get_array(_data.packed_array);
  1515. int64_t idx = r_iter;
  1516. idx++;
  1517. if (idx >= arr->size()) {
  1518. return false;
  1519. }
  1520. r_iter = idx;
  1521. return true;
  1522. } break;
  1523. case PACKED_FLOAT32_ARRAY: {
  1524. const Vector<float> *arr = &PackedArrayRef<float>::get_array(_data.packed_array);
  1525. int idx = r_iter;
  1526. idx++;
  1527. if (idx >= arr->size()) {
  1528. return false;
  1529. }
  1530. r_iter = idx;
  1531. return true;
  1532. } break;
  1533. case PACKED_FLOAT64_ARRAY: {
  1534. const Vector<double> *arr = &PackedArrayRef<double>::get_array(_data.packed_array);
  1535. int idx = r_iter;
  1536. idx++;
  1537. if (idx >= arr->size()) {
  1538. return false;
  1539. }
  1540. r_iter = idx;
  1541. return true;
  1542. } break;
  1543. case PACKED_STRING_ARRAY: {
  1544. const Vector<String> *arr = &PackedArrayRef<String>::get_array(_data.packed_array);
  1545. int idx = r_iter;
  1546. idx++;
  1547. if (idx >= arr->size()) {
  1548. return false;
  1549. }
  1550. r_iter = idx;
  1551. return true;
  1552. } break;
  1553. case PACKED_VECTOR2_ARRAY: {
  1554. const Vector<Vector2> *arr = &PackedArrayRef<Vector2>::get_array(_data.packed_array);
  1555. int idx = r_iter;
  1556. idx++;
  1557. if (idx >= arr->size()) {
  1558. return false;
  1559. }
  1560. r_iter = idx;
  1561. return true;
  1562. } break;
  1563. case PACKED_VECTOR3_ARRAY: {
  1564. const Vector<Vector3> *arr = &PackedArrayRef<Vector3>::get_array(_data.packed_array);
  1565. int idx = r_iter;
  1566. idx++;
  1567. if (idx >= arr->size()) {
  1568. return false;
  1569. }
  1570. r_iter = idx;
  1571. return true;
  1572. } break;
  1573. case PACKED_COLOR_ARRAY: {
  1574. const Vector<Color> *arr = &PackedArrayRef<Color>::get_array(_data.packed_array);
  1575. int idx = r_iter;
  1576. idx++;
  1577. if (idx >= arr->size()) {
  1578. return false;
  1579. }
  1580. r_iter = idx;
  1581. return true;
  1582. } break;
  1583. case PACKED_VECTOR4_ARRAY: {
  1584. const Vector<Vector4> *arr = &PackedArrayRef<Vector4>::get_array(_data.packed_array);
  1585. int idx = r_iter;
  1586. idx++;
  1587. if (idx >= arr->size()) {
  1588. return false;
  1589. }
  1590. r_iter = idx;
  1591. return true;
  1592. } break;
  1593. default: {
  1594. }
  1595. }
  1596. valid = false;
  1597. return false;
  1598. }
  1599. Variant Variant::iter_get(const Variant &r_iter, bool &r_valid) const {
  1600. r_valid = true;
  1601. switch (type) {
  1602. case INT: {
  1603. return r_iter;
  1604. } break;
  1605. case FLOAT: {
  1606. return r_iter;
  1607. } break;
  1608. case VECTOR2: {
  1609. return r_iter;
  1610. } break;
  1611. case VECTOR2I: {
  1612. return r_iter;
  1613. } break;
  1614. case VECTOR3: {
  1615. return r_iter;
  1616. } break;
  1617. case VECTOR3I: {
  1618. return r_iter;
  1619. } break;
  1620. case OBJECT: {
  1621. if (!_get_obj().obj) {
  1622. r_valid = false;
  1623. return Variant();
  1624. }
  1625. #ifdef DEBUG_ENABLED
  1626. if (EngineDebugger::is_active() && !_get_obj().id.is_ref_counted() && ObjectDB::get_instance(_get_obj().id) == nullptr) {
  1627. r_valid = false;
  1628. return Variant();
  1629. }
  1630. #endif
  1631. Callable::CallError ce;
  1632. ce.error = Callable::CallError::CALL_OK;
  1633. const Variant *refp[] = { &r_iter };
  1634. Variant ret = _get_obj().obj->callp(CoreStringName(_iter_get), refp, 1, ce);
  1635. if (ce.error != Callable::CallError::CALL_OK) {
  1636. r_valid = false;
  1637. return Variant();
  1638. }
  1639. //r_iter=ref[0];
  1640. return ret;
  1641. } break;
  1642. case STRING: {
  1643. const String *str = reinterpret_cast<const String *>(_data._mem);
  1644. return str->substr(r_iter, 1);
  1645. } break;
  1646. case DICTIONARY: {
  1647. return r_iter; //iterator is the same as the key
  1648. } break;
  1649. case ARRAY: {
  1650. const Array *arr = reinterpret_cast<const Array *>(_data._mem);
  1651. int idx = r_iter;
  1652. #ifdef DEBUG_ENABLED
  1653. if (idx < 0 || idx >= arr->size()) {
  1654. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for Array of size %d.", idx, arr->size()));
  1655. r_valid = false;
  1656. return Variant();
  1657. }
  1658. #endif
  1659. return arr->get(idx);
  1660. } break;
  1661. case PACKED_BYTE_ARRAY: {
  1662. const Vector<uint8_t> *arr = &PackedArrayRef<uint8_t>::get_array(_data.packed_array);
  1663. int idx = r_iter;
  1664. #ifdef DEBUG_ENABLED
  1665. if (idx < 0 || idx >= arr->size()) {
  1666. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedByteArray of size %d.", idx, arr->size()));
  1667. r_valid = false;
  1668. return Variant();
  1669. }
  1670. #endif
  1671. return arr->get(idx);
  1672. } break;
  1673. case PACKED_INT32_ARRAY: {
  1674. const Vector<int32_t> *arr = &PackedArrayRef<int32_t>::get_array(_data.packed_array);
  1675. int32_t idx = r_iter;
  1676. #ifdef DEBUG_ENABLED
  1677. if (idx < 0 || idx >= arr->size()) {
  1678. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedInt32Array of size %d.", idx, arr->size()));
  1679. r_valid = false;
  1680. return Variant();
  1681. }
  1682. #endif
  1683. return arr->get(idx);
  1684. } break;
  1685. case PACKED_INT64_ARRAY: {
  1686. const Vector<int64_t> *arr = &PackedArrayRef<int64_t>::get_array(_data.packed_array);
  1687. int64_t idx = r_iter;
  1688. #ifdef DEBUG_ENABLED
  1689. if (idx < 0 || idx >= arr->size()) {
  1690. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedInt64Array of size %d.", idx, arr->size()));
  1691. r_valid = false;
  1692. return Variant();
  1693. }
  1694. #endif
  1695. return arr->get(idx);
  1696. } break;
  1697. case PACKED_FLOAT32_ARRAY: {
  1698. const Vector<float> *arr = &PackedArrayRef<float>::get_array(_data.packed_array);
  1699. int idx = r_iter;
  1700. #ifdef DEBUG_ENABLED
  1701. if (idx < 0 || idx >= arr->size()) {
  1702. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedFloat32Array of size %d.", idx, arr->size()));
  1703. r_valid = false;
  1704. return Variant();
  1705. }
  1706. #endif
  1707. return arr->get(idx);
  1708. } break;
  1709. case PACKED_FLOAT64_ARRAY: {
  1710. const Vector<double> *arr = &PackedArrayRef<double>::get_array(_data.packed_array);
  1711. int idx = r_iter;
  1712. #ifdef DEBUG_ENABLED
  1713. if (idx < 0 || idx >= arr->size()) {
  1714. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedFloat64Array of size %d.", idx, arr->size()));
  1715. r_valid = false;
  1716. return Variant();
  1717. }
  1718. #endif
  1719. return arr->get(idx);
  1720. } break;
  1721. case PACKED_STRING_ARRAY: {
  1722. const Vector<String> *arr = &PackedArrayRef<String>::get_array(_data.packed_array);
  1723. int idx = r_iter;
  1724. #ifdef DEBUG_ENABLED
  1725. if (idx < 0 || idx >= arr->size()) {
  1726. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedStringArray of size %d.", idx, arr->size()));
  1727. r_valid = false;
  1728. return Variant();
  1729. }
  1730. #endif
  1731. return arr->get(idx);
  1732. } break;
  1733. case PACKED_VECTOR2_ARRAY: {
  1734. const Vector<Vector2> *arr = &PackedArrayRef<Vector2>::get_array(_data.packed_array);
  1735. int idx = r_iter;
  1736. #ifdef DEBUG_ENABLED
  1737. if (idx < 0 || idx >= arr->size()) {
  1738. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedVector2Array of size %d.", idx, arr->size()));
  1739. r_valid = false;
  1740. return Variant();
  1741. }
  1742. #endif
  1743. return arr->get(idx);
  1744. } break;
  1745. case PACKED_VECTOR3_ARRAY: {
  1746. const Vector<Vector3> *arr = &PackedArrayRef<Vector3>::get_array(_data.packed_array);
  1747. int idx = r_iter;
  1748. #ifdef DEBUG_ENABLED
  1749. if (idx < 0 || idx >= arr->size()) {
  1750. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedVector3Array of size %d.", idx, arr->size()));
  1751. r_valid = false;
  1752. return Variant();
  1753. }
  1754. #endif
  1755. return arr->get(idx);
  1756. } break;
  1757. case PACKED_COLOR_ARRAY: {
  1758. const Vector<Color> *arr = &PackedArrayRef<Color>::get_array(_data.packed_array);
  1759. int idx = r_iter;
  1760. #ifdef DEBUG_ENABLED
  1761. if (idx < 0 || idx >= arr->size()) {
  1762. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedColorArray of size %d.", idx, arr->size()));
  1763. r_valid = false;
  1764. return Variant();
  1765. }
  1766. #endif
  1767. return arr->get(idx);
  1768. } break;
  1769. case PACKED_VECTOR4_ARRAY: {
  1770. const Vector<Vector4> *arr = &PackedArrayRef<Vector4>::get_array(_data.packed_array);
  1771. int idx = r_iter;
  1772. #ifdef DEBUG_ENABLED
  1773. if (idx < 0 || idx >= arr->size()) {
  1774. ERR_PRINT(vformat("iter_get: Index %d is out of bounds for PackedVector4Array of size %d.", idx, arr->size()));
  1775. r_valid = false;
  1776. return Variant();
  1777. }
  1778. #endif
  1779. return arr->get(idx);
  1780. } break;
  1781. default: {
  1782. }
  1783. }
  1784. r_valid = false;
  1785. return Variant();
  1786. }
  1787. Variant Variant::duplicate(bool p_deep) const {
  1788. return recursive_duplicate(p_deep, RESOURCE_DEEP_DUPLICATE_NONE, 0);
  1789. }
  1790. Variant Variant::duplicate_deep(ResourceDeepDuplicateMode p_deep_subresources_mode) const {
  1791. ERR_FAIL_INDEX_V(p_deep_subresources_mode, RESOURCE_DEEP_DUPLICATE_MAX, Variant());
  1792. return recursive_duplicate(true, p_deep_subresources_mode, 0);
  1793. }
  1794. Variant Variant::recursive_duplicate(bool p_deep, ResourceDeepDuplicateMode p_deep_subresources_mode, int recursion_count) const {
  1795. switch (type) {
  1796. case OBJECT: {
  1797. // If the root target of duplicate() is a Resource, we can't early-reject because that
  1798. // resource itself must be duplicated, much as if Resource::duplicate() had been called.
  1799. if (p_deep_subresources_mode == RESOURCE_DEEP_DUPLICATE_NONE && recursion_count > 0) {
  1800. return *this;
  1801. }
  1802. Resource *res = Object::cast_to<Resource>(_get_obj().obj);
  1803. if (res) {
  1804. return res->_duplicate_from_variant(p_deep, p_deep_subresources_mode, recursion_count);
  1805. } else {
  1806. return *this;
  1807. }
  1808. } break;
  1809. case DICTIONARY:
  1810. return operator Dictionary().recursive_duplicate(p_deep, p_deep_subresources_mode, recursion_count);
  1811. case ARRAY:
  1812. return operator Array().recursive_duplicate(p_deep, p_deep_subresources_mode, recursion_count);
  1813. case PACKED_BYTE_ARRAY:
  1814. return operator Vector<uint8_t>().duplicate();
  1815. case PACKED_INT32_ARRAY:
  1816. return operator Vector<int32_t>().duplicate();
  1817. case PACKED_INT64_ARRAY:
  1818. return operator Vector<int64_t>().duplicate();
  1819. case PACKED_FLOAT32_ARRAY:
  1820. return operator Vector<float>().duplicate();
  1821. case PACKED_FLOAT64_ARRAY:
  1822. return operator Vector<double>().duplicate();
  1823. case PACKED_STRING_ARRAY:
  1824. return operator Vector<String>().duplicate();
  1825. case PACKED_VECTOR2_ARRAY:
  1826. return operator Vector<Vector2>().duplicate();
  1827. case PACKED_VECTOR3_ARRAY:
  1828. return operator Vector<Vector3>().duplicate();
  1829. case PACKED_COLOR_ARRAY:
  1830. return operator Vector<Color>().duplicate();
  1831. case PACKED_VECTOR4_ARRAY:
  1832. return operator Vector<Vector4>().duplicate();
  1833. default:
  1834. return *this;
  1835. }
  1836. }
  1837. void Variant::_register_variant_setters_getters() {
  1838. register_named_setters_getters();
  1839. register_indexed_setters_getters();
  1840. register_keyed_setters_getters();
  1841. }
  1842. void Variant::_unregister_variant_setters_getters() {
  1843. unregister_named_setters_getters();
  1844. unregister_indexed_setters_getters();
  1845. }