BsHString.cpp 2.5 KB

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