BsSettings.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Settings/BsSettings.h"
  4. #include "Private/RTTI/BsSettingsRTTI.h"
  5. namespace bs
  6. {
  7. using namespace impl;
  8. RTTITypeBase* SettingsObjectValue::getRTTIStatic()
  9. {
  10. return SettingsObjectValueRTTI::instance();
  11. }
  12. RTTITypeBase* SettingsObjectValue::getRTTI() const
  13. {
  14. return getRTTIStatic();
  15. }
  16. void Settings::setFloat(const String& name, float value)
  17. {
  18. deleteKey(name);
  19. UINT32 keyIdx = (UINT32)mPrimitives.size();
  20. mKeyLookup[name] = SettingsKeyInfo(keyIdx, SettingsValueType::Float);
  21. mPrimitives.push_back(TSettingsValue<SettingsPrimitiveValue>(name, SettingsPrimitiveValue(value)));
  22. markAsDirty();
  23. }
  24. void Settings::setInt(const String& name, INT32 value)
  25. {
  26. deleteKey(name);
  27. UINT32 keyIdx = (UINT32)mPrimitives.size();
  28. mKeyLookup[name] = SettingsKeyInfo(keyIdx, SettingsValueType::Int);
  29. mPrimitives.push_back(TSettingsValue<SettingsPrimitiveValue>(name, SettingsPrimitiveValue(value)));
  30. markAsDirty();
  31. }
  32. void Settings::setBool(const String& name, bool value)
  33. {
  34. deleteKey(name);
  35. UINT32 keyIdx = (UINT32)mPrimitives.size();
  36. mKeyLookup[name] = SettingsKeyInfo(keyIdx, SettingsValueType::Bool);
  37. mPrimitives.push_back(TSettingsValue<SettingsPrimitiveValue>(name, SettingsPrimitiveValue(value)));
  38. markAsDirty();
  39. }
  40. void Settings::setString(const String& name, const String& value)
  41. {
  42. deleteKey(name);
  43. UINT32 keyIdx = (UINT32)mStrings.size();
  44. mKeyLookup[name] = SettingsKeyInfo(keyIdx, SettingsValueType::String);
  45. mStrings.push_back(TSettingsValue<String>(name, value));
  46. markAsDirty();
  47. }
  48. void Settings::setObject(const String& name, const SPtr<IReflectable>& value)
  49. {
  50. deleteKey(name);
  51. UINT32 keyIdx = (UINT32)mObjects.size();
  52. mKeyLookup[name] = SettingsKeyInfo(keyIdx, SettingsValueType::Object);
  53. mObjects.push_back(SettingsObjectValue(name, value));
  54. markAsDirty();
  55. }
  56. float Settings::getFloat(const String& name, float defaultValue)
  57. {
  58. auto iterFind = mKeyLookup.find(name);
  59. if(iterFind == mKeyLookup.end())
  60. return defaultValue;
  61. const SettingsKeyInfo& valueInfo = iterFind->second;
  62. if(valueInfo.type != SettingsValueType::Float)
  63. return defaultValue;
  64. return mPrimitives[valueInfo.index].value.floatVal;
  65. }
  66. INT32 Settings::getInt(const String& name, INT32 defaultValue)
  67. {
  68. auto iterFind = mKeyLookup.find(name);
  69. if(iterFind == mKeyLookup.end())
  70. return defaultValue;
  71. const SettingsKeyInfo& valueInfo = iterFind->second;
  72. if(valueInfo.type != SettingsValueType::Int)
  73. return defaultValue;
  74. return mPrimitives[valueInfo.index].value.intVal;
  75. }
  76. bool Settings::getBool(const String& name, bool defaultValue)
  77. {
  78. auto iterFind = mKeyLookup.find(name);
  79. if(iterFind == mKeyLookup.end())
  80. return defaultValue;
  81. const SettingsKeyInfo& valueInfo = iterFind->second;
  82. if(valueInfo.type != SettingsValueType::Bool)
  83. return defaultValue;
  84. return mPrimitives[valueInfo.index].value.boolVal;
  85. }
  86. String Settings::getString(const String& name, const String& defaultValue)
  87. {
  88. auto iterFind = mKeyLookup.find(name);
  89. if(iterFind == mKeyLookup.end())
  90. return defaultValue;
  91. const SettingsKeyInfo& valueInfo = iterFind->second;
  92. return mStrings[valueInfo.index].value;
  93. }
  94. SPtr<IReflectable> Settings::getObject(const String& name)
  95. {
  96. auto iterFind = mKeyLookup.find(name);
  97. if(iterFind == mKeyLookup.end())
  98. return nullptr;
  99. const SettingsKeyInfo& valueInfo = iterFind->second;
  100. return mObjects[valueInfo.index].value;
  101. }
  102. bool Settings::hasKey(const String& name)
  103. {
  104. return mKeyLookup.find(name) != mKeyLookup.end();
  105. }
  106. void Settings::deleteKey(const String& name)
  107. {
  108. auto iterFind = mKeyLookup.find(name);
  109. if(iterFind == mKeyLookup.end())
  110. return;
  111. const SettingsKeyInfo& valueInfo = iterFind->second;
  112. size_t curIdx = (size_t)valueInfo.index;
  113. switch(valueInfo.type)
  114. {
  115. case SettingsValueType::Float:
  116. case SettingsValueType::Int:
  117. case SettingsValueType::Bool:
  118. {
  119. if(bs_swap_and_erase(mPrimitives, mPrimitives.begin() + curIdx))
  120. {
  121. SettingsKeyInfo& swappedValue = mKeyLookup[mPrimitives[curIdx].key];
  122. swappedValue.index = (UINT32)curIdx;
  123. }
  124. }
  125. break;
  126. case SettingsValueType::String:
  127. {
  128. if(bs_swap_and_erase(mStrings, mStrings.begin() + curIdx))
  129. {
  130. SettingsKeyInfo& swappedValue = mKeyLookup[mStrings[curIdx].key];
  131. swappedValue.index = (UINT32)curIdx;
  132. }
  133. }
  134. break;
  135. case SettingsValueType::Object:
  136. {
  137. if(bs_swap_and_erase(mObjects, mObjects.begin() + curIdx))
  138. {
  139. SettingsKeyInfo& swappedValue = mKeyLookup[mObjects[curIdx].key];
  140. swappedValue.index = (UINT32)curIdx;
  141. }
  142. }
  143. break;
  144. }
  145. mKeyLookup.erase(iterFind);
  146. markAsDirty();
  147. }
  148. void Settings::deleteAllKeys()
  149. {
  150. mKeyLookup.clear();
  151. mPrimitives.clear();
  152. mStrings.clear();
  153. mObjects.clear();
  154. markAsDirty();
  155. }
  156. RTTITypeBase* Settings::getRTTIStatic()
  157. {
  158. return SettingsRTTI::instance();
  159. }
  160. RTTITypeBase* Settings::getRTTI() const
  161. {
  162. return getRTTIStatic();
  163. }
  164. }