Variant.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. //
  2. // Copyright (c) 2008-2015 the Urho3D project.
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to deal
  6. // in the Software without restriction, including without limitation the rights
  7. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. // copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. // THE SOFTWARE.
  21. //
  22. #include "../Precompiled.h"
  23. #include "../Core/StringUtils.h"
  24. #include <cstring>
  25. namespace Atomic
  26. {
  27. const Variant Variant::EMPTY;
  28. const PODVector<unsigned char> Variant::emptyBuffer;
  29. const ResourceRef Variant::emptyResourceRef;
  30. const ResourceRefList Variant::emptyResourceRefList;
  31. const VariantMap Variant::emptyVariantMap;
  32. const VariantVector Variant::emptyVariantVector;
  33. static const char* typeNames[] =
  34. {
  35. "None",
  36. "Int",
  37. "Bool",
  38. "Float",
  39. "Vector2",
  40. "Vector3",
  41. "Vector4",
  42. "Quaternion",
  43. "Color",
  44. "String",
  45. "Buffer",
  46. "VoidPtr",
  47. "ResourceRef",
  48. "ResourceRefList",
  49. "VariantVector",
  50. "VariantMap",
  51. "IntRect",
  52. "IntVector2",
  53. "Ptr",
  54. "Matrix3",
  55. "Matrix3x4",
  56. "Matrix4",
  57. "Double",
  58. 0
  59. };
  60. Variant& Variant::operator =(const Variant& rhs)
  61. {
  62. SetType(rhs.GetType());
  63. switch (type_)
  64. {
  65. case VAR_STRING:
  66. *(reinterpret_cast<String*>(&value_)) = *(reinterpret_cast<const String*>(&rhs.value_));
  67. break;
  68. case VAR_BUFFER:
  69. *(reinterpret_cast<PODVector<unsigned char>*>(&value_)) = *(reinterpret_cast<const PODVector<unsigned char>*>(&rhs.value_));
  70. break;
  71. case VAR_RESOURCEREF:
  72. *(reinterpret_cast<ResourceRef*>(&value_)) = *(reinterpret_cast<const ResourceRef*>(&rhs.value_));
  73. break;
  74. case VAR_RESOURCEREFLIST:
  75. *(reinterpret_cast<ResourceRefList*>(&value_)) = *(reinterpret_cast<const ResourceRefList*>(&rhs.value_));
  76. break;
  77. case VAR_VARIANTVECTOR:
  78. *(reinterpret_cast<VariantVector*>(&value_)) = *(reinterpret_cast<const VariantVector*>(&rhs.value_));
  79. break;
  80. case VAR_VARIANTMAP:
  81. *(reinterpret_cast<VariantMap*>(&value_)) = *(reinterpret_cast<const VariantMap*>(&rhs.value_));
  82. break;
  83. case VAR_PTR:
  84. *(reinterpret_cast<WeakPtr<RefCounted>*>(&value_)) = *(reinterpret_cast<const WeakPtr<RefCounted>*>(&rhs.value_));
  85. break;
  86. case VAR_MATRIX3:
  87. *(reinterpret_cast<Matrix3*>(value_.ptr_)) = *(reinterpret_cast<const Matrix3*>(rhs.value_.ptr_));
  88. break;
  89. case VAR_MATRIX3X4:
  90. *(reinterpret_cast<Matrix3x4*>(value_.ptr_)) = *(reinterpret_cast<const Matrix3x4*>(rhs.value_.ptr_));
  91. break;
  92. case VAR_MATRIX4:
  93. *(reinterpret_cast<Matrix4*>(value_.ptr_)) = *(reinterpret_cast<const Matrix4*>(rhs.value_.ptr_));
  94. break;
  95. default:
  96. value_ = rhs.value_;
  97. break;
  98. }
  99. return *this;
  100. }
  101. bool Variant::operator ==(const Variant& rhs) const
  102. {
  103. if (type_ == VAR_VOIDPTR || type_ == VAR_PTR)
  104. return GetVoidPtr() == rhs.GetVoidPtr();
  105. else if (type_ != rhs.type_)
  106. return false;
  107. switch (type_)
  108. {
  109. case VAR_INT:
  110. return value_.int_ == rhs.value_.int_;
  111. case VAR_BOOL:
  112. return value_.bool_ == rhs.value_.bool_;
  113. case VAR_FLOAT:
  114. return value_.float_ == rhs.value_.float_;
  115. case VAR_VECTOR2:
  116. return *(reinterpret_cast<const Vector2*>(&value_)) == *(reinterpret_cast<const Vector2*>(&rhs.value_));
  117. case VAR_VECTOR3:
  118. return *(reinterpret_cast<const Vector3*>(&value_)) == *(reinterpret_cast<const Vector3*>(&rhs.value_));
  119. case VAR_VECTOR4:
  120. case VAR_QUATERNION:
  121. case VAR_COLOR:
  122. // Hack: use the Vector4 compare for all these classes, as they have the same memory structure
  123. return *(reinterpret_cast<const Vector4*>(&value_)) == *(reinterpret_cast<const Vector4*>(&rhs.value_));
  124. case VAR_STRING:
  125. return *(reinterpret_cast<const String*>(&value_)) == *(reinterpret_cast<const String*>(&rhs.value_));
  126. case VAR_BUFFER:
  127. return *(reinterpret_cast<const PODVector<unsigned char>*>(&value_)) ==
  128. *(reinterpret_cast<const PODVector<unsigned char>*>(&rhs.value_));
  129. case VAR_RESOURCEREF:
  130. return *(reinterpret_cast<const ResourceRef*>(&value_)) == *(reinterpret_cast<const ResourceRef*>(&rhs.value_));
  131. case VAR_RESOURCEREFLIST:
  132. return *(reinterpret_cast<const ResourceRefList*>(&value_)) == *(reinterpret_cast<const ResourceRefList*>(&rhs.value_));
  133. case VAR_VARIANTVECTOR:
  134. return *(reinterpret_cast<const VariantVector*>(&value_)) == *(reinterpret_cast<const VariantVector*>(&rhs.value_));
  135. case VAR_VARIANTMAP:
  136. return *(reinterpret_cast<const VariantMap*>(&value_)) == *(reinterpret_cast<const VariantMap*>(&rhs.value_));
  137. case VAR_INTRECT:
  138. return *(reinterpret_cast<const IntRect*>(&value_)) == *(reinterpret_cast<const IntRect*>(&rhs.value_));
  139. case VAR_INTVECTOR2:
  140. return *(reinterpret_cast<const IntVector2*>(&value_)) == *(reinterpret_cast<const IntVector2*>(&rhs.value_));
  141. case VAR_MATRIX3:
  142. return *(reinterpret_cast<const Matrix3*>(value_.ptr_)) == *(reinterpret_cast<const Matrix3*>(rhs.value_.ptr_));
  143. case VAR_MATRIX3X4:
  144. return *(reinterpret_cast<const Matrix3x4*>(value_.ptr_)) == *(reinterpret_cast<const Matrix3x4*>(rhs.value_.ptr_));
  145. case VAR_MATRIX4:
  146. return *(reinterpret_cast<const Matrix4*>(value_.ptr_)) == *(reinterpret_cast<const Matrix4*>(rhs.value_.ptr_));
  147. case VAR_DOUBLE:
  148. return *(reinterpret_cast<const double*>(&value_)) == *(reinterpret_cast<const double*>(&rhs.value_));
  149. default:
  150. return true;
  151. }
  152. }
  153. void Variant::FromString(const String& type, const String& value)
  154. {
  155. return FromString(GetTypeFromName(type), value.CString());
  156. }
  157. void Variant::FromString(const char* type, const char* value)
  158. {
  159. return FromString(GetTypeFromName(type), value);
  160. }
  161. void Variant::FromString(VariantType type, const String& value)
  162. {
  163. return FromString(type, value.CString());
  164. }
  165. void Variant::FromString(VariantType type, const char* value)
  166. {
  167. switch (type)
  168. {
  169. case VAR_INT:
  170. *this = ToInt(value);
  171. break;
  172. case VAR_BOOL:
  173. *this = ToBool(value);
  174. break;
  175. case VAR_FLOAT:
  176. *this = ToFloat(value);
  177. break;
  178. case VAR_VECTOR2:
  179. *this = ToVector2(value);
  180. break;
  181. case VAR_VECTOR3:
  182. *this = ToVector3(value);
  183. break;
  184. case VAR_VECTOR4:
  185. *this = ToVector4(value);
  186. break;
  187. case VAR_QUATERNION:
  188. *this = ToQuaternion(value);
  189. break;
  190. case VAR_COLOR:
  191. *this = ToColor(value);
  192. break;
  193. case VAR_STRING:
  194. *this = value;
  195. break;
  196. case VAR_BUFFER:
  197. {
  198. SetType(VAR_BUFFER);
  199. PODVector<unsigned char>& buffer = *(reinterpret_cast<PODVector<unsigned char>*>(&value_));
  200. StringToBuffer(buffer, value);
  201. }
  202. break;
  203. case VAR_VOIDPTR:
  204. // From string to void pointer not supported, set to null
  205. *this = (void*)0;
  206. break;
  207. case VAR_RESOURCEREF:
  208. {
  209. Vector<String> values = String::Split(value, ';');
  210. if (values.Size() == 2)
  211. {
  212. SetType(VAR_RESOURCEREF);
  213. ResourceRef& ref = *(reinterpret_cast<ResourceRef*>(&value_));
  214. ref.type_ = values[0];
  215. ref.name_ = values[1];
  216. }
  217. }
  218. break;
  219. case VAR_RESOURCEREFLIST:
  220. {
  221. Vector<String> values = String::Split(value, ';');
  222. if (values.Size() >= 1)
  223. {
  224. SetType(VAR_RESOURCEREFLIST);
  225. ResourceRefList& refList = *(reinterpret_cast<ResourceRefList*>(&value_));
  226. refList.type_ = values[0];
  227. refList.names_.Resize(values.Size() - 1);
  228. for (unsigned i = 1; i < values.Size(); ++i)
  229. refList.names_[i - 1] = values[i];
  230. }
  231. }
  232. break;
  233. case VAR_INTRECT:
  234. *this = ToIntRect(value);
  235. break;
  236. case VAR_INTVECTOR2:
  237. *this = ToIntVector2(value);
  238. break;
  239. case VAR_PTR:
  240. // From string to RefCounted pointer not supported, set to null
  241. *this = (RefCounted*)0;
  242. break;
  243. case VAR_MATRIX3:
  244. *this = ToMatrix3(value);
  245. break;
  246. case VAR_MATRIX3X4:
  247. *this = ToMatrix3x4(value);
  248. break;
  249. case VAR_MATRIX4:
  250. *this = ToMatrix4(value);
  251. break;
  252. case VAR_DOUBLE:
  253. *this = ToDouble(value);
  254. break;
  255. default:
  256. SetType(VAR_NONE);
  257. }
  258. }
  259. void Variant::SetBuffer(const void* data, unsigned size)
  260. {
  261. if (size && !data)
  262. size = 0;
  263. SetType(VAR_BUFFER);
  264. PODVector<unsigned char>& buffer = *(reinterpret_cast<PODVector<unsigned char>*>(&value_));
  265. buffer.Resize(size);
  266. if (size)
  267. memcpy(&buffer[0], data, size);
  268. }
  269. String Variant::GetTypeName() const
  270. {
  271. return typeNames[type_];
  272. }
  273. String Variant::ToString() const
  274. {
  275. switch (type_)
  276. {
  277. case VAR_INT:
  278. return String(value_.int_);
  279. case VAR_BOOL:
  280. return String(value_.bool_);
  281. case VAR_FLOAT:
  282. return String(value_.float_);
  283. case VAR_VECTOR2:
  284. return (reinterpret_cast<const Vector2*>(&value_))->ToString();
  285. case VAR_VECTOR3:
  286. return (reinterpret_cast<const Vector3*>(&value_))->ToString();
  287. case VAR_VECTOR4:
  288. return (reinterpret_cast<const Vector4*>(&value_))->ToString();
  289. case VAR_QUATERNION:
  290. return (reinterpret_cast<const Quaternion*>(&value_))->ToString();
  291. case VAR_COLOR:
  292. return (reinterpret_cast<const Color*>(&value_))->ToString();
  293. case VAR_STRING:
  294. return *(reinterpret_cast<const String*>(&value_));
  295. case VAR_BUFFER:
  296. {
  297. const PODVector<unsigned char>& buffer = *(reinterpret_cast<const PODVector<unsigned char>*>(&value_));
  298. String ret;
  299. BufferToString(ret, buffer.Begin().ptr_, buffer.Size());
  300. return ret;
  301. }
  302. case VAR_VOIDPTR:
  303. case VAR_PTR:
  304. // Pointer serialization not supported (convert to null)
  305. return String(0);
  306. case VAR_INTRECT:
  307. return (reinterpret_cast<const IntRect*>(&value_))->ToString();
  308. case VAR_INTVECTOR2:
  309. return (reinterpret_cast<const IntVector2*>(&value_))->ToString();
  310. default:
  311. // VAR_RESOURCEREF, VAR_RESOURCEREFLIST, VAR_VARIANTVECTOR, VAR_VARIANTMAP
  312. // Reference string serialization requires typehash-to-name mapping from the context. Can not support here
  313. // Also variant map or vector string serialization is not supported. XML or binary save should be used instead
  314. return String::EMPTY;
  315. case VAR_MATRIX3:
  316. return (reinterpret_cast<const Matrix3*>(value_.ptr_))->ToString();
  317. case VAR_MATRIX3X4:
  318. return (reinterpret_cast<const Matrix3x4*>(value_.ptr_))->ToString();
  319. case VAR_MATRIX4:
  320. return (reinterpret_cast<const Matrix4*>(value_.ptr_))->ToString();
  321. case VAR_DOUBLE:
  322. return String(*reinterpret_cast<const double*>(&value_));
  323. }
  324. }
  325. bool Variant::IsZero() const
  326. {
  327. switch (type_)
  328. {
  329. case VAR_INT:
  330. return value_.int_ == 0;
  331. case VAR_BOOL:
  332. return value_.bool_ == false;
  333. case VAR_FLOAT:
  334. return value_.float_ == 0.0f;
  335. case VAR_VECTOR2:
  336. return *reinterpret_cast<const Vector2*>(&value_) == Vector2::ZERO;
  337. case VAR_VECTOR3:
  338. return *reinterpret_cast<const Vector3*>(&value_) == Vector3::ZERO;
  339. case VAR_VECTOR4:
  340. return *reinterpret_cast<const Vector4*>(&value_) == Vector4::ZERO;
  341. case VAR_QUATERNION:
  342. return *reinterpret_cast<const Quaternion*>(&value_) == Quaternion::IDENTITY;
  343. case VAR_COLOR:
  344. // WHITE is considered empty (i.e. default) color in the Color class definition
  345. return *reinterpret_cast<const Color*>(&value_) == Color::WHITE;
  346. case VAR_STRING:
  347. return reinterpret_cast<const String*>(&value_)->Empty();
  348. case VAR_BUFFER:
  349. return reinterpret_cast<const PODVector<unsigned char>*>(&value_)->Empty();
  350. case VAR_VOIDPTR:
  351. return value_.ptr_ == 0;
  352. case VAR_RESOURCEREF:
  353. return reinterpret_cast<const ResourceRef*>(&value_)->name_.Empty();
  354. case VAR_RESOURCEREFLIST:
  355. {
  356. const Vector<String>& names = reinterpret_cast<const ResourceRefList*>(&value_)->names_;
  357. for (Vector<String>::ConstIterator i = names.Begin(); i != names.End(); ++i)
  358. {
  359. if (!i->Empty())
  360. return false;
  361. }
  362. return true;
  363. }
  364. case VAR_VARIANTVECTOR:
  365. return reinterpret_cast<const VariantVector*>(&value_)->Empty();
  366. case VAR_VARIANTMAP:
  367. return reinterpret_cast<const VariantMap*>(&value_)->Empty();
  368. case VAR_INTRECT:
  369. return *reinterpret_cast<const IntRect*>(&value_) == IntRect::ZERO;
  370. case VAR_INTVECTOR2:
  371. return *reinterpret_cast<const IntVector2*>(&value_) == IntVector2::ZERO;
  372. case VAR_PTR:
  373. return *reinterpret_cast<const WeakPtr<RefCounted>*>(&value_) == (RefCounted*)0;
  374. case VAR_MATRIX3:
  375. return *reinterpret_cast<const Matrix3*>(value_.ptr_) == Matrix3::IDENTITY;
  376. case VAR_MATRIX3X4:
  377. return *reinterpret_cast<const Matrix3x4*>(value_.ptr_) == Matrix3x4::IDENTITY;
  378. case VAR_MATRIX4:
  379. return *reinterpret_cast<const Matrix4*>(value_.ptr_) == Matrix4::IDENTITY;
  380. case VAR_DOUBLE:
  381. return *reinterpret_cast<const double*>(&value_) == 0.0;
  382. default:
  383. return true;
  384. }
  385. }
  386. void Variant::SetType(VariantType newType)
  387. {
  388. if (type_ == newType)
  389. return;
  390. switch (type_)
  391. {
  392. case VAR_STRING:
  393. (reinterpret_cast<String*>(&value_))->~String();
  394. break;
  395. case VAR_BUFFER:
  396. (reinterpret_cast<PODVector<unsigned char>*>(&value_))->~PODVector<unsigned char>();
  397. break;
  398. case VAR_RESOURCEREF:
  399. (reinterpret_cast<ResourceRef*>(&value_))->~ResourceRef();
  400. break;
  401. case VAR_RESOURCEREFLIST:
  402. (reinterpret_cast<ResourceRefList*>(&value_))->~ResourceRefList();
  403. break;
  404. case VAR_VARIANTVECTOR:
  405. (reinterpret_cast<VariantVector*>(&value_))->~VariantVector();
  406. break;
  407. case VAR_VARIANTMAP:
  408. (reinterpret_cast<VariantMap*>(&value_))->~VariantMap();
  409. break;
  410. case VAR_PTR:
  411. (reinterpret_cast<WeakPtr<RefCounted>*>(&value_))->~WeakPtr<RefCounted>();
  412. break;
  413. case VAR_MATRIX3:
  414. delete reinterpret_cast<Matrix3*>(value_.ptr_);
  415. break;
  416. case VAR_MATRIX3X4:
  417. delete reinterpret_cast<Matrix3x4*>(value_.ptr_);
  418. break;
  419. case VAR_MATRIX4:
  420. delete reinterpret_cast<Matrix4*>(value_.ptr_);
  421. break;
  422. default:
  423. break;
  424. }
  425. type_ = newType;
  426. switch (type_)
  427. {
  428. case VAR_STRING:
  429. new(reinterpret_cast<String*>(&value_)) String();
  430. break;
  431. case VAR_BUFFER:
  432. new(reinterpret_cast<PODVector<unsigned char>*>(&value_)) PODVector<unsigned char>();
  433. break;
  434. case VAR_RESOURCEREF:
  435. new(reinterpret_cast<ResourceRef*>(&value_)) ResourceRef();
  436. break;
  437. case VAR_RESOURCEREFLIST:
  438. new(reinterpret_cast<ResourceRefList*>(&value_)) ResourceRefList();
  439. break;
  440. case VAR_VARIANTVECTOR:
  441. new(reinterpret_cast<VariantVector*>(&value_)) VariantVector();
  442. break;
  443. case VAR_VARIANTMAP:
  444. new(reinterpret_cast<VariantMap*>(&value_)) VariantMap();
  445. break;
  446. case VAR_PTR:
  447. new(reinterpret_cast<WeakPtr<RefCounted>*>(&value_)) WeakPtr<RefCounted>();
  448. break;
  449. case VAR_MATRIX3:
  450. value_.ptr_ = new Matrix3();
  451. break;
  452. case VAR_MATRIX3X4:
  453. value_.ptr_ = new Matrix3x4();
  454. break;
  455. case VAR_MATRIX4:
  456. value_.ptr_ = new Matrix4();
  457. break;
  458. default:
  459. break;
  460. }
  461. }
  462. template <> int Variant::Get<int>() const
  463. {
  464. return GetInt();
  465. }
  466. template <> unsigned Variant::Get<unsigned>() const
  467. {
  468. return GetUInt();
  469. }
  470. template <> StringHash Variant::Get<StringHash>() const
  471. {
  472. return GetStringHash();
  473. }
  474. template <> bool Variant::Get<bool>() const
  475. {
  476. return GetBool();
  477. }
  478. template <> float Variant::Get<float>() const
  479. {
  480. return GetFloat();
  481. }
  482. template <> double Variant::Get<double>() const
  483. {
  484. return GetDouble();
  485. }
  486. template <> const Vector2& Variant::Get<const Vector2&>() const
  487. {
  488. return GetVector2();
  489. }
  490. template <> const Vector3& Variant::Get<const Vector3&>() const
  491. {
  492. return GetVector3();
  493. }
  494. template <> const Vector4& Variant::Get<const Vector4&>() const
  495. {
  496. return GetVector4();
  497. }
  498. template <> const Quaternion& Variant::Get<const Quaternion&>() const
  499. {
  500. return GetQuaternion();
  501. }
  502. template <> const Color& Variant::Get<const Color&>() const
  503. {
  504. return GetColor();
  505. }
  506. template <> const String& Variant::Get<const String&>() const
  507. {
  508. return GetString();
  509. }
  510. template <> const IntRect& Variant::Get<const IntRect&>() const
  511. {
  512. return GetIntRect();
  513. }
  514. template <> const IntVector2& Variant::Get<const IntVector2&>() const
  515. {
  516. return GetIntVector2();
  517. }
  518. template <> const PODVector<unsigned char>& Variant::Get<const PODVector<unsigned char>&>() const
  519. {
  520. return GetBuffer();
  521. }
  522. template <> void* Variant::Get<void*>() const
  523. {
  524. return GetVoidPtr();
  525. }
  526. template <> RefCounted* Variant::Get<RefCounted*>() const
  527. {
  528. return GetPtr();
  529. }
  530. template <> const Matrix3& Variant::Get<const Matrix3&>() const
  531. {
  532. return GetMatrix3();
  533. }
  534. template <> const Matrix3x4& Variant::Get<const Matrix3x4&>() const
  535. {
  536. return GetMatrix3x4();
  537. }
  538. template <> const Matrix4& Variant::Get<const Matrix4&>() const
  539. {
  540. return GetMatrix4();
  541. }
  542. template <> ResourceRef Variant::Get<ResourceRef>() const
  543. {
  544. return GetResourceRef();
  545. }
  546. template <> ResourceRefList Variant::Get<ResourceRefList>() const
  547. {
  548. return GetResourceRefList();
  549. }
  550. template <> VariantVector Variant::Get<VariantVector>() const
  551. {
  552. return GetVariantVector();
  553. }
  554. template <> VariantMap Variant::Get<VariantMap>() const
  555. {
  556. return GetVariantMap();
  557. }
  558. template <> Vector2 Variant::Get<Vector2>() const
  559. {
  560. return GetVector2();
  561. }
  562. template <> Vector3 Variant::Get<Vector3>() const
  563. {
  564. return GetVector3();
  565. }
  566. template <> Vector4 Variant::Get<Vector4>() const
  567. {
  568. return GetVector4();
  569. }
  570. template <> Quaternion Variant::Get<Quaternion>() const
  571. {
  572. return GetQuaternion();
  573. }
  574. template <> Color Variant::Get<Color>() const
  575. {
  576. return GetColor();
  577. }
  578. template <> String Variant::Get<String>() const
  579. {
  580. return GetString();
  581. }
  582. template <> IntRect Variant::Get<IntRect>() const
  583. {
  584. return GetIntRect();
  585. }
  586. template <> IntVector2 Variant::Get<IntVector2>() const
  587. {
  588. return GetIntVector2();
  589. }
  590. template <> PODVector<unsigned char> Variant::Get<PODVector<unsigned char> >() const
  591. {
  592. return GetBuffer();
  593. }
  594. template <> Matrix3 Variant::Get<Matrix3>() const
  595. {
  596. return GetMatrix3();
  597. }
  598. template <> Matrix3x4 Variant::Get<Matrix3x4>() const
  599. {
  600. return GetMatrix3x4();
  601. }
  602. template <> Matrix4 Variant::Get<Matrix4>() const
  603. {
  604. return GetMatrix4();
  605. }
  606. String Variant::GetTypeName(VariantType type)
  607. {
  608. return typeNames[type];
  609. }
  610. VariantType Variant::GetTypeFromName(const String& typeName)
  611. {
  612. return GetTypeFromName(typeName.CString());
  613. }
  614. VariantType Variant::GetTypeFromName(const char* typeName)
  615. {
  616. return (VariantType)GetStringListIndex(typeName, typeNames, VAR_NONE);
  617. }
  618. }