BsManagedSerializableDiff.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsIReflectable.h"
  4. namespace BansheeEngine
  5. {
  6. class BS_SCR_BE_EXPORT ManagedSerializableDiff : public IReflectable
  7. {
  8. public:
  9. struct BS_SCR_BE_EXPORT Modification : public IReflectable
  10. {
  11. virtual ~Modification();
  12. /************************************************************************/
  13. /* RTTI */
  14. /************************************************************************/
  15. public:
  16. friend class ModificationRTTI;
  17. static RTTITypeBase* getRTTIStatic();
  18. virtual RTTITypeBase* getRTTI() const;
  19. };
  20. struct BS_SCR_BE_EXPORT ModifiedField : public IReflectable
  21. {
  22. ModifiedField() { }
  23. ModifiedField(const ManagedSerializableTypeInfoPtr& parentType,
  24. const ManagedSerializableFieldInfoPtr& fieldType, const SPtr<Modification>& modification);
  25. ManagedSerializableTypeInfoPtr parentType;
  26. ManagedSerializableFieldInfoPtr fieldType;
  27. SPtr<Modification> modification;
  28. /************************************************************************/
  29. /* RTTI */
  30. /************************************************************************/
  31. public:
  32. friend class ModifiedFieldRTTI;
  33. static RTTITypeBase* getRTTIStatic();
  34. virtual RTTITypeBase* getRTTI() const;
  35. };
  36. struct BS_SCR_BE_EXPORT ModifiedArrayEntry : public IReflectable
  37. {
  38. ModifiedArrayEntry() { }
  39. ModifiedArrayEntry(UINT32 idx, const SPtr<Modification>& modification);
  40. UINT32 idx;
  41. SPtr<Modification> modification;
  42. /************************************************************************/
  43. /* RTTI */
  44. /************************************************************************/
  45. public:
  46. friend class ModifiedArrayEntryRTTI;
  47. static RTTITypeBase* getRTTIStatic();
  48. virtual RTTITypeBase* getRTTI() const;
  49. };
  50. struct BS_SCR_BE_EXPORT ModifiedDictionaryEntry : public IReflectable
  51. {
  52. ModifiedDictionaryEntry() { }
  53. ModifiedDictionaryEntry(const ManagedSerializableFieldDataPtr& key, const SPtr<Modification>& modification);
  54. ManagedSerializableFieldDataPtr key;
  55. SPtr<Modification> modification;
  56. /************************************************************************/
  57. /* RTTI */
  58. /************************************************************************/
  59. public:
  60. friend class ModifiedArrayEntryRTTI;
  61. static RTTITypeBase* getRTTIStatic();
  62. virtual RTTITypeBase* getRTTI() const;
  63. };
  64. struct BS_SCR_BE_EXPORT ModifiedObject : Modification
  65. {
  66. static SPtr<ModifiedObject> create();
  67. Vector<ModifiedField> entries;
  68. /************************************************************************/
  69. /* RTTI */
  70. /************************************************************************/
  71. public:
  72. friend class ModifiedObjectRTTI;
  73. static RTTITypeBase* getRTTIStatic();
  74. virtual RTTITypeBase* getRTTI() const;
  75. };
  76. struct BS_SCR_BE_EXPORT ModifiedArray : Modification
  77. {
  78. static SPtr<ModifiedArray> create();
  79. Vector<ModifiedArrayEntry> entries;
  80. Vector<UINT32> origSizes;
  81. Vector<UINT32> newSizes;
  82. /************************************************************************/
  83. /* RTTI */
  84. /************************************************************************/
  85. public:
  86. friend class ModifiedArrayRTTI;
  87. static RTTITypeBase* getRTTIStatic();
  88. virtual RTTITypeBase* getRTTI() const;
  89. };
  90. struct BS_SCR_BE_EXPORT ModifiedDictionary : Modification
  91. {
  92. static SPtr<ModifiedDictionary> create();
  93. Vector<ModifiedDictionaryEntry> entries;
  94. Vector<ManagedSerializableFieldDataPtr> removed;
  95. /************************************************************************/
  96. /* RTTI */
  97. /************************************************************************/
  98. public:
  99. friend class ModifiedDictionaryRTTI;
  100. static RTTITypeBase* getRTTIStatic();
  101. virtual RTTITypeBase* getRTTI() const;
  102. };
  103. struct BS_SCR_BE_EXPORT ModifiedEntry : Modification
  104. {
  105. ModifiedEntry() { }
  106. ModifiedEntry(const ManagedSerializableFieldDataPtr& value);
  107. static SPtr<ModifiedEntry> create(const ManagedSerializableFieldDataPtr& value);
  108. ManagedSerializableFieldDataPtr value;
  109. /************************************************************************/
  110. /* RTTI */
  111. /************************************************************************/
  112. public:
  113. friend class ModifiedEntryRTTI;
  114. static RTTITypeBase* getRTTIStatic();
  115. virtual RTTITypeBase* getRTTI() const;
  116. };
  117. public:
  118. ManagedSerializableDiff();
  119. ~ManagedSerializableDiff();
  120. static ManagedSerializableDiffPtr create(const ManagedSerializableObjectPtr& oldObj, const ManagedSerializableObjectPtr& newObj);
  121. void apply(const ManagedSerializableObjectPtr& obj);
  122. private:
  123. SPtr<ModifiedObject> generateDiff(const ManagedSerializableObjectPtr& oldObj, const ManagedSerializableObjectPtr& newObj);
  124. SPtr<Modification> generateDiff(const ManagedSerializableFieldDataPtr& oldData, const ManagedSerializableFieldDataPtr& newData,
  125. UINT32 fieldTypeId);
  126. ManagedSerializableFieldDataPtr applyDiff(const SPtr<ModifiedObject>& mod, const ManagedSerializableObjectPtr& obj);
  127. ManagedSerializableFieldDataPtr applyDiff(const SPtr<ModifiedArray>& mod, const ManagedSerializableArrayPtr& obj);
  128. ManagedSerializableFieldDataPtr applyDiff(const SPtr<ModifiedArray>& mod, const ManagedSerializableListPtr& obj);
  129. ManagedSerializableFieldDataPtr applyDiff(const SPtr<ModifiedDictionary>& mod, const ManagedSerializableDictionaryPtr& obj);
  130. ManagedSerializableFieldDataPtr applyDiff(const SPtr<Modification>& mod, const ManagedSerializableTypeInfoPtr& fieldType,
  131. const ManagedSerializableFieldDataPtr& origData);
  132. SPtr<ModifiedObject> mModificationRoot;
  133. /************************************************************************/
  134. /* RTTI */
  135. /************************************************************************/
  136. public:
  137. friend class ManagedSerializableDiffRTTI;
  138. static RTTITypeBase* getRTTIStatic();
  139. virtual RTTITypeBase* getRTTI() const;
  140. };
  141. }