#pragma once #include "BsScriptEnginePrerequisites.h" #include "BsIReflectable.h" #include namespace BansheeEngine { class BS_SCR_BE_EXPORT ManagedSerializableArray : public IReflectable { private: struct ConstructPrivately {}; public: ManagedSerializableArray(const ConstructPrivately& dummy, const ManagedSerializableTypeInfoArrayPtr& typeInfo, MonoObject* managedInstance); ManagedSerializableArray(const ConstructPrivately& dummy); MonoObject* getManagedInstance() const { return mManagedInstance; } static ManagedSerializableArrayPtr createFromExisting(MonoObject* managedInstance, const ManagedSerializableTypeInfoArrayPtr& typeInfo); static ManagedSerializableArrayPtr createFromNew(const ManagedSerializableTypeInfoArrayPtr& typeInfo, const Vector& sizes); static MonoObject* createManagedInstance(const ManagedSerializableTypeInfoArrayPtr& typeInfo, const Vector& sizes); protected: MonoObject* mManagedInstance; ::MonoClass* mElementMonoClass; ManagedSerializableTypeInfoArrayPtr mArrayTypeInfo; Vector mNumElements; UINT32 mElemSize; void initMonoObjects(); /** * @brief Creates a new managed instance and populates it with provided entries. */ void deserializeManagedInstance(const Vector& entries); void setFieldData(UINT32 arrayIdx, const ManagedSerializableFieldDataPtr& val); ManagedSerializableFieldDataPtr getFieldData(UINT32 arrayIdx); void setValue(UINT32 arrayIdx, void* val); UINT32 toSequentialIdx(const Vector& idx) const; UINT32 getLength(UINT32 dimension) const; /************************************************************************/ /* RTTI */ /************************************************************************/ static ManagedSerializableArrayPtr createFromNew(); public: friend class ManagedSerializableArrayRTTI; static RTTITypeBase* getRTTIStatic(); virtual RTTITypeBase* getRTTI() const; }; }