Variant.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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 "Serializer.h"
  27. #include "StringUtils.h"
  28. #include <cstring>
  29. #include "DebugNew.h"
  30. void Variant::fromString(const std::string& type, const std::string& value)
  31. {
  32. std::string typeLower = toLower(type);
  33. if (typeLower == "none")
  34. mType = VAR_NONE;
  35. else if (typeLower == "int")
  36. *this = toInt(value);
  37. else if (typeLower == "bool")
  38. *this = toBool(value);
  39. else if (typeLower == "float")
  40. *this = toFloat(value);
  41. else if (typeLower == "vector2")
  42. *this = toVector2(value);
  43. else if (typeLower == "vector3")
  44. *this = toVector3(value);
  45. else if (typeLower == "vector4")
  46. *this = toVector4(value);
  47. else if (typeLower == "quaternion")
  48. *this = toQuaternion(value);
  49. else if (typeLower == "color")
  50. *this = toColor(value);
  51. else if (typeLower == "string")
  52. *this = value;
  53. else if (typeLower == "buffer")
  54. {
  55. std::vector<std::string> values = split(value, ' ');
  56. std::vector<unsigned char> buffer;
  57. for (std::vector<std::string>::const_iterator i = values.begin(); i != values.end(); ++i)
  58. buffer.push_back(toInt(*i));
  59. *this = buffer;
  60. }
  61. else if (typeLower == "pointer")
  62. *this = (void*)toInt(value);
  63. else
  64. clear();
  65. }
  66. void Variant::write(Serializer& dest) const
  67. {
  68. dest.writeUByte(mType);
  69. switch (mType)
  70. {
  71. case VAR_NONE:
  72. break;
  73. case VAR_INT:
  74. dest.writeInt(mValue.mInt);
  75. break;
  76. case VAR_BOOL:
  77. dest.writeBool(mValue.mBool);
  78. break;
  79. case VAR_FLOAT:
  80. dest.writeFloat(mValue.mFloat);
  81. break;
  82. case VAR_VECTOR2:
  83. dest.writeVector2(*(reinterpret_cast<const Vector2*>(&mValue.mVector4)));
  84. break;
  85. case VAR_VECTOR3:
  86. dest.writeVector3(*(reinterpret_cast<const Vector3*>(&mValue.mVector4)));
  87. break;
  88. case VAR_VECTOR4:
  89. dest.writeVector4(mValue.mVector4);
  90. break;
  91. case VAR_QUATERNION:
  92. dest.writeQuaternion(*(reinterpret_cast<const Quaternion*>(&mValue.mVector4)));
  93. break;
  94. case VAR_COLOR:
  95. dest.writeColor(*(reinterpret_cast<const Color*>(&mValue.mVector4)));
  96. break;
  97. case VAR_STRING:
  98. dest.writeString(mValue.mString);
  99. break;
  100. case VAR_BUFFER:
  101. dest.writeVLE(mValue.mBuffer.size());
  102. if (mValue.mBuffer.size())
  103. dest.write(&mValue.mBuffer[0], mValue.mBuffer.size());
  104. break;
  105. case VAR_PTR:
  106. dest.writeUInt((unsigned)mValue.mPtr);
  107. break;
  108. }
  109. }
  110. void Variant::read(Deserializer& source)
  111. {
  112. mType = (VariantType)source.readUByte();
  113. switch (mType)
  114. {
  115. case VAR_NONE:
  116. break;
  117. case VAR_INT:
  118. mValue.mInt = source.readInt();
  119. break;
  120. case VAR_BOOL:
  121. mValue.mBool = source.readBool();
  122. break;
  123. case VAR_FLOAT:
  124. mValue.mFloat = source.readFloat();
  125. break;
  126. case VAR_VECTOR2:
  127. *(reinterpret_cast<Vector2*>(&mValue.mVector4)) = source.readVector2();
  128. break;
  129. case VAR_VECTOR3:
  130. *(reinterpret_cast<Vector3*>(&mValue.mVector4)) = source.readVector3();
  131. break;
  132. case VAR_VECTOR4:
  133. mValue.mVector4 = source.readVector4();
  134. break;
  135. case VAR_QUATERNION:
  136. *(reinterpret_cast<Quaternion*>(&mValue.mVector4)) = source.readQuaternion();
  137. break;
  138. case VAR_COLOR:
  139. *(reinterpret_cast<Color*>(&mValue.mVector4)) = source.readColor();
  140. break;
  141. case VAR_STRING:
  142. mValue.mString = source.readString();
  143. break;
  144. case VAR_BUFFER:
  145. mValue.mBuffer.resize(source.readVLE());
  146. if (mValue.mBuffer.size())
  147. source.read(&mValue.mBuffer[0], mValue.mBuffer.size());
  148. break;
  149. case VAR_PTR:
  150. mValue.mPtr = (void*)source.readUInt();
  151. break;
  152. default:
  153. SAFE_EXCEPTION("Unrecognized Variant type " + ::toString((int)mType));
  154. }
  155. }
  156. void Variant::setBuffer(const void* data, unsigned size)
  157. {
  158. if ((size) && (!data))
  159. SAFE_EXCEPTION("Null Variant buffer source");
  160. mType = VAR_BUFFER;
  161. mValue.mBuffer.resize(size);
  162. if (size)
  163. memcpy(&mValue.mBuffer[0], data, size);
  164. }
  165. const std::string& Variant::getTypeName() const
  166. {
  167. static const std::string typeNames[] =
  168. {
  169. "None",
  170. "Int",
  171. "Bool",
  172. "Float",
  173. "Vector2",
  174. "Vector3",
  175. "Vector4",
  176. "Quaternion",
  177. "Color",
  178. "String",
  179. "Buffer",
  180. "Pointer"
  181. };
  182. return typeNames[mType];
  183. }
  184. std::string Variant::toString() const
  185. {
  186. switch (mType)
  187. {
  188. case VAR_INT:
  189. return ::toString(mValue.mInt);
  190. case VAR_BOOL:
  191. return ::toString(mValue.mBool);
  192. case VAR_FLOAT:
  193. return ::toString(mValue.mFloat);
  194. case VAR_VECTOR2:
  195. return ::toString(*(reinterpret_cast<const Vector2*>(&mValue.mVector4)));
  196. case VAR_VECTOR3:
  197. return ::toString(*(reinterpret_cast<const Vector3*>(&mValue.mVector4)));
  198. case VAR_VECTOR4:
  199. return ::toString(mValue.mVector4);
  200. case VAR_QUATERNION:
  201. return ::toString(*(reinterpret_cast<const Quaternion*>(&mValue.mVector4)));
  202. case VAR_COLOR:
  203. return ::toString(*(reinterpret_cast<const Color*>(&mValue.mVector4)));
  204. case VAR_STRING:
  205. return mValue.mString;
  206. case VAR_BUFFER:
  207. {
  208. std::string ret;
  209. for (std::vector<unsigned char>::const_iterator i = mValue.mBuffer.begin(); i != mValue.mBuffer.end(); ++i)
  210. ret += ::toString(*i) + " ";
  211. return ret;
  212. }
  213. case VAR_PTR:
  214. return ::toString((unsigned)mValue.mPtr);
  215. }
  216. return std::string();
  217. }