Variant.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "Deserializer.h"
  25. #include "Exception.h"
  26. #include "Log.h"
  27. #include "Serializer.h"
  28. #include "StringUtils.h"
  29. #include <cstring>
  30. #include "DebugNew.h"
  31. Variant& Variant::operator = (const Variant& rhs)
  32. {
  33. setType(rhs.getType());
  34. switch (mType)
  35. {
  36. case VAR_STRING:
  37. *(reinterpret_cast<std::string*>(mValue.mPtr)) = *(reinterpret_cast<const std::string*>(rhs.mValue.mPtr));
  38. break;
  39. case VAR_BUFFER:
  40. *(reinterpret_cast<std::vector<unsigned char>*>(mValue.mPtr)) = *(reinterpret_cast<const std::vector<unsigned char>*>(rhs.mValue.mPtr));
  41. break;
  42. case VAR_VARIANTVECTOR:
  43. *(reinterpret_cast<VariantVector*>(mValue.mPtr)) = *(reinterpret_cast<VariantVector*>(rhs.mValue.mPtr));
  44. break;
  45. case VAR_VARIANTMAP:
  46. *(reinterpret_cast<VariantMap*>(mValue.mPtr)) = *(reinterpret_cast<VariantMap*>(rhs.mValue.mPtr));
  47. break;
  48. default:
  49. mValue = rhs.mValue;
  50. break;
  51. }
  52. return *this;
  53. }
  54. bool Variant::operator == (const Variant& rhs) const
  55. {
  56. if (mType != rhs.mType)
  57. return false;
  58. switch (mType)
  59. {
  60. case VAR_INT:
  61. return mValue.mInt == rhs.mValue.mInt;
  62. case VAR_BOOL:
  63. return mValue.mBool == rhs.mValue.mBool;
  64. case VAR_FLOAT:
  65. return mValue.mFloat == rhs.mValue.mFloat;
  66. case VAR_VECTOR2:
  67. return *(reinterpret_cast<const Vector2*>(&mValue)) == *(reinterpret_cast<const Vector2*>(&rhs.mValue));
  68. case VAR_VECTOR3:
  69. return *(reinterpret_cast<const Vector3*>(&mValue)) == *(reinterpret_cast<const Vector3*>(&rhs.mValue));
  70. case VAR_VECTOR4:
  71. return *(reinterpret_cast<const Vector4*>(&mValue)) == *(reinterpret_cast<const Vector4*>(&rhs.mValue));
  72. case VAR_QUATERNION:
  73. return *(reinterpret_cast<const Quaternion*>(&mValue)) == *(reinterpret_cast<const Quaternion*>(&rhs.mValue));
  74. case VAR_COLOR:
  75. return *(reinterpret_cast<const Color*>(&mValue)) == *(reinterpret_cast<const Color*>(&rhs.mValue));
  76. case VAR_STRING:
  77. return *(reinterpret_cast<const std::string*>(mValue.mPtr)) == *(reinterpret_cast<const std::string*>(rhs.mValue.mPtr));
  78. case VAR_BUFFER:
  79. return *(reinterpret_cast<const std::vector<unsigned char>*>(mValue.mPtr)) == *(reinterpret_cast<const std::vector<unsigned char>*>(rhs.mValue.mPtr));
  80. case VAR_PTR:
  81. return mValue.mPtr == rhs.mValue.mPtr;
  82. case VAR_VARIANTVECTOR:
  83. return *(reinterpret_cast<const VariantVector*>(mValue.mPtr)) == *(reinterpret_cast<const VariantVector*>(rhs.mValue.mPtr));
  84. case VAR_VARIANTMAP:
  85. return *(reinterpret_cast<const VariantMap*>(mValue.mPtr)) == *(reinterpret_cast<const VariantMap*>(rhs.mValue.mPtr));
  86. }
  87. return true;
  88. }
  89. void Variant::fromString(const std::string& type, const std::string& value)
  90. {
  91. std::string typeLower = toLower(type);
  92. if (typeLower == "none")
  93. setType(VAR_NONE);
  94. else if (typeLower == "int")
  95. *this = toInt(value);
  96. else if (typeLower == "bool")
  97. *this = toBool(value);
  98. else if (typeLower == "float")
  99. *this = toFloat(value);
  100. else if (typeLower == "vector2")
  101. *this = toVector2(value);
  102. else if (typeLower == "vector3")
  103. *this = toVector3(value);
  104. else if (typeLower == "vector4")
  105. *this = toVector4(value);
  106. else if (typeLower == "quaternion")
  107. *this = toQuaternion(value);
  108. else if (typeLower == "color")
  109. *this = toColor(value);
  110. else if (typeLower == "string")
  111. *this = value;
  112. else if (typeLower == "buffer")
  113. {
  114. setType(VAR_BUFFER);
  115. std::vector<unsigned char>& buffer = *(reinterpret_cast<std::vector<unsigned char>*>(mValue.mPtr));
  116. std::vector<std::string> values = split(value, ' ');
  117. buffer.resize(values.size());
  118. for (unsigned i = 0; i < values.size(); ++i)
  119. buffer[i] = toInt(values[i]);
  120. }
  121. else if (typeLower == "pointer")
  122. {
  123. LOGWARNING("Deserialized pointer Variant set to null");
  124. *this = (void*)0;
  125. }
  126. else if (typeLower == "variantvector")
  127. {
  128. setType(VAR_VARIANTVECTOR);
  129. VariantVector& dest = *(reinterpret_cast<VariantVector*>(mValue.mPtr));
  130. std::vector<std::string> values = split(value, '#');
  131. dest.resize(values.size() >> 1);
  132. for (unsigned i = 0; i < values.size() - 1; i += 2)
  133. dest[i >> 1].fromString(values[i], values[i + 1]);
  134. }
  135. else if (typeLower == "variantmap")
  136. {
  137. setType(VAR_VARIANTMAP);
  138. VariantMap& dest = *(reinterpret_cast<VariantMap*>(mValue.mPtr));
  139. dest.clear();
  140. std::vector<std::string> values = split(value, '#');
  141. for (unsigned i = 0; i < values.size() - 2; i += 3)
  142. dest[ShortStringHash(values[i])].fromString(values[i + 1], values[i + 2]);
  143. }
  144. else
  145. setType(VAR_NONE);
  146. }
  147. void Variant::write(Serializer& dest) const
  148. {
  149. dest.writeUByte(mType);
  150. switch (mType)
  151. {
  152. case VAR_NONE:
  153. break;
  154. case VAR_INT:
  155. dest.writeInt(mValue.mInt);
  156. break;
  157. case VAR_BOOL:
  158. dest.writeBool(mValue.mBool);
  159. break;
  160. case VAR_FLOAT:
  161. dest.writeFloat(mValue.mFloat);
  162. break;
  163. case VAR_VECTOR2:
  164. dest.writeVector2(*(reinterpret_cast<const Vector2*>(&mValue)));
  165. break;
  166. case VAR_VECTOR3:
  167. dest.writeVector3(*(reinterpret_cast<const Vector3*>(&mValue)));
  168. break;
  169. case VAR_VECTOR4:
  170. dest.writeVector4(*(reinterpret_cast<const Vector4*>(&mValue)));
  171. break;
  172. case VAR_QUATERNION:
  173. dest.writeQuaternion(*(reinterpret_cast<const Quaternion*>(&mValue)));
  174. break;
  175. case VAR_COLOR:
  176. dest.writeColor(*(reinterpret_cast<const Color*>(&mValue)));
  177. break;
  178. case VAR_STRING:
  179. dest.writeString(*(reinterpret_cast<const std::string*>(mValue.mPtr)));
  180. break;
  181. case VAR_BUFFER:
  182. {
  183. const std::vector<unsigned char>& buffer = *(reinterpret_cast<const std::vector<unsigned char>*>(mValue.mPtr));
  184. dest.writeVLE(buffer.size());
  185. if (buffer.size())
  186. dest.write(&buffer[0], buffer.size());
  187. }
  188. break;
  189. case VAR_PTR:
  190. LOGWARNING("Serialized pointer Variant set to null");
  191. dest.writeUInt(0);
  192. break;
  193. case VAR_VARIANTVECTOR:
  194. {
  195. const VariantVector& src = *(reinterpret_cast<VariantVector*>(mValue.mPtr));
  196. dest.writeVariantVector(src);
  197. }
  198. break;
  199. case VAR_VARIANTMAP:
  200. {
  201. const VariantMap& src = *(reinterpret_cast<VariantMap*>(mValue.mPtr));
  202. dest.writeVariantMap(src);
  203. }
  204. break;
  205. }
  206. }
  207. void Variant::read(Deserializer& source)
  208. {
  209. VariantType type = (VariantType)source.readUByte();
  210. switch (type)
  211. {
  212. case VAR_NONE:
  213. setType(VAR_NONE);
  214. break;
  215. case VAR_INT:
  216. *this = source.readInt();
  217. break;
  218. case VAR_BOOL:
  219. *this = source.readBool();
  220. break;
  221. case VAR_FLOAT:
  222. *this = source.readFloat();
  223. break;
  224. case VAR_VECTOR2:
  225. *this = source.readVector2();
  226. break;
  227. case VAR_VECTOR3:
  228. *this = source.readVector3();
  229. break;
  230. case VAR_VECTOR4:
  231. *this = source.readVector4();
  232. break;
  233. case VAR_QUATERNION:
  234. *this = source.readQuaternion();
  235. break;
  236. case VAR_COLOR:
  237. *this = source.readColor();
  238. break;
  239. case VAR_STRING:
  240. *this = source.readString();
  241. break;
  242. case VAR_BUFFER:
  243. {
  244. setType(VAR_BUFFER);
  245. std::vector<unsigned char>& buffer = *(reinterpret_cast<std::vector<unsigned char>*>(mValue.mPtr));
  246. buffer.resize(source.readVLE());
  247. if (buffer.size())
  248. source.read(&buffer[0], buffer.size());
  249. }
  250. break;
  251. case VAR_PTR:
  252. LOGWARNING("Deserialized pointer Variant set to null");
  253. source.readUInt();
  254. *this = (void*)0;
  255. break;
  256. case VAR_VARIANTVECTOR:
  257. {
  258. setType(VAR_VARIANTVECTOR);
  259. VariantVector& dest = *(reinterpret_cast<VariantVector*>(mValue.mPtr));
  260. unsigned num = source.readVLE();
  261. dest.resize(num);
  262. for (unsigned i = 0; i < num; ++i)
  263. dest[i].read(source);
  264. }
  265. break;
  266. case VAR_VARIANTMAP:
  267. {
  268. setType(VAR_VARIANTMAP);
  269. VariantMap& dest = *(reinterpret_cast<VariantMap*>(mValue.mPtr));
  270. dest.clear();
  271. unsigned num = source.readVLE();
  272. for (unsigned i = 0; i < num; ++i)
  273. {
  274. ShortStringHash key = source.readShortStringHash();
  275. dest[key].read(source);
  276. }
  277. }
  278. break;
  279. default:
  280. SAFE_EXCEPTION("Unrecognized Variant type " + ::toString((int)mType));
  281. }
  282. }
  283. void Variant::setBuffer(const void* data, unsigned size)
  284. {
  285. if ((size) && (!data))
  286. SAFE_EXCEPTION("Null Variant buffer source");
  287. setType(VAR_BUFFER);
  288. std::vector<unsigned char>& buffer = *(reinterpret_cast<std::vector<unsigned char>*>(mValue.mPtr));
  289. buffer.resize(size);
  290. if (buffer.size())
  291. memcpy(&buffer[0], data, size);
  292. }
  293. const std::string& Variant::getTypeName() const
  294. {
  295. static const std::string typeNames[] =
  296. {
  297. "None",
  298. "Int",
  299. "Bool",
  300. "Float",
  301. "Vector2",
  302. "Vector3",
  303. "Vector4",
  304. "Quaternion",
  305. "Color",
  306. "String",
  307. "Buffer",
  308. "Pointer",
  309. "VariantVector",
  310. "VariantMap"
  311. };
  312. return typeNames[mType];
  313. }
  314. std::string Variant::toString() const
  315. {
  316. switch (mType)
  317. {
  318. case VAR_INT:
  319. return ::toString(mValue.mInt);
  320. case VAR_BOOL:
  321. return ::toString(mValue.mBool);
  322. case VAR_FLOAT:
  323. return ::toString(mValue.mFloat);
  324. case VAR_VECTOR2:
  325. return ::toString(*(reinterpret_cast<const Vector2*>(&mValue)));
  326. case VAR_VECTOR3:
  327. return ::toString(*(reinterpret_cast<const Vector3*>(&mValue)));
  328. case VAR_VECTOR4:
  329. return ::toString(*(reinterpret_cast<const Vector4*>(&mValue)));
  330. case VAR_QUATERNION:
  331. return ::toString(*(reinterpret_cast<const Quaternion*>(&mValue)));
  332. case VAR_COLOR:
  333. return ::toString(*(reinterpret_cast<const Color*>(&mValue)));
  334. case VAR_STRING:
  335. return *(reinterpret_cast<const std::string*>(mValue.mPtr));
  336. case VAR_BUFFER:
  337. {
  338. const std::vector<unsigned char>& buffer = *(reinterpret_cast<const std::vector<unsigned char>*>(mValue.mPtr));
  339. std::string ret;
  340. for (std::vector<unsigned char>::const_iterator i = buffer.begin(); i != buffer.end(); ++i)
  341. {
  342. if (i != buffer.begin())
  343. ret += " ";
  344. ret += ::toString(*i);
  345. }
  346. return ret;
  347. }
  348. case VAR_PTR:
  349. LOGWARNING("Serialized pointer Variant set to null");
  350. return ::toString((unsigned)0);
  351. case VAR_VARIANTVECTOR:
  352. {
  353. const VariantVector& src = *(reinterpret_cast<const VariantVector*>(mValue.mPtr));
  354. std::string ret;
  355. for (VariantVector::const_iterator i = src.begin(); i != src.end(); ++i)
  356. {
  357. if (i != src.begin())
  358. ret += "#";
  359. ret += i->getTypeName() + "#";
  360. ret += i->toString();
  361. }
  362. return ret;
  363. }
  364. case VAR_VARIANTMAP:
  365. {
  366. const VariantMap& src = *(reinterpret_cast<const VariantMap*>(mValue.mPtr));
  367. std::string ret;
  368. for (VariantMap::const_iterator i = src.begin(); i != src.end(); ++i)
  369. {
  370. if (i != src.begin())
  371. ret += "#";
  372. ret += ::toString(i->first.mData) + "#";
  373. ret += i->second.getTypeName() + "#";
  374. ret += i->second.toString();
  375. }
  376. return ret;
  377. }
  378. }
  379. return std::string();
  380. }
  381. void Variant::setType(VariantType newType)
  382. {
  383. if (mType == newType)
  384. return;
  385. switch (mType)
  386. {
  387. case VAR_STRING:
  388. delete reinterpret_cast<std::string*>(mValue.mPtr);
  389. break;
  390. case VAR_BUFFER:
  391. delete reinterpret_cast<std::vector<unsigned char>*>(mValue.mPtr);
  392. break;
  393. case VAR_VARIANTVECTOR:
  394. delete reinterpret_cast<VariantVector*>(mValue.mPtr);
  395. break;
  396. case VAR_VARIANTMAP:
  397. delete reinterpret_cast<VariantMap*>(mValue.mPtr);
  398. break;
  399. }
  400. mType = newType;
  401. switch (mType)
  402. {
  403. case VAR_STRING:
  404. *reinterpret_cast<std::string**>(&mValue.mPtr) = new std::string();
  405. break;
  406. case VAR_BUFFER:
  407. *reinterpret_cast<std::vector<unsigned char>**>(&mValue.mPtr) = new std::vector<unsigned char>();
  408. break;
  409. case VAR_VARIANTVECTOR:
  410. *reinterpret_cast<VariantVector**>(&mValue.mPtr) = new VariantVector();
  411. break;
  412. case VAR_VARIANTMAP:
  413. *reinterpret_cast<VariantMap**>(&mValue.mPtr) = new VariantMap();
  414. break;
  415. }
  416. }