BsHString.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsCorePrerequisites.h"
  4. #include "Localization/BsHString.h"
  5. #include "Localization/BsStringTableManager.h"
  6. namespace bs
  7. {
  8. HString::HString(UINT32 stringTableId)
  9. :mParameters(nullptr), mIsDirty(true), mStringPtr(nullptr)
  10. {
  11. mStringData = StringTableManager::instance().getTable(stringTableId)->getStringData(L"");
  12. if (mStringData->numParameters > 0)
  13. mParameters = bs_newN<WString>(mStringData->numParameters);
  14. }
  15. HString::HString(const WString& identifierString, UINT32 stringTableId)
  16. :mParameters(nullptr), mIsDirty(true), mStringPtr(nullptr)
  17. {
  18. mStringData = StringTableManager::instance().getTable(stringTableId)->getStringData(identifierString);
  19. if (mStringData->numParameters > 0)
  20. mParameters = bs_newN<WString>(mStringData->numParameters);
  21. }
  22. HString::HString(const WString& identifierString, const WString& defaultString, UINT32 stringTableId)
  23. :mParameters(nullptr), mIsDirty(true), mStringPtr(nullptr)
  24. {
  25. HStringTable table = StringTableManager::instance().getTable(stringTableId);
  26. table->setString(identifierString, StringTable::DEFAULT_LANGUAGE, defaultString);
  27. mStringData = table->getStringData(identifierString);
  28. if (mStringData->numParameters > 0)
  29. mParameters = bs_newN<WString>(mStringData->numParameters);
  30. }
  31. HString::HString(const HString& copy)
  32. {
  33. mStringData = copy.mStringData;
  34. mIsDirty = copy.mIsDirty;
  35. mCachedString = copy.mCachedString;
  36. if (copy.mStringData->numParameters > 0)
  37. {
  38. mParameters = bs_newN<WString>(mStringData->numParameters);
  39. if (copy.mParameters != nullptr)
  40. {
  41. for (UINT32 i = 0; i < mStringData->numParameters; i++)
  42. mParameters[i] = copy.mParameters[i];
  43. }
  44. mStringPtr = &mCachedString;
  45. }
  46. else
  47. {
  48. mParameters = nullptr;
  49. mStringPtr = &mStringData->string;
  50. }
  51. }
  52. HString::~HString()
  53. {
  54. if (mParameters != nullptr)
  55. bs_deleteN(mParameters, mStringData->numParameters);
  56. }
  57. HString::operator const WString& () const
  58. {
  59. return getValue();
  60. }
  61. HString& HString::operator=(const HString& rhs)
  62. {
  63. if (mParameters != nullptr)
  64. {
  65. bs_deleteN(mParameters, mStringData->numParameters);
  66. mParameters = nullptr;
  67. }
  68. mStringData = rhs.mStringData;
  69. mIsDirty = rhs.mIsDirty;
  70. mCachedString = rhs.mCachedString;
  71. if (rhs.mStringData->numParameters > 0)
  72. {
  73. mParameters = bs_newN<WString>(mStringData->numParameters);
  74. if (rhs.mParameters != nullptr)
  75. {
  76. for (UINT32 i = 0; i < mStringData->numParameters; i++)
  77. mParameters[i] = rhs.mParameters[i];
  78. }
  79. mStringPtr = &mCachedString;
  80. }
  81. else
  82. {
  83. mParameters = nullptr;
  84. mStringPtr = &mStringData->string;
  85. }
  86. return *this;
  87. }
  88. const WString& HString::getValue() const
  89. {
  90. if (mIsDirty)
  91. {
  92. if (mParameters != nullptr)
  93. {
  94. mStringData->concatenateString(mCachedString, mParameters, mStringData->numParameters);
  95. mStringPtr = &mCachedString;
  96. }
  97. else
  98. {
  99. mStringPtr = &mStringData->string;
  100. }
  101. mIsDirty = false;
  102. }
  103. return *mStringPtr;
  104. }
  105. void HString::setParameter(UINT32 idx, const WString& value)
  106. {
  107. if (idx >= mStringData->numParameters)
  108. return;
  109. mParameters[idx] = value;
  110. mIsDirty = true;
  111. }
  112. const HString& HString::dummy()
  113. {
  114. static HString dummyVal;
  115. return dummyVal;
  116. }
  117. }