BsSettings.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. size_t lastIdx = mPrimitives.size() - 1;
  120. if(bs_swap_and_erase(mPrimitives, mPrimitives.begin() + curIdx))
  121. {
  122. SettingsKeyInfo& swappedValue = mKeyLookup[mPrimitives[curIdx].key];
  123. swappedValue.index = (UINT32)lastIdx;
  124. }
  125. }
  126. break;
  127. case SettingsValueType::String:
  128. {
  129. size_t lastIdx = mStrings.size() - 1;
  130. if(bs_swap_and_erase(mStrings, mStrings.begin() + curIdx))
  131. {
  132. SettingsKeyInfo& swappedValue = mKeyLookup[mStrings[curIdx].key];
  133. swappedValue.index = (UINT32)lastIdx;
  134. }
  135. }
  136. break;
  137. case SettingsValueType::Object:
  138. {
  139. size_t lastIdx = mObjects.size() - 1;
  140. if(bs_swap_and_erase(mObjects, mObjects.begin() + curIdx))
  141. {
  142. SettingsKeyInfo& swappedValue = mKeyLookup[mObjects[curIdx].key];
  143. swappedValue.index = (UINT32)lastIdx;
  144. }
  145. }
  146. break;
  147. }
  148. mKeyLookup.erase(iterFind);
  149. markAsDirty();
  150. }
  151. void Settings::deleteAllKeys()
  152. {
  153. mKeyLookup.clear();
  154. mPrimitives.clear();
  155. mStrings.clear();
  156. mObjects.clear();
  157. markAsDirty();
  158. }
  159. RTTITypeBase* Settings::getRTTIStatic()
  160. {
  161. return SettingsRTTI::instance();
  162. }
  163. RTTITypeBase* Settings::getRTTI() const
  164. {
  165. return getRTTIStatic();
  166. }
  167. }