BsSerializedObjectRTTI.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsPrerequisitesUtil.h"
  5. #include "BsRTTIType.h"
  6. #include "BsSerializedObject.h"
  7. #include "BsDataStream.h"
  8. namespace bs
  9. {
  10. /** @cond RTTI */
  11. /** @addtogroup RTTI-Impl-Utility
  12. * @{
  13. */
  14. class BS_UTILITY_EXPORT SerializedInstanceRTTI : public RTTIType <SerializedInstance, IReflectable, SerializedInstanceRTTI>
  15. {
  16. public:
  17. SerializedInstanceRTTI()
  18. { }
  19. const String& getRTTIName() override
  20. {
  21. static String name = "SerializedInstance";
  22. return name;
  23. }
  24. UINT32 getRTTIId() override
  25. {
  26. return TID_SerializedInstance;
  27. }
  28. SPtr<IReflectable> newRTTIObject() override
  29. {
  30. return nullptr;
  31. }
  32. };
  33. class BS_UTILITY_EXPORT SerializedFieldRTTI : public RTTIType <SerializedField, SerializedInstance, SerializedFieldRTTI>
  34. {
  35. private:
  36. SPtr<DataStream> getData(SerializedField* obj, UINT32& size)
  37. {
  38. size = obj->size;
  39. return bs_shared_ptr_new<MemoryDataStream>(obj->value, obj->size, false);
  40. }
  41. void setData(SerializedField* obj, const SPtr<DataStream>& value, UINT32 size)
  42. {
  43. obj->value = (UINT8*)bs_alloc(size);
  44. obj->size = size;
  45. obj->ownsMemory = true;
  46. value->read(obj->value, size);
  47. }
  48. public:
  49. SerializedFieldRTTI()
  50. {
  51. addDataBlockField("data", 0, &SerializedFieldRTTI::getData, &SerializedFieldRTTI::setData, 0);
  52. }
  53. const String& getRTTIName() override
  54. {
  55. static String name = "SerializedField";
  56. return name;
  57. }
  58. UINT32 getRTTIId() override
  59. {
  60. return TID_SerializedField;
  61. }
  62. SPtr<IReflectable> newRTTIObject() override
  63. {
  64. return bs_shared_ptr_new<SerializedField>();
  65. }
  66. };
  67. class BS_UTILITY_EXPORT SerializedDataBlockRTTI : public RTTIType <SerializedDataBlock, SerializedInstance, SerializedDataBlockRTTI>
  68. {
  69. private:
  70. SPtr<DataStream> getData(SerializedDataBlock* obj, UINT32& size)
  71. {
  72. size = obj->size;
  73. obj->stream->seek(obj->offset);
  74. return obj->stream;
  75. }
  76. void setData(SerializedDataBlock* obj, const SPtr<DataStream>& value, UINT32 size)
  77. {
  78. UINT8* data = (UINT8*)bs_alloc(size);
  79. SPtr<MemoryDataStream> memStream = bs_shared_ptr_new<MemoryDataStream>(data, size);
  80. value->read(data, size);
  81. obj->stream = memStream;
  82. obj->size = size;
  83. obj->offset = 0;
  84. }
  85. public:
  86. SerializedDataBlockRTTI()
  87. {
  88. addDataBlockField("data", 0, &SerializedDataBlockRTTI::getData, &SerializedDataBlockRTTI::setData, 0);
  89. }
  90. const String& getRTTIName() override
  91. {
  92. static String name = "SerializedDataBlock";
  93. return name;
  94. }
  95. UINT32 getRTTIId() override
  96. {
  97. return TID_SerializedDataBlock;
  98. }
  99. SPtr<IReflectable> newRTTIObject() override
  100. {
  101. return bs_shared_ptr_new<SerializedDataBlock>();
  102. }
  103. };
  104. class BS_UTILITY_EXPORT SerializedObjectRTTI : public RTTIType <SerializedObject, SerializedInstance, SerializedObjectRTTI>
  105. {
  106. private:
  107. SerializedSubObject& getEntry(SerializedObject* obj, UINT32 arrayIdx)
  108. {
  109. return obj->subObjects[arrayIdx];
  110. }
  111. void setEntry(SerializedObject* obj, UINT32 arrayIdx, SerializedSubObject& val)
  112. {
  113. obj->subObjects[arrayIdx] = val;
  114. }
  115. UINT32 getNumEntries(SerializedObject* obj)
  116. {
  117. return (UINT32)obj->subObjects.size();
  118. }
  119. void setNumEntries(SerializedObject* obj, UINT32 numEntries)
  120. {
  121. obj->subObjects = Vector<SerializedSubObject>(numEntries);
  122. }
  123. public:
  124. SerializedObjectRTTI()
  125. {
  126. addReflectableArrayField("entries", 1, &SerializedObjectRTTI::getEntry, &SerializedObjectRTTI::getNumEntries,
  127. &SerializedObjectRTTI::setEntry, &SerializedObjectRTTI::setNumEntries);
  128. }
  129. const String& getRTTIName() override
  130. {
  131. static String name = "SerializedObject";
  132. return name;
  133. }
  134. UINT32 getRTTIId() override
  135. {
  136. return TID_SerializedObject;
  137. }
  138. SPtr<IReflectable> newRTTIObject() override
  139. {
  140. return bs_shared_ptr_new<SerializedObject>();
  141. }
  142. };
  143. class BS_UTILITY_EXPORT SerializedArrayRTTI : public RTTIType <SerializedArray, SerializedInstance, SerializedArrayRTTI>
  144. {
  145. private:
  146. UINT32& getNumElements(SerializedArray* obj)
  147. {
  148. return obj->numElements;
  149. }
  150. void setNumElements(SerializedArray* obj, UINT32& val)
  151. {
  152. obj->numElements = val;
  153. }
  154. SerializedArrayEntry& getEntry(SerializedArray* obj, UINT32 arrayIdx)
  155. {
  156. Vector<SerializedArrayEntry>& sequentialEntries = any_cast_ref<Vector<SerializedArrayEntry>>(obj->mRTTIData);
  157. return sequentialEntries[arrayIdx];
  158. }
  159. void setEntry(SerializedArray* obj, UINT32 arrayIdx, SerializedArrayEntry& val)
  160. {
  161. obj->entries[val.index] = val;
  162. }
  163. UINT32 getNumEntries(SerializedArray* obj)
  164. {
  165. Vector<SerializedArrayEntry>& sequentialEntries = any_cast_ref<Vector<SerializedArrayEntry>>(obj->mRTTIData);
  166. return (UINT32)sequentialEntries.size();
  167. }
  168. void setNumEntries(SerializedArray* obj, UINT32 numEntries)
  169. {
  170. obj->entries = UnorderedMap<UINT32, SerializedArrayEntry>();
  171. }
  172. public:
  173. SerializedArrayRTTI()
  174. {
  175. addPlainField("numElements", 0, &SerializedArrayRTTI::getNumElements, &SerializedArrayRTTI::setNumElements);
  176. addReflectableArrayField("entries", 1, &SerializedArrayRTTI::getEntry, &SerializedArrayRTTI::getNumEntries,
  177. &SerializedArrayRTTI::setEntry, &SerializedArrayRTTI::setNumEntries);
  178. }
  179. void onSerializationStarted(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  180. {
  181. SerializedArray* serializedArray = static_cast<SerializedArray*>(obj);
  182. Vector<SerializedArrayEntry> sequentialData;
  183. for (auto& entry : serializedArray->entries)
  184. sequentialData.push_back(entry.second);
  185. serializedArray->mRTTIData = sequentialData;
  186. }
  187. void onSerializationEnded(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  188. {
  189. SerializedArray* serializedArray = static_cast<SerializedArray*>(obj);
  190. serializedArray->mRTTIData = nullptr;
  191. }
  192. const String& getRTTIName() override
  193. {
  194. static String name = "SerializedArray";
  195. return name;
  196. }
  197. UINT32 getRTTIId() override
  198. {
  199. return TID_SerializedArray;
  200. }
  201. SPtr<IReflectable> newRTTIObject() override
  202. {
  203. return bs_shared_ptr_new<SerializedArray>();
  204. }
  205. };
  206. class BS_UTILITY_EXPORT SerializedSubObjectRTTI : public RTTIType <SerializedSubObject, IReflectable, SerializedSubObjectRTTI>
  207. {
  208. private:
  209. UINT32& getTypeId(SerializedSubObject* obj)
  210. {
  211. return obj->typeId;
  212. }
  213. void setTypeId(SerializedSubObject* obj, UINT32& val)
  214. {
  215. obj->typeId = val;
  216. }
  217. SerializedEntry& getEntry(SerializedSubObject* obj, UINT32 arrayIdx)
  218. {
  219. Vector<SerializedEntry>& sequentialEntries = any_cast_ref<Vector<SerializedEntry>>(obj->mRTTIData);
  220. return sequentialEntries[arrayIdx];
  221. }
  222. void setEntry(SerializedSubObject* obj, UINT32 arrayIdx, SerializedEntry& val)
  223. {
  224. obj->entries[val.fieldId] = val;
  225. }
  226. UINT32 getNumEntries(SerializedSubObject* obj)
  227. {
  228. Vector<SerializedEntry>& sequentialEntries = any_cast_ref<Vector<SerializedEntry>>(obj->mRTTIData);
  229. return (UINT32)sequentialEntries.size();
  230. }
  231. void setNumEntries(SerializedSubObject* obj, UINT32 numEntries)
  232. {
  233. obj->entries = UnorderedMap<UINT32, SerializedEntry>();
  234. }
  235. public:
  236. SerializedSubObjectRTTI()
  237. {
  238. addPlainField("typeId", 0, &SerializedSubObjectRTTI::getTypeId, &SerializedSubObjectRTTI::setTypeId);
  239. addReflectableArrayField("entries", 1, &SerializedSubObjectRTTI::getEntry, &SerializedSubObjectRTTI::getNumEntries,
  240. &SerializedSubObjectRTTI::setEntry, &SerializedSubObjectRTTI::setNumEntries);
  241. }
  242. void onSerializationStarted(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  243. {
  244. SerializedSubObject* serializableObject = static_cast<SerializedSubObject*>(obj);
  245. Vector<SerializedEntry> sequentialData;
  246. for (auto& entry : serializableObject->entries)
  247. sequentialData.push_back(entry.second);
  248. serializableObject->mRTTIData = sequentialData;
  249. }
  250. void onSerializationEnded(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  251. {
  252. SerializedSubObject* serializableObject = static_cast<SerializedSubObject*>(obj);
  253. serializableObject->mRTTIData = nullptr;
  254. }
  255. const String& getRTTIName() override
  256. {
  257. static String name = "SerializedSubObject";
  258. return name;
  259. }
  260. UINT32 getRTTIId() override
  261. {
  262. return TID_SerializedSubObject;
  263. }
  264. SPtr<IReflectable> newRTTIObject() override
  265. {
  266. return bs_shared_ptr_new<SerializedSubObject>();
  267. }
  268. };
  269. class BS_UTILITY_EXPORT SerializedEntryRTTI : public RTTIType <SerializedEntry, IReflectable, SerializedEntryRTTI>
  270. {
  271. private:
  272. UINT32& getFieldId(SerializedEntry* obj)
  273. {
  274. return obj->fieldId;
  275. }
  276. void setFieldId(SerializedEntry* obj, UINT32& val)
  277. {
  278. obj->fieldId = val;
  279. }
  280. SPtr<SerializedInstance> getSerialized(SerializedEntry* obj)
  281. {
  282. return obj->serialized;
  283. }
  284. void setSerialized(SerializedEntry* obj, SPtr<SerializedInstance> val)
  285. {
  286. obj->serialized = val;
  287. }
  288. public:
  289. SerializedEntryRTTI()
  290. {
  291. addPlainField("fieldId", 0, &SerializedEntryRTTI::getFieldId, &SerializedEntryRTTI::setFieldId);
  292. addReflectablePtrField("serialized", 1, &SerializedEntryRTTI::getSerialized, &SerializedEntryRTTI::setSerialized);
  293. }
  294. const String& getRTTIName() override
  295. {
  296. static String name = "SerializedEntry";
  297. return name;
  298. }
  299. UINT32 getRTTIId() override
  300. {
  301. return TID_SerializedEntry;
  302. }
  303. SPtr<IReflectable> newRTTIObject() override
  304. {
  305. return bs_shared_ptr_new<SerializedEntry>();
  306. }
  307. };
  308. class BS_UTILITY_EXPORT SerializedArrayEntryRTTI : public RTTIType <SerializedArrayEntry, IReflectable, SerializedArrayEntryRTTI>
  309. {
  310. private:
  311. UINT32& getArrayIdx(SerializedArrayEntry* obj)
  312. {
  313. return obj->index;
  314. }
  315. void setArrayIdx(SerializedArrayEntry* obj, UINT32& val)
  316. {
  317. obj->index = val;
  318. }
  319. SPtr<SerializedInstance> getSerialized(SerializedArrayEntry* obj)
  320. {
  321. return obj->serialized;
  322. }
  323. void setSerialized(SerializedArrayEntry* obj, SPtr<SerializedInstance> val)
  324. {
  325. obj->serialized = val;
  326. }
  327. public:
  328. SerializedArrayEntryRTTI()
  329. {
  330. addPlainField("index", 0, &SerializedArrayEntryRTTI::getArrayIdx, &SerializedArrayEntryRTTI::setArrayIdx);
  331. addReflectablePtrField("serialized", 1, &SerializedArrayEntryRTTI::getSerialized, &SerializedArrayEntryRTTI::setSerialized);
  332. }
  333. const String& getRTTIName() override
  334. {
  335. static String name = "SerializedArrayEntry";
  336. return name;
  337. }
  338. UINT32 getRTTIId() override
  339. {
  340. return TID_SerializedArrayEntry;
  341. }
  342. SPtr<IReflectable> newRTTIObject() override
  343. {
  344. return bs_shared_ptr_new<SerializedArrayEntry>();
  345. }
  346. };
  347. /** @} */
  348. /** @endcond */
  349. }