BsScriptSerializableDictionary.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "BsScriptSerializableDictionary.h"
  2. #include "BsScriptSerializableDictionaryRTTI.h"
  3. #include "BsMonoManager.h"
  4. #include "BsRuntimeScriptObjects.h"
  5. #include "BsScriptSerializableField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoMethod.h"
  8. using namespace CamelotFramework;
  9. namespace BansheeEngine
  10. {
  11. ScriptSerializableDictionary::ScriptSerializableDictionary(const ConstructPrivately& dummy)
  12. :mManagedInstance(nullptr), mNumElements(0)
  13. {
  14. }
  15. ScriptSerializableDictionary::ScriptSerializableDictionary(const ConstructPrivately& dummy, const ScriptSerializableTypeInfoDictionaryPtr& typeInfo, MonoObject* managedInstance)
  16. :mDictionaryTypeInfo(typeInfo), mManagedInstance(managedInstance), mNumElements(0)
  17. {
  18. mNumElements = getLength();
  19. }
  20. ScriptSerializableDictionaryPtr ScriptSerializableDictionary::create(MonoObject* managedInstance, const ScriptSerializableTypeInfoDictionaryPtr& typeInfo)
  21. {
  22. if(!RuntimeScriptObjects::instance().getSystemGenericDictionaryClass()->isInstanceOfType(managedInstance))
  23. return nullptr;
  24. return cm_shared_ptr<ScriptSerializableDictionary>(ConstructPrivately(), typeInfo, managedInstance);
  25. }
  26. ScriptSerializableDictionaryPtr ScriptSerializableDictionary::createEmpty()
  27. {
  28. return cm_shared_ptr<ScriptSerializableDictionary>(ConstructPrivately());
  29. }
  30. void ScriptSerializableDictionary::serializeManagedInstance()
  31. {
  32. mDictionaryEntries.resize(mNumElements * 2);
  33. for(UINT32 i = 0; i < mNumElements; i++)
  34. {
  35. mDictionaryEntries[i] = getFieldData(i);
  36. }
  37. }
  38. void ScriptSerializableDictionary::deserializeManagedInstance()
  39. {
  40. if(!mDictionaryTypeInfo->isTypeLoaded())
  41. return;
  42. ::MonoClass* dictionaryMonoClass = mDictionaryTypeInfo->getMonoClass();
  43. MonoClass* dictionaryClass = MonoManager::instance().findClass(dictionaryMonoClass);
  44. if(dictionaryClass == nullptr)
  45. return;
  46. mManagedInstance = dictionaryClass->createInstance();
  47. setLength(mNumElements);
  48. CM::UINT32 idx = 0;
  49. for(auto& arrayEntry : mDictionaryEntries)
  50. {
  51. setFieldData(idx, arrayEntry);
  52. idx++;
  53. }
  54. }
  55. void ScriptSerializableDictionary::setFieldData(CM::UINT32 arrayIdx, const ScriptSerializableFieldDataPtr& val)
  56. {
  57. if(val->isValueType())
  58. {
  59. if((arrayIdx % 2) == 0)
  60. setValue(arrayIdx, val->getValue(mDictionaryTypeInfo->mKeyType));
  61. else
  62. setValue(arrayIdx, val->getValue(mDictionaryTypeInfo->mValueType));
  63. }
  64. else
  65. {
  66. MonoObject* ptrToObj = nullptr;
  67. if((arrayIdx % 2) == 0)
  68. ptrToObj = (MonoObject*)val->getValue(mDictionaryTypeInfo->mKeyType);
  69. else
  70. ptrToObj = (MonoObject*)val->getValue(mDictionaryTypeInfo->mValueType);
  71. setValue(arrayIdx, &ptrToObj);
  72. }
  73. }
  74. ScriptSerializableFieldDataPtr ScriptSerializableDictionary::getFieldData(CM::UINT32 arrayIdx)
  75. {
  76. if((arrayIdx % 2) == 0)
  77. return ScriptSerializableFieldData::create(mDictionaryTypeInfo->mKeyType, getValue(arrayIdx));
  78. else
  79. return ScriptSerializableFieldData::create(mDictionaryTypeInfo->mValueType, getValue(arrayIdx));
  80. }
  81. void ScriptSerializableDictionary::setValue(CM::UINT32 arrayIdx, void* val)
  82. {
  83. // TODO
  84. }
  85. void* ScriptSerializableDictionary::getValue(CM::UINT32 arrayIdx)
  86. {
  87. // TODO
  88. return nullptr;
  89. }
  90. UINT32 ScriptSerializableDictionary::getLength() const
  91. {
  92. // TODO
  93. return 0;
  94. }
  95. void ScriptSerializableDictionary::setLength(UINT32 length)
  96. {
  97. // TODO
  98. }
  99. RTTITypeBase* ScriptSerializableDictionary::getRTTIStatic()
  100. {
  101. return ScriptSerializableDictionaryRTTI::instance();
  102. }
  103. RTTITypeBase* ScriptSerializableDictionary::getRTTI() const
  104. {
  105. return ScriptSerializableDictionary::getRTTIStatic();
  106. }
  107. }