BsManagedSerializableDictionary.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. struct BS_SCR_BE_EXPORT ManagedSerializableDictionaryKeyValue : public IReflectable
  23. {
  24. ManagedSerializableDictionaryKeyValue() {}
  25. ManagedSerializableDictionaryKeyValue(const ManagedSerializableFieldDataPtr& key,
  26. const ManagedSerializableFieldDataPtr& value);
  27. ManagedSerializableFieldDataPtr key;
  28. ManagedSerializableFieldDataPtr value;
  29. /************************************************************************/
  30. /* RTTI */
  31. /************************************************************************/
  32. public:
  33. friend class ManagedSerializableDictionaryKeyValueRTTI;
  34. static RTTITypeBase* getRTTIStatic();
  35. virtual RTTITypeBase* getRTTI() const;
  36. };
  37. class BS_SCR_BE_EXPORT ManagedSerializableDictionary : public IReflectable
  38. {
  39. private:
  40. struct ConstructPrivately {};
  41. struct BS_SCR_BE_EXPORT Hash
  42. {
  43. inline size_t operator()(const ManagedSerializableFieldDataPtr& x) const;
  44. };
  45. struct BS_SCR_BE_EXPORT Equals
  46. {
  47. inline bool operator()(const ManagedSerializableFieldDataPtr& a, const ManagedSerializableFieldDataPtr& b) const;
  48. };
  49. public:
  50. typedef UnorderedMap<ManagedSerializableFieldDataPtr, ManagedSerializableFieldDataPtr> CachedEntriesMap;
  51. class Enumerator
  52. {
  53. public:
  54. Enumerator(MonoObject* instance, const ManagedSerializableDictionary* parent);
  55. ManagedSerializableFieldDataPtr getKey() const;
  56. ManagedSerializableFieldDataPtr getValue() const;
  57. bool moveNext();
  58. private:
  59. MonoObject* mInstance;
  60. MonoObject* mCurrent;
  61. CachedEntriesMap::const_iterator mCachedIter;
  62. bool mIteratorInitialized;
  63. const ManagedSerializableDictionary* mParent;
  64. };
  65. public:
  66. ManagedSerializableDictionary(const ConstructPrivately& dummy, const ManagedSerializableTypeInfoDictionaryPtr& typeInfo, MonoObject* managedInstance);
  67. ManagedSerializableDictionary(const ConstructPrivately& dummy);
  68. MonoObject* getManagedInstance() const { return mManagedInstance; }
  69. ManagedSerializableTypeInfoDictionaryPtr getTypeInfo() const { return mDictionaryTypeInfo; }
  70. ManagedSerializableFieldDataPtr getFieldData(const ManagedSerializableFieldDataPtr& key);
  71. void setFieldData(const ManagedSerializableFieldDataPtr& key, const ManagedSerializableFieldDataPtr& val);
  72. void removeFieldData(const ManagedSerializableFieldDataPtr& key);
  73. bool contains(const ManagedSerializableFieldDataPtr& key) const;
  74. Enumerator getEnumerator() const;
  75. void serialize();
  76. void deserialize();
  77. static ManagedSerializableDictionaryPtr createFromExisting(MonoObject* managedInstance, const ManagedSerializableTypeInfoDictionaryPtr& typeInfo);
  78. static ManagedSerializableDictionaryPtr createNew(const ManagedSerializableTypeInfoDictionaryPtr& typeInfo);
  79. static MonoObject* createManagedInstance(const ManagedSerializableTypeInfoDictionaryPtr& typeInfo);
  80. protected:
  81. MonoObject* mManagedInstance;
  82. MonoMethod* mAddMethod;
  83. MonoMethod* mRemoveMethod;
  84. MonoMethod* mTryGetValueMethod;
  85. MonoMethod* mContainsKeyMethod;
  86. MonoMethod* mGetEnumerator;
  87. MonoMethod* mEnumMoveNext;
  88. MonoProperty* mEnumCurrentProp;
  89. MonoProperty* mKeyProp;
  90. MonoProperty* mValueProp;
  91. ManagedSerializableTypeInfoDictionaryPtr mDictionaryTypeInfo;
  92. CachedEntriesMap mCachedEntries;
  93. void initMonoObjects(MonoClass* dictionaryClass);
  94. /************************************************************************/
  95. /* RTTI */
  96. /************************************************************************/
  97. static ManagedSerializableDictionaryPtr createEmpty();
  98. public:
  99. friend class ManagedSerializableDictionaryRTTI;
  100. static RTTITypeBase* getRTTIStatic();
  101. virtual RTTITypeBase* getRTTI() const;
  102. };
  103. }