BsManagedSerializableArray.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsIReflectable.h"
  4. #include <mono/jit/jit.h>
  5. namespace BansheeEngine
  6. {
  7. /**
  8. * @brief TODO
  9. *
  10. * @note This class can be in two states:
  11. * - Linked - When the object has a link to a managed object. This is the default
  12. * state when a new instance of ManagedSerializableObject is created.
  13. * Any operations during this state will operate directly on the linked
  14. * managed object.
  15. * - Serialized - When the object has no link to the managed object but instead just
  16. * contains cached object and field data that may be used for initializing
  17. * a managed object. Any operations during this state will operate
  18. * only on the cached internal data.
  19. * You can transfer between these states by calling serialize(linked->serialized) &
  20. *
  21. */
  22. class BS_SCR_BE_EXPORT ManagedSerializableArray : public IReflectable
  23. {
  24. private:
  25. struct ConstructPrivately {};
  26. public:
  27. ManagedSerializableArray(const ConstructPrivately& dummy, const ManagedSerializableTypeInfoArrayPtr& typeInfo, MonoObject* managedInstance);
  28. ManagedSerializableArray(const ConstructPrivately& dummy);
  29. MonoObject* getManagedInstance() const { return mManagedInstance; }
  30. ManagedSerializableTypeInfoArrayPtr getTypeInfo() const { return mArrayTypeInfo; }
  31. void resize(const Vector<UINT32>& newSizes);
  32. UINT32 getLength(UINT32 dimension) const { return mNumElements[dimension]; }
  33. Vector<UINT32> getLengths() const { return mNumElements; }
  34. UINT32 getTotalLength() const;
  35. void setFieldData(UINT32 arrayIdx, const ManagedSerializableFieldDataPtr& val);
  36. ManagedSerializableFieldDataPtr getFieldData(UINT32 arrayIdx);
  37. void serialize();
  38. void deserialize();
  39. static ManagedSerializableArrayPtr createFromExisting(MonoObject* managedInstance, const ManagedSerializableTypeInfoArrayPtr& typeInfo);
  40. static ManagedSerializableArrayPtr createNew(const ManagedSerializableTypeInfoArrayPtr& typeInfo, const Vector<UINT32>& sizes);
  41. static MonoObject* createManagedInstance(const ManagedSerializableTypeInfoArrayPtr& typeInfo, const Vector<UINT32>& sizes);
  42. protected:
  43. MonoObject* mManagedInstance;
  44. ::MonoClass* mElementMonoClass;
  45. MonoMethod* mCopyMethod;
  46. ManagedSerializableTypeInfoArrayPtr mArrayTypeInfo;
  47. Vector<ManagedSerializableFieldDataPtr> mCachedEntries;
  48. Vector<UINT32> mNumElements;
  49. UINT32 mElemSize;
  50. void initMonoObjects();
  51. UINT32 getLengthInternal(UINT32 dimension) const;
  52. void setValueInternal(UINT32 arrayIdx, void* val);
  53. UINT32 toSequentialIdx(const Vector<UINT32>& idx) const;
  54. /************************************************************************/
  55. /* RTTI */
  56. /************************************************************************/
  57. static ManagedSerializableArrayPtr createNew();
  58. public:
  59. friend class ManagedSerializableArrayRTTI;
  60. static RTTITypeBase* getRTTIStatic();
  61. virtual RTTITypeBase* getRTTI() const;
  62. };
  63. }