variant.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. /**************************************************************************/
  2. /* variant.hpp */
  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. #pragma once
  31. #include <godot_cpp/core/defs.hpp>
  32. #include <godot_cpp/variant/array.hpp>
  33. #include <godot_cpp/variant/builtin_types.hpp>
  34. #include <godot_cpp/variant/variant_size.hpp>
  35. #include <gdextension_interface.h>
  36. #include <array>
  37. namespace godot {
  38. class ObjectID;
  39. class Variant {
  40. uint8_t opaque[GODOT_CPP_VARIANT_SIZE]{ 0 };
  41. friend class GDExtensionBinding;
  42. friend class MethodBind;
  43. friend class VariantInternal;
  44. static void init_bindings();
  45. public:
  46. enum Type {
  47. NIL,
  48. // atomic types
  49. BOOL,
  50. INT,
  51. FLOAT,
  52. STRING,
  53. // math types
  54. VECTOR2,
  55. VECTOR2I,
  56. RECT2,
  57. RECT2I,
  58. VECTOR3,
  59. VECTOR3I,
  60. TRANSFORM2D,
  61. VECTOR4,
  62. VECTOR4I,
  63. PLANE,
  64. QUATERNION,
  65. AABB,
  66. BASIS,
  67. TRANSFORM3D,
  68. PROJECTION,
  69. // misc types
  70. COLOR,
  71. STRING_NAME,
  72. NODE_PATH,
  73. RID,
  74. OBJECT,
  75. CALLABLE,
  76. SIGNAL,
  77. DICTIONARY,
  78. ARRAY,
  79. // typed arrays
  80. PACKED_BYTE_ARRAY,
  81. PACKED_INT32_ARRAY,
  82. PACKED_INT64_ARRAY,
  83. PACKED_FLOAT32_ARRAY,
  84. PACKED_FLOAT64_ARRAY,
  85. PACKED_STRING_ARRAY,
  86. PACKED_VECTOR2_ARRAY,
  87. PACKED_VECTOR3_ARRAY,
  88. PACKED_COLOR_ARRAY,
  89. PACKED_VECTOR4_ARRAY,
  90. VARIANT_MAX
  91. };
  92. enum Operator {
  93. // comparison
  94. OP_EQUAL,
  95. OP_NOT_EQUAL,
  96. OP_LESS,
  97. OP_LESS_EQUAL,
  98. OP_GREATER,
  99. OP_GREATER_EQUAL,
  100. // mathematic
  101. OP_ADD,
  102. OP_SUBTRACT,
  103. OP_MULTIPLY,
  104. OP_DIVIDE,
  105. OP_NEGATE,
  106. OP_POSITIVE,
  107. OP_MODULE,
  108. OP_POWER,
  109. // bitwise
  110. OP_SHIFT_LEFT,
  111. OP_SHIFT_RIGHT,
  112. OP_BIT_AND,
  113. OP_BIT_OR,
  114. OP_BIT_XOR,
  115. OP_BIT_NEGATE,
  116. // logic
  117. OP_AND,
  118. OP_OR,
  119. OP_XOR,
  120. OP_NOT,
  121. // containment
  122. OP_IN,
  123. OP_MAX
  124. };
  125. private:
  126. static GDExtensionVariantFromTypeConstructorFunc from_type_constructor[VARIANT_MAX];
  127. static GDExtensionTypeFromVariantConstructorFunc to_type_constructor[VARIANT_MAX];
  128. public:
  129. _FORCE_INLINE_ GDExtensionVariantPtr _native_ptr() const { return const_cast<uint8_t (*)[GODOT_CPP_VARIANT_SIZE]>(&opaque); }
  130. Variant();
  131. Variant(std::nullptr_t n) :
  132. Variant() {}
  133. explicit Variant(GDExtensionConstVariantPtr native_ptr);
  134. Variant(const Variant &other);
  135. Variant(Variant &&other);
  136. Variant(bool v);
  137. Variant(int64_t v);
  138. Variant(int32_t v) :
  139. Variant(static_cast<int64_t>(v)) {}
  140. Variant(int16_t v) :
  141. Variant(static_cast<int64_t>(v)) {}
  142. Variant(int8_t v) :
  143. Variant(static_cast<int64_t>(v)) {}
  144. Variant(uint64_t v) :
  145. Variant(static_cast<int64_t>(v)) {}
  146. Variant(uint32_t v) :
  147. Variant(static_cast<int64_t>(v)) {}
  148. Variant(uint16_t v) :
  149. Variant(static_cast<int64_t>(v)) {}
  150. Variant(uint8_t v) :
  151. Variant(static_cast<int64_t>(v)) {}
  152. Variant(double v);
  153. Variant(float v) :
  154. Variant((double)v) {}
  155. Variant(const String &v);
  156. Variant(const char *v) :
  157. Variant(String(v)) {}
  158. Variant(const char16_t *v) :
  159. Variant(String(v)) {}
  160. Variant(const char32_t *v) :
  161. Variant(String(v)) {}
  162. Variant(const wchar_t *v) :
  163. Variant(String(v)) {}
  164. Variant(const Vector2 &v);
  165. Variant(const Vector2i &v);
  166. Variant(const Rect2 &v);
  167. Variant(const Rect2i &v);
  168. Variant(const Vector3 &v);
  169. Variant(const Vector3i &v);
  170. Variant(const Transform2D &v);
  171. Variant(const Vector4 &v);
  172. Variant(const Vector4i &v);
  173. Variant(const Plane &v);
  174. Variant(const Quaternion &v);
  175. Variant(const godot::AABB &v);
  176. Variant(const Basis &v);
  177. Variant(const Transform3D &v);
  178. Variant(const Projection &v);
  179. Variant(const Color &v);
  180. Variant(const StringName &v);
  181. Variant(const NodePath &v);
  182. Variant(const godot::RID &v);
  183. Variant(const ObjectID &v);
  184. Variant(const Object *v);
  185. Variant(const Callable &v);
  186. Variant(const Signal &v);
  187. Variant(const Dictionary &v);
  188. Variant(const Array &v);
  189. Variant(const PackedByteArray &v);
  190. Variant(const PackedInt32Array &v);
  191. Variant(const PackedInt64Array &v);
  192. Variant(const PackedFloat32Array &v);
  193. Variant(const PackedFloat64Array &v);
  194. Variant(const PackedStringArray &v);
  195. Variant(const PackedVector2Array &v);
  196. Variant(const PackedVector3Array &v);
  197. Variant(const PackedColorArray &v);
  198. Variant(const PackedVector4Array &v);
  199. ~Variant();
  200. operator bool() const;
  201. operator int64_t() const;
  202. operator int32_t() const;
  203. operator int16_t() const;
  204. operator int8_t() const;
  205. operator uint64_t() const;
  206. operator uint32_t() const;
  207. operator uint16_t() const;
  208. operator uint8_t() const;
  209. operator double() const;
  210. operator float() const;
  211. operator String() const;
  212. operator Vector2() const;
  213. operator Vector2i() const;
  214. operator Rect2() const;
  215. operator Rect2i() const;
  216. operator Vector3() const;
  217. operator Vector3i() const;
  218. operator Transform2D() const;
  219. operator Vector4() const;
  220. operator Vector4i() const;
  221. operator Plane() const;
  222. operator Quaternion() const;
  223. operator godot::AABB() const;
  224. operator Basis() const;
  225. operator Transform3D() const;
  226. operator Projection() const;
  227. operator Color() const;
  228. operator StringName() const;
  229. operator NodePath() const;
  230. operator godot::RID() const;
  231. operator ObjectID() const;
  232. operator Object *() const;
  233. operator Callable() const;
  234. operator Signal() const;
  235. operator Dictionary() const;
  236. operator Array() const;
  237. operator PackedByteArray() const;
  238. operator PackedInt32Array() const;
  239. operator PackedInt64Array() const;
  240. operator PackedFloat32Array() const;
  241. operator PackedFloat64Array() const;
  242. operator PackedStringArray() const;
  243. operator PackedVector2Array() const;
  244. operator PackedVector3Array() const;
  245. operator PackedColorArray() const;
  246. operator PackedVector4Array() const;
  247. Object *get_validated_object() const;
  248. Variant &operator=(const Variant &other);
  249. Variant &operator=(Variant &&other);
  250. bool operator==(const Variant &other) const;
  251. bool operator!=(const Variant &other) const;
  252. bool operator<(const Variant &other) const;
  253. void callp(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error);
  254. template <typename... Args>
  255. Variant call(const StringName &method, Args... args) {
  256. std::array<Variant, sizeof...(args)> vargs = { args... };
  257. std::array<const Variant *, sizeof...(args)> argptrs;
  258. for (size_t i = 0; i < vargs.size(); i++) {
  259. argptrs[i] = &vargs[i];
  260. }
  261. Variant result;
  262. GDExtensionCallError error;
  263. callp(method, argptrs.data(), argptrs.size(), result, error);
  264. return result;
  265. }
  266. static void callp_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error);
  267. template <typename... Args>
  268. static Variant call_static(Variant::Type type, const StringName &method, Args... args) {
  269. std::array<Variant, sizeof...(args)> vargs = { args... };
  270. std::array<const Variant *, sizeof...(args)> argptrs;
  271. for (size_t i = 0; i < vargs.size(); i++) {
  272. argptrs[i] = &vargs[i];
  273. }
  274. Variant result;
  275. GDExtensionCallError error;
  276. callp_static(type, method, argptrs.data(), argptrs.size(), sizeof...(args), result, error);
  277. return result;
  278. }
  279. static void evaluate(const Operator &op, const Variant &a, const Variant &b, Variant &r_ret, bool &r_valid);
  280. void set(const Variant &key, const Variant &value, bool *r_valid = nullptr);
  281. void set_named(const StringName &name, const Variant &value, bool &r_valid);
  282. void set_indexed(int64_t index, const Variant &value, bool &r_valid, bool &r_oob);
  283. void set_keyed(const Variant &key, const Variant &value, bool &r_valid);
  284. Variant get(const Variant &key, bool *r_valid = nullptr) const;
  285. Variant get_named(const StringName &name, bool &r_valid) const;
  286. Variant get_indexed(int64_t index, bool &r_valid, bool &r_oob) const;
  287. Variant get_keyed(const Variant &key, bool &r_valid) const;
  288. bool in(const Variant &index, bool *r_valid = nullptr) const;
  289. bool iter_init(Variant &r_iter, bool &r_valid) const;
  290. bool iter_next(Variant &r_iter, bool &r_valid) const;
  291. Variant iter_get(const Variant &r_iter, bool &r_valid) const;
  292. Variant::Type get_type() const;
  293. bool has_method(const StringName &method) const;
  294. bool has_key(const Variant &key, bool *r_valid = nullptr) const;
  295. static bool has_member(Variant::Type type, const StringName &member);
  296. uint32_t hash() const;
  297. uint32_t recursive_hash(int recursion_count) const;
  298. bool hash_compare(const Variant &variant) const;
  299. bool booleanize() const;
  300. String stringify() const;
  301. Variant duplicate(bool deep = false) const;
  302. static String get_type_name(Variant::Type type);
  303. static bool can_convert(Variant::Type from, Variant::Type to);
  304. static bool can_convert_strict(Variant::Type from, Variant::Type to);
  305. void clear();
  306. };
  307. struct VariantHasher {
  308. static _FORCE_INLINE_ uint32_t hash(const Variant &p_variant) { return p_variant.hash(); }
  309. };
  310. struct VariantComparator {
  311. static _FORCE_INLINE_ bool compare(const Variant &p_lhs, const Variant &p_rhs) { return p_lhs.hash_compare(p_rhs); }
  312. };
  313. template <typename... VarArgs>
  314. String vformat(const String &p_text, const VarArgs... p_args) {
  315. Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported.
  316. Array args_array;
  317. args_array.resize(sizeof...(p_args));
  318. for (uint32_t i = 0; i < sizeof...(p_args); i++) {
  319. args_array[i] = args[i];
  320. }
  321. return p_text % args_array;
  322. }
  323. Variant &Array::Iterator::operator*() const {
  324. return *elem_ptr;
  325. }
  326. Variant *Array::Iterator::operator->() const {
  327. return elem_ptr;
  328. }
  329. Array::Iterator &Array::Iterator::operator++() {
  330. elem_ptr++;
  331. return *this;
  332. }
  333. Array::Iterator &Array::Iterator::operator--() {
  334. elem_ptr--;
  335. return *this;
  336. }
  337. const Variant &Array::ConstIterator::operator*() const {
  338. return *elem_ptr;
  339. }
  340. const Variant *Array::ConstIterator::operator->() const {
  341. return elem_ptr;
  342. }
  343. Array::ConstIterator &Array::ConstIterator::operator++() {
  344. elem_ptr++;
  345. return *this;
  346. }
  347. Array::ConstIterator &Array::ConstIterator::operator--() {
  348. elem_ptr--;
  349. return *this;
  350. }
  351. Array::Iterator Array::begin() {
  352. return Array::Iterator(ptrw());
  353. }
  354. Array::Iterator Array::end() {
  355. return Array::Iterator(ptrw() + size());
  356. }
  357. Array::ConstIterator Array::begin() const {
  358. return Array::ConstIterator(ptr());
  359. }
  360. Array::ConstIterator Array::end() const {
  361. return Array::ConstIterator(ptr() + size());
  362. }
  363. Array::Array(std::initializer_list<Variant> p_init) {
  364. ERR_FAIL_COND(resize(p_init.size()) != 0);
  365. size_t i = 0;
  366. for (const Variant &element : p_init) {
  367. set(i++, element);
  368. }
  369. }
  370. #include <godot_cpp/variant/builtin_vararg_methods.hpp>
  371. #ifdef REAL_T_IS_DOUBLE
  372. using PackedRealArray = PackedFloat64Array;
  373. #else
  374. using PackedRealArray = PackedFloat32Array;
  375. #endif // REAL_T_IS_DOUBLE
  376. } // namespace godot