BsStringTableRTTI.h 5.8 KB

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