BsStringTableRTTI.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsStringTable.h"
  5. namespace BansheeEngine
  6. {
  7. class BS_CORE_EXPORT StringTableRTTI : public RTTIType<StringTable, IReflectable, StringTableRTTI>
  8. {
  9. private:
  10. Language& getActiveLanguage(StringTable* obj) { return obj->mActiveLanguage; }
  11. void setActiveLanguage(StringTable* obj, Language& val) { obj->mActiveLanguage = val; }
  12. LanguageData& getLanguageData(StringTable* obj, UINT32 idx) { return obj->mAllLanguages[idx]; }
  13. void setLanguageData(StringTable* obj, UINT32 idx, LanguageData& val) { obj->mAllLanguages[idx] = val; }
  14. UINT32 getNumLanguages(StringTable* obj) { return (UINT32)Language::Count; }
  15. void setNumLanguages(StringTable* obj, UINT32 val) { /* Do nothing */ }
  16. UnorderedSet<WString>& getIdentifiers(StringTable* obj) { return obj->mIdentifiers; }
  17. void setIdentifiers(StringTable* obj, UnorderedSet<WString>& val) { obj->mIdentifiers = val; }
  18. public:
  19. StringTableRTTI()
  20. {
  21. addPlainField("mActiveLanguage", 0, &StringTableRTTI::getActiveLanguage, &StringTableRTTI::setActiveLanguage);
  22. addPlainArrayField("mLanguageData", 1, &StringTableRTTI::getLanguageData, &StringTableRTTI::getNumLanguages,
  23. &StringTableRTTI::setLanguageData, &StringTableRTTI::setNumLanguages);
  24. addPlainField("mIdentifiers", 2, &StringTableRTTI::getIdentifiers, &StringTableRTTI::setIdentifiers);
  25. }
  26. virtual void onDeserializationEnded(IReflectable* obj) override
  27. {
  28. StringTable* stringTable = static_cast<StringTable*>(obj);
  29. stringTable->setActiveLanguage(stringTable->mActiveLanguage);
  30. }
  31. virtual const String& getRTTIName() override
  32. {
  33. static String name = "StringTable";
  34. return name;
  35. }
  36. virtual UINT32 getRTTIId() override
  37. {
  38. return TID_StringTable;
  39. }
  40. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  41. {
  42. return StringTable::_createPtr();
  43. }
  44. };
  45. /**
  46. * @brief RTTIPlainType for LanguageData.
  47. *
  48. * @see RTTIPlainType
  49. */
  50. template<>
  51. struct RTTIPlainType<LanguageData>
  52. {
  53. enum { id = TID_LanguageData }; enum { hasDynamicSize = 1 };
  54. /**
  55. * @copydoc RTTIPlainType::toMemory
  56. */
  57. static void toMemory(const LanguageData& data, char* memory)
  58. {
  59. UINT32 size = sizeof(UINT32);
  60. char* memoryStart = memory;
  61. memory += sizeof(UINT32);
  62. UINT32 numElements = (UINT32)data.strings.size();
  63. memory = rttiWriteElem(numElements, memory, size);
  64. for (auto& entry : data.strings)
  65. {
  66. memory = rttiWriteElem(entry.first, memory, size);
  67. memory = rttiWriteElem(*entry.second, memory, size);
  68. }
  69. memcpy(memoryStart, &size, sizeof(UINT32));
  70. }
  71. /**
  72. * @copydoc RTTIPlainType::fromMemory
  73. */
  74. static UINT32 fromMemory(LanguageData& data, char* memory)
  75. {
  76. UINT32 size = 0;
  77. memory = rttiReadElem(size, memory);
  78. UINT32 numElements = 0;
  79. memory = rttiReadElem(numElements, memory);
  80. data.strings.clear();
  81. for (UINT32 i = 0; i < numElements; i++)
  82. {
  83. WString identifier;
  84. memory = rttiReadElem(identifier, memory);
  85. SPtr<LocalizedStringData> entryData = bs_shared_ptr_new<LocalizedStringData>();
  86. memory = rttiReadElem(*entryData, memory);
  87. data.strings[identifier] = entryData;
  88. }
  89. return size;
  90. }
  91. /**
  92. * @copydoc RTTIPlainType::getDynamicSize
  93. */
  94. static UINT32 getDynamicSize(const LanguageData& data)
  95. {
  96. UINT64 dataSize = sizeof(UINT32) * 2;
  97. for (auto& entry : data.strings)
  98. {
  99. dataSize += rttiGetElemSize(entry.first);
  100. dataSize += rttiGetElemSize(*entry.second);
  101. }
  102. assert(dataSize <= std::numeric_limits<UINT32>::max());
  103. return (UINT32)dataSize;
  104. }
  105. };
  106. /**
  107. * @brief RTTIPlainType for LocalizedStringData.
  108. *
  109. * @see RTTIPlainType
  110. */
  111. template<>
  112. struct RTTIPlainType<LocalizedStringData>
  113. {
  114. enum { id = TID_LocalizedStringData }; enum { hasDynamicSize = 1 };
  115. /**
  116. * @copydoc RTTIPlainType::toMemory
  117. */
  118. static void toMemory(const LocalizedStringData& data, char* memory)
  119. {
  120. UINT32 size = sizeof(UINT32);
  121. char* memoryStart = memory;
  122. memory += sizeof(UINT32);
  123. memory = rttiWriteElem(data.string, memory, size);
  124. memory = rttiWriteElem(data.numParameters, memory, size);
  125. for (UINT32 i = 0; i < data.numParameters; i++)
  126. memory = rttiWriteElem(data.parameterOffsets[i], memory, size);
  127. memcpy(memoryStart, &size, sizeof(UINT32));
  128. }
  129. /**
  130. * @copydoc RTTIPlainType::fromMemory
  131. */
  132. static UINT32 fromMemory(LocalizedStringData& data, char* memory)
  133. {
  134. if (data.parameterOffsets != nullptr)
  135. bs_deleteN(data.parameterOffsets, data.numParameters);
  136. UINT32 size = 0;
  137. memory = rttiReadElem(size, memory);
  138. memory = rttiReadElem(data.string, memory);
  139. memory = rttiReadElem(data.numParameters, memory);
  140. data.parameterOffsets = bs_newN<LocalizedStringData::ParamOffset>(data.numParameters);
  141. for (UINT32 i = 0; i < data.numParameters; i++)
  142. memory = rttiReadElem(data.parameterOffsets[i], memory);
  143. return size;
  144. }
  145. /**
  146. * @copydoc RTTIPlainType::getDynamicSize
  147. */
  148. static UINT32 getDynamicSize(const LocalizedStringData& data)
  149. {
  150. UINT64 dataSize = sizeof(UINT32);
  151. dataSize += rttiGetElemSize(data.string);
  152. dataSize += rttiGetElemSize(data.numParameters);
  153. for (UINT32 i = 0; i < data.numParameters; i++)
  154. dataSize = rttiGetElemSize(data.parameterOffsets[i]);
  155. assert(dataSize <= std::numeric_limits<UINT32>::max());
  156. return (UINT32)dataSize;
  157. }
  158. };
  159. BS_ALLOW_MEMCPY_SERIALIZATION(LocalizedStringData::ParamOffset);
  160. }