BsManagedSerializableObjectRTTI.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsScriptEnginePrerequisites.h"
  5. #include "Reflection/BsRTTIType.h"
  6. #include "Serialization/BsScriptAssemblyManager.h"
  7. #include "Serialization/BsManagedSerializableObject.h"
  8. #include "Serialization/BsManagedSerializableField.h"
  9. #include "Serialization/BsManagedDiff.h"
  10. namespace bs
  11. {
  12. /** @cond RTTI */
  13. /** @addtogroup RTTI-Impl-SEngine
  14. * @{
  15. */
  16. class BS_SCR_BE_EXPORT ManagedSerializableObjectRTTI : public RTTIType<ManagedSerializableObject, IReflectable, ManagedSerializableObjectRTTI>
  17. {
  18. private:
  19. SPtr<ManagedSerializableObjectInfo> getInfo(ManagedSerializableObject* obj)
  20. {
  21. return obj->mObjInfo;
  22. }
  23. void setInfo(ManagedSerializableObject* obj, SPtr<ManagedSerializableObjectInfo> val)
  24. {
  25. obj->mObjInfo = val;
  26. }
  27. SPtr<ManagedSerializableFieldDataEntry> getFieldEntry(ManagedSerializableObject* obj, UINT32 arrayIdx)
  28. {
  29. Vector<SPtr<ManagedSerializableMemberInfo>>& sequentialFields =
  30. any_cast_ref<Vector<SPtr<ManagedSerializableMemberInfo>>>(obj->mRTTIData);
  31. SPtr<ManagedSerializableMemberInfo> field = sequentialFields[arrayIdx];
  32. SPtr<ManagedSerializableFieldKey> fieldKey = ManagedSerializableFieldKey::create(field->mParentTypeId, field->mFieldId);
  33. SPtr<ManagedSerializableFieldData> fieldData = obj->getFieldData(field);
  34. return ManagedSerializableFieldDataEntry::create(fieldKey, fieldData);
  35. }
  36. void setFieldsEntry(ManagedSerializableObject* obj, UINT32 arrayIdx, SPtr<ManagedSerializableFieldDataEntry> val)
  37. {
  38. obj->mCachedData[*val->mKey] = val->mValue;
  39. }
  40. UINT32 getNumFieldEntries(ManagedSerializableObject* obj)
  41. {
  42. Vector<SPtr<ManagedSerializableMemberInfo>>& sequentialFields =
  43. any_cast_ref<Vector<SPtr<ManagedSerializableMemberInfo>>>(obj->mRTTIData);
  44. return (UINT32)sequentialFields.size();
  45. }
  46. void setNumFieldEntries(ManagedSerializableObject* obj, UINT32 numEntries)
  47. {
  48. // Do nothing
  49. }
  50. public:
  51. ManagedSerializableObjectRTTI()
  52. {
  53. addReflectablePtrField("mObjInfo", 0, &ManagedSerializableObjectRTTI::getInfo, &ManagedSerializableObjectRTTI::setInfo);
  54. addReflectablePtrArrayField("mFieldEntries", 1, &ManagedSerializableObjectRTTI::getFieldEntry, &ManagedSerializableObjectRTTI::getNumFieldEntries,
  55. &ManagedSerializableObjectRTTI::setFieldsEntry, &ManagedSerializableObjectRTTI::setNumFieldEntries);
  56. }
  57. void onSerializationStarted(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  58. {
  59. ManagedSerializableObject* castObj = static_cast<ManagedSerializableObject*>(obj);
  60. Vector<SPtr<ManagedSerializableMemberInfo>> sequentialFields;
  61. SPtr<ManagedSerializableObjectInfo> curType = castObj->mObjInfo;
  62. while (curType != nullptr)
  63. {
  64. for (auto& field : curType->mFields)
  65. {
  66. if (field.second->isSerializable())
  67. sequentialFields.push_back(field.second);
  68. }
  69. curType = curType->mBaseClass;
  70. }
  71. castObj->mRTTIData = sequentialFields;
  72. }
  73. void onSerializationEnded(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  74. {
  75. ManagedSerializableObject* castObj = static_cast<ManagedSerializableObject*>(obj);
  76. castObj->mRTTIData = nullptr;
  77. }
  78. IDiff& getDiffHandler() const override
  79. {
  80. static ManagedDiff managedDiffHandler;
  81. return managedDiffHandler;
  82. }
  83. const String& getRTTIName() override
  84. {
  85. static String name = "ScriptSerializableObject";
  86. return name;
  87. }
  88. UINT32 getRTTIId() override
  89. {
  90. return TID_ScriptSerializableObject;
  91. }
  92. SPtr<IReflectable> newRTTIObject() override
  93. {
  94. return ManagedSerializableObject::createEmpty();
  95. }
  96. };
  97. /** @} */
  98. /** @endcond */
  99. }