BsStringTableRTTI.h 5.6 KB

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