Variant.cpp 20 KB

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