Variant.cpp 20 KB

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