BsSerializedObject.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #pragma once
  2. #include "BsPrerequisitesUtil.h"
  3. #include "BsIReflectable.h"
  4. namespace BansheeEngine
  5. {
  6. /**
  7. * @brief Base class for intermediate representations of
  8. * objects that are being decoded with BinarySerializer.
  9. */
  10. struct BS_UTILITY_EXPORT SerializedInstance : IReflectable
  11. {
  12. virtual ~SerializedInstance() { }
  13. virtual SPtr<SerializedInstance> clone(bool cloneData = true) = 0;
  14. /************************************************************************/
  15. /* RTTI */
  16. /************************************************************************/
  17. public:
  18. friend class SerializedInstanceRTTI;
  19. static RTTITypeBase* getRTTIStatic();
  20. virtual RTTITypeBase* getRTTI() const override;
  21. };
  22. /**
  23. * @brief A single serialized entry representing a
  24. * and its value in an object.
  25. */
  26. struct BS_UTILITY_EXPORT SerializedEntry : IReflectable
  27. {
  28. SerializedEntry()
  29. :fieldId(0), serialized(nullptr)
  30. { }
  31. UINT32 fieldId;
  32. SPtr<SerializedInstance> serialized;
  33. /************************************************************************/
  34. /* RTTI */
  35. /************************************************************************/
  36. public:
  37. friend class SerializedEntryRTTI;
  38. static RTTITypeBase* getRTTIStatic();
  39. virtual RTTITypeBase* getRTTI() const override;
  40. };
  41. /**
  42. * @brief A serialized value representing a single entry in an array.
  43. */
  44. struct BS_UTILITY_EXPORT SerializedArrayEntry : IReflectable
  45. {
  46. SerializedArrayEntry()
  47. :index(0), serialized(nullptr)
  48. { }
  49. UINT32 index;
  50. SPtr<SerializedInstance> serialized;
  51. /************************************************************************/
  52. /* RTTI */
  53. /************************************************************************/
  54. public:
  55. friend class SerializedArrayEntryRTTI;
  56. static RTTITypeBase* getRTTIStatic();
  57. virtual RTTITypeBase* getRTTI() const override;
  58. };
  59. /**
  60. * @brief A serialized portion of an object consisting of multiple entries,
  61. * one for each field.
  62. */
  63. struct BS_UTILITY_EXPORT SerializedSubObject : IReflectable
  64. {
  65. SerializedSubObject()
  66. :typeId(0)
  67. { }
  68. UINT32 typeId;
  69. UnorderedMap<UINT32, SerializedEntry> entries;
  70. /************************************************************************/
  71. /* RTTI */
  72. /************************************************************************/
  73. public:
  74. friend class SerializedSubObjectRTTI;
  75. static RTTITypeBase* getRTTIStatic();
  76. virtual RTTITypeBase* getRTTI() const override;
  77. };
  78. /**
  79. * @brief A serialized object consisting of multiple sub-objects,
  80. * one for each inherited class.
  81. */
  82. struct BS_UTILITY_EXPORT SerializedObject : SerializedInstance
  83. {
  84. UINT32 getRootTypeId() const { return subObjects[0].typeId; }
  85. SPtr<SerializedInstance> clone(bool cloneData = true) override;
  86. Vector<SerializedSubObject> subObjects;
  87. /************************************************************************/
  88. /* RTTI */
  89. /************************************************************************/
  90. public:
  91. friend class SerializedObjectRTTI;
  92. static RTTITypeBase* getRTTIStatic();
  93. virtual RTTITypeBase* getRTTI() const override;
  94. };
  95. /**
  96. * @brief Contains a pointer to the serialized value of a specific
  97. * field or array entry.
  98. */
  99. struct BS_UTILITY_EXPORT SerializedField : SerializedInstance
  100. {
  101. SerializedField()
  102. :value(nullptr), size(0), ownsMemory(false)
  103. {
  104. }
  105. ~SerializedField()
  106. {
  107. if (ownsMemory && value != nullptr)
  108. bs_free(value);
  109. }
  110. SPtr<SerializedInstance> clone(bool cloneData = true) override;
  111. UINT8* value;
  112. UINT32 size;
  113. bool ownsMemory;
  114. /************************************************************************/
  115. /* RTTI */
  116. /************************************************************************/
  117. public:
  118. friend class SerializedFieldRTTI;
  119. static RTTITypeBase* getRTTIStatic();
  120. virtual RTTITypeBase* getRTTI() const override;
  121. };
  122. /**
  123. * @brief A serialized array containing a list of all its entries.
  124. */
  125. struct BS_UTILITY_EXPORT SerializedArray : SerializedInstance
  126. {
  127. SerializedArray()
  128. :numElements(0)
  129. { }
  130. SPtr<SerializedInstance> clone(bool cloneData = true) override;
  131. UnorderedMap<UINT32, SerializedArrayEntry> entries;
  132. UINT32 numElements;
  133. /************************************************************************/
  134. /* RTTI */
  135. /************************************************************************/
  136. public:
  137. friend class SerializedArrayRTTI;
  138. static RTTITypeBase* getRTTIStatic();
  139. virtual RTTITypeBase* getRTTI() const override;
  140. };
  141. }