BsHString.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "BsCorePrerequisites.h"
  2. #include "BsHString.h"
  3. #include "BsStringTableManager.h"
  4. namespace BansheeEngine
  5. {
  6. HString::HString(UINT32 stringTableId)
  7. :mParameters(nullptr), mIsDirty(true), mStringPtr(nullptr)
  8. {
  9. mStringData = StringTableManager::instance().getTable(stringTableId)->getStringData(L"");
  10. if(mStringData->numParameters > 0)
  11. mParameters = bs_newN<WString>(mStringData->numParameters);
  12. }
  13. HString::HString(const WString& identifierString, UINT32 stringTableId)
  14. :mParameters(nullptr), mIsDirty(true), mStringPtr(nullptr)
  15. {
  16. mStringData = StringTableManager::instance().getTable(stringTableId)->getStringData(identifierString);
  17. if(mStringData->numParameters > 0)
  18. mParameters = bs_newN<WString>(mStringData->numParameters);
  19. }
  20. HString::HString(const WString& identifierString, const WString& defaultString, UINT32 stringTableId)
  21. :mParameters(nullptr), mIsDirty(true), mStringPtr(nullptr)
  22. {
  23. HStringTable table = StringTableManager::instance().getTable(stringTableId);
  24. table->setString(identifierString, StringTable::DEFAULT_LANGUAGE, defaultString);
  25. mStringData = table->getStringData(identifierString);
  26. if (mStringData->numParameters > 0)
  27. mParameters = bs_newN<WString>(mStringData->numParameters);
  28. }
  29. HString::HString(const HString& copy)
  30. {
  31. *this = copy;
  32. }
  33. HString::~HString()
  34. {
  35. if (mParameters != nullptr)
  36. bs_deleteN(mParameters, mStringData->numParameters);
  37. }
  38. HString::operator const WString& () const
  39. {
  40. return getValue();
  41. }
  42. HString& HString::operator=(const HString& rhs)
  43. {
  44. mStringData = rhs.mStringData;
  45. mIsDirty = rhs.mIsDirty;
  46. mCachedString = rhs.mCachedString;
  47. if (rhs.mStringData->numParameters > 0)
  48. {
  49. mParameters = bs_newN<WString>(mStringData->numParameters);
  50. if (rhs.mParameters != nullptr)
  51. {
  52. for (UINT32 i = 0; i < mStringData->numParameters; i++)
  53. mParameters[i] = rhs.mParameters[i];
  54. }
  55. mStringPtr = &mCachedString;
  56. }
  57. else
  58. {
  59. mParameters = nullptr;
  60. mStringPtr = &mStringData->string;
  61. }
  62. return *this;
  63. }
  64. const WString& HString::getValue() const
  65. {
  66. if(mIsDirty)
  67. {
  68. if(mParameters != nullptr)
  69. {
  70. mStringData->concatenateString(mCachedString, mParameters, mStringData->numParameters);
  71. mStringPtr = &mCachedString;
  72. }
  73. else
  74. {
  75. mStringPtr = &mStringData->string;
  76. }
  77. mIsDirty = false;
  78. }
  79. return *mStringPtr;
  80. }
  81. void HString::setParameter(UINT32 idx, const WString& value)
  82. {
  83. if (idx >= mStringData->numParameters)
  84. return;
  85. mParameters[idx] = value;
  86. mIsDirty = true;
  87. }
  88. const HString& HString::dummy()
  89. {
  90. static HString dummyVal;
  91. return dummyVal;
  92. }
  93. }