Variant.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. /*************************************************************************/
  2. /* Variant.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "Variant.hpp"
  31. #include <gdnative/variant.h>
  32. #include "CoreTypes.hpp"
  33. #include "Defs.hpp"
  34. #include "GodotGlobal.hpp"
  35. #include "Object.hpp"
  36. namespace godot {
  37. Variant::Variant() {
  38. godot::api->godot_variant_new_nil(&_godot_variant);
  39. }
  40. Variant::Variant(const Variant &v) {
  41. godot::api->godot_variant_new_copy(&_godot_variant, &v._godot_variant);
  42. }
  43. Variant::Variant(bool p_bool) {
  44. godot::api->godot_variant_new_bool(&_godot_variant, p_bool);
  45. }
  46. Variant::Variant(signed int p_int) // real one
  47. {
  48. godot::api->godot_variant_new_int(&_godot_variant, p_int);
  49. }
  50. Variant::Variant(unsigned int p_int) {
  51. godot::api->godot_variant_new_uint(&_godot_variant, p_int);
  52. }
  53. Variant::Variant(signed short p_short) // real one
  54. {
  55. godot::api->godot_variant_new_int(&_godot_variant, (int)p_short);
  56. }
  57. Variant::Variant(int64_t p_char) // real one
  58. {
  59. godot::api->godot_variant_new_int(&_godot_variant, p_char);
  60. }
  61. Variant::Variant(uint64_t p_char) {
  62. godot::api->godot_variant_new_uint(&_godot_variant, p_char);
  63. }
  64. Variant::Variant(float p_float) {
  65. godot::api->godot_variant_new_real(&_godot_variant, p_float);
  66. }
  67. Variant::Variant(double p_double) {
  68. godot::api->godot_variant_new_real(&_godot_variant, p_double);
  69. }
  70. Variant::Variant(const String &p_string) {
  71. godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&p_string);
  72. }
  73. Variant::Variant(const char *const p_cstring) {
  74. String s = String(p_cstring);
  75. godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&s);
  76. }
  77. Variant::Variant(const wchar_t *p_wstring) {
  78. String s = p_wstring;
  79. godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&s);
  80. }
  81. Variant::Variant(const Vector2 &p_vector2) {
  82. godot::api->godot_variant_new_vector2(&_godot_variant, (godot_vector2 *)&p_vector2);
  83. }
  84. Variant::Variant(const Rect2 &p_rect2) {
  85. godot::api->godot_variant_new_rect2(&_godot_variant, (godot_rect2 *)&p_rect2);
  86. }
  87. Variant::Variant(const Vector3 &p_vector3) {
  88. godot::api->godot_variant_new_vector3(&_godot_variant, (godot_vector3 *)&p_vector3);
  89. }
  90. Variant::Variant(const Plane &p_plane) {
  91. godot::api->godot_variant_new_plane(&_godot_variant, (godot_plane *)&p_plane);
  92. }
  93. Variant::Variant(const AABB &p_aabb) {
  94. godot::api->godot_variant_new_aabb(&_godot_variant, (godot_aabb *)&p_aabb);
  95. }
  96. Variant::Variant(const Quat &p_quat) {
  97. godot::api->godot_variant_new_quat(&_godot_variant, (godot_quat *)&p_quat);
  98. }
  99. Variant::Variant(const Basis &p_transform) {
  100. godot::api->godot_variant_new_basis(&_godot_variant, (godot_basis *)&p_transform);
  101. }
  102. Variant::Variant(const Transform2D &p_transform) {
  103. godot::api->godot_variant_new_transform2d(&_godot_variant, (godot_transform2d *)&p_transform);
  104. }
  105. Variant::Variant(const Transform &p_transform) {
  106. godot::api->godot_variant_new_transform(&_godot_variant, (godot_transform *)&p_transform);
  107. }
  108. Variant::Variant(const Color &p_color) {
  109. godot::api->godot_variant_new_color(&_godot_variant, (godot_color *)&p_color);
  110. }
  111. Variant::Variant(const NodePath &p_path) {
  112. godot::api->godot_variant_new_node_path(&_godot_variant, (godot_node_path *)&p_path);
  113. }
  114. Variant::Variant(const RID &p_rid) {
  115. godot::api->godot_variant_new_rid(&_godot_variant, (godot_rid *)&p_rid);
  116. }
  117. Variant::Variant(const Object *p_object) {
  118. if (p_object)
  119. godot::api->godot_variant_new_object(&_godot_variant, p_object->_owner);
  120. else
  121. godot::api->godot_variant_new_nil(&_godot_variant);
  122. }
  123. Variant::Variant(const Dictionary &p_dictionary) {
  124. godot::api->godot_variant_new_dictionary(&_godot_variant, (godot_dictionary *)&p_dictionary);
  125. }
  126. Variant::Variant(const Array &p_array) {
  127. godot::api->godot_variant_new_array(&_godot_variant, (godot_array *)&p_array);
  128. }
  129. Variant::Variant(const PoolByteArray &p_raw_array) {
  130. godot::api->godot_variant_new_pool_byte_array(&_godot_variant, (godot_pool_byte_array *)&p_raw_array);
  131. }
  132. Variant::Variant(const PoolIntArray &p_int_array) {
  133. godot::api->godot_variant_new_pool_int_array(&_godot_variant, (godot_pool_int_array *)&p_int_array);
  134. }
  135. Variant::Variant(const PoolRealArray &p_real_array) {
  136. godot::api->godot_variant_new_pool_real_array(&_godot_variant, (godot_pool_real_array *)&p_real_array);
  137. }
  138. Variant::Variant(const PoolStringArray &p_string_array) {
  139. godot::api->godot_variant_new_pool_string_array(&_godot_variant, (godot_pool_string_array *)&p_string_array);
  140. }
  141. Variant::Variant(const PoolVector2Array &p_vector2_array) {
  142. godot::api->godot_variant_new_pool_vector2_array(&_godot_variant, (godot_pool_vector2_array *)&p_vector2_array);
  143. }
  144. Variant::Variant(const PoolVector3Array &p_vector3_array) {
  145. godot::api->godot_variant_new_pool_vector3_array(&_godot_variant, (godot_pool_vector3_array *)&p_vector3_array);
  146. }
  147. Variant::Variant(const PoolColorArray &p_color_array) {
  148. godot::api->godot_variant_new_pool_color_array(&_godot_variant, (godot_pool_color_array *)&p_color_array);
  149. }
  150. Variant &Variant::operator=(const Variant &v) {
  151. godot::api->godot_variant_destroy(&_godot_variant);
  152. godot::api->godot_variant_new_copy(&_godot_variant, &v._godot_variant);
  153. return *this;
  154. }
  155. Variant::operator bool() const {
  156. return booleanize();
  157. }
  158. Variant::operator signed int() const {
  159. return godot::api->godot_variant_as_int(&_godot_variant);
  160. }
  161. Variant::operator unsigned int() const // this is the real one
  162. {
  163. return godot::api->godot_variant_as_uint(&_godot_variant);
  164. }
  165. Variant::operator signed short() const {
  166. return godot::api->godot_variant_as_int(&_godot_variant);
  167. }
  168. Variant::operator unsigned short() const {
  169. return godot::api->godot_variant_as_uint(&_godot_variant);
  170. }
  171. Variant::operator signed char() const {
  172. return godot::api->godot_variant_as_int(&_godot_variant);
  173. }
  174. Variant::operator unsigned char() const {
  175. return godot::api->godot_variant_as_uint(&_godot_variant);
  176. }
  177. Variant::operator int64_t() const {
  178. return godot::api->godot_variant_as_int(&_godot_variant);
  179. }
  180. Variant::operator uint64_t() const {
  181. return godot::api->godot_variant_as_uint(&_godot_variant);
  182. }
  183. Variant::operator wchar_t() const {
  184. return godot::api->godot_variant_as_int(&_godot_variant);
  185. }
  186. Variant::operator float() const {
  187. return godot::api->godot_variant_as_real(&_godot_variant);
  188. }
  189. Variant::operator double() const {
  190. return godot::api->godot_variant_as_real(&_godot_variant);
  191. }
  192. Variant::operator String() const {
  193. godot_string s = godot::api->godot_variant_as_string(&_godot_variant);
  194. return String(s);
  195. }
  196. Variant::operator Vector2() const {
  197. godot_vector2 s = godot::api->godot_variant_as_vector2(&_godot_variant);
  198. return *(Vector2 *)&s;
  199. }
  200. Variant::operator Rect2() const {
  201. godot_rect2 s = godot::api->godot_variant_as_rect2(&_godot_variant);
  202. return *(Rect2 *)&s;
  203. }
  204. Variant::operator Vector3() const {
  205. godot_vector3 s = godot::api->godot_variant_as_vector3(&_godot_variant);
  206. return *(Vector3 *)&s;
  207. }
  208. Variant::operator Plane() const {
  209. godot_plane s = godot::api->godot_variant_as_plane(&_godot_variant);
  210. return *(Plane *)&s;
  211. }
  212. Variant::operator AABB() const {
  213. godot_aabb s = godot::api->godot_variant_as_aabb(&_godot_variant);
  214. return *(AABB *)&s;
  215. }
  216. Variant::operator Quat() const {
  217. godot_quat s = godot::api->godot_variant_as_quat(&_godot_variant);
  218. return *(Quat *)&s;
  219. }
  220. Variant::operator Basis() const {
  221. godot_basis s = godot::api->godot_variant_as_basis(&_godot_variant);
  222. return *(Basis *)&s;
  223. }
  224. Variant::operator Transform() const {
  225. godot_transform s = godot::api->godot_variant_as_transform(&_godot_variant);
  226. return *(Transform *)&s;
  227. }
  228. Variant::operator Transform2D() const {
  229. godot_transform2d s = godot::api->godot_variant_as_transform2d(&_godot_variant);
  230. return *(Transform2D *)&s;
  231. }
  232. Variant::operator Color() const {
  233. godot_color s = godot::api->godot_variant_as_color(&_godot_variant);
  234. return *(Color *)&s;
  235. }
  236. Variant::operator NodePath() const {
  237. godot_node_path ret = godot::api->godot_variant_as_node_path(&_godot_variant);
  238. return NodePath(ret);
  239. }
  240. Variant::operator RID() const {
  241. godot_rid s = godot::api->godot_variant_as_rid(&_godot_variant);
  242. return *(RID *)&s;
  243. }
  244. Variant::operator Dictionary() const {
  245. Dictionary ret(godot::api->godot_variant_as_dictionary(&_godot_variant));
  246. return ret;
  247. }
  248. Variant::operator Array() const {
  249. Array ret(godot::api->godot_variant_as_array(&_godot_variant));
  250. return ret;
  251. }
  252. Variant::operator PoolByteArray() const {
  253. godot_pool_byte_array ret = godot::api->godot_variant_as_pool_byte_array(&_godot_variant);
  254. return PoolByteArray(ret);
  255. }
  256. Variant::operator PoolIntArray() const {
  257. godot_pool_int_array ret = godot::api->godot_variant_as_pool_int_array(&_godot_variant);
  258. return PoolIntArray(ret);
  259. }
  260. Variant::operator PoolRealArray() const {
  261. godot_pool_real_array ret = godot::api->godot_variant_as_pool_real_array(&_godot_variant);
  262. return PoolRealArray(ret);
  263. }
  264. Variant::operator PoolStringArray() const {
  265. godot_pool_string_array ret = godot::api->godot_variant_as_pool_string_array(&_godot_variant);
  266. return PoolStringArray(ret);
  267. }
  268. Variant::operator PoolVector2Array() const {
  269. godot_pool_vector2_array ret = godot::api->godot_variant_as_pool_vector2_array(&_godot_variant);
  270. return PoolVector2Array(ret);
  271. }
  272. Variant::operator PoolVector3Array() const {
  273. godot_pool_vector3_array ret = godot::api->godot_variant_as_pool_vector3_array(&_godot_variant);
  274. return PoolVector3Array(ret);
  275. }
  276. Variant::operator PoolColorArray() const {
  277. godot_pool_color_array ret = godot::api->godot_variant_as_pool_color_array(&_godot_variant);
  278. return PoolColorArray(ret);
  279. }
  280. Variant::operator godot_object *() const {
  281. return godot::api->godot_variant_as_object(&_godot_variant);
  282. }
  283. Variant::Type Variant::get_type() const {
  284. return static_cast<Type>(godot::api->godot_variant_get_type(&_godot_variant));
  285. }
  286. Variant Variant::call(const String &method, const Variant **args, const int arg_count) {
  287. godot_variant v = godot::api->godot_variant_call(
  288. &_godot_variant, (godot_string *)&method, (const godot_variant **)args, arg_count, nullptr);
  289. return Variant(v);
  290. }
  291. bool Variant::has_method(const String &method) {
  292. return godot::api->godot_variant_has_method(&_godot_variant, (godot_string *)&method);
  293. }
  294. bool Variant::operator==(const Variant &b) const {
  295. return godot::api->godot_variant_operator_equal(&_godot_variant, &b._godot_variant);
  296. }
  297. bool Variant::operator!=(const Variant &b) const {
  298. return !(*this == b);
  299. }
  300. bool Variant::operator<(const Variant &b) const {
  301. return godot::api->godot_variant_operator_less(&_godot_variant, &b._godot_variant);
  302. }
  303. bool Variant::operator<=(const Variant &b) const {
  304. return (*this < b) || (*this == b);
  305. }
  306. bool Variant::operator>(const Variant &b) const {
  307. return !(*this <= b);
  308. }
  309. bool Variant::operator>=(const Variant &b) const {
  310. return !(*this < b);
  311. }
  312. bool Variant::hash_compare(const Variant &b) const {
  313. return godot::api->godot_variant_hash_compare(&_godot_variant, &b._godot_variant);
  314. }
  315. bool Variant::booleanize() const {
  316. return godot::api->godot_variant_booleanize(&_godot_variant);
  317. }
  318. Variant::~Variant() {
  319. godot::api->godot_variant_destroy(&_godot_variant);
  320. }
  321. } // namespace godot