CVarSet.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Util/CVarSet.h>
  6. #include <AnKi/Util/File.h>
  7. #include <AnKi/Util/Thread.h>
  8. namespace anki {
  9. #if ANKI_ASSERTIONS_ENABLED
  10. void CVar::validateSetValue() const
  11. {
  12. ANKI_ASSERT(Thread::getCurrentThreadId() == CVarSet::getSingleton().m_mainThreadHandle && "CVars can only be set by the main thread");
  13. }
  14. #endif
  15. void CVarSet::registerCVar(CVar* cvar)
  16. {
  17. #if ANKI_ASSERTIONS_ENABLED
  18. m_mainThreadHandle = Thread::getCurrentThreadId();
  19. #endif
  20. for([[maybe_unused]] CVar& it : m_cvars)
  21. {
  22. ANKI_ASSERT(it.m_name != cvar->m_name);
  23. }
  24. m_cvars.pushBack(cvar);
  25. }
  26. Error CVarSet::setMultiple(ConstWeakArray<const Char*> arr)
  27. {
  28. for(U32 i = 0; i < arr.getSize(); ++i)
  29. {
  30. ANKI_ASSERT(arr[i]);
  31. const CString varName = arr[i];
  32. // Get the value string
  33. ++i;
  34. if(i >= arr.getSize())
  35. {
  36. ANKI_UTIL_LOGE("Expecting a value after %s", varName.cstr());
  37. return Error::kUserData;
  38. }
  39. ANKI_ASSERT(arr[i]);
  40. const CString value = arr[i];
  41. // Find the CVar
  42. CVar* foundCVar = nullptr;
  43. for(CVar& it : m_cvars)
  44. {
  45. if(it.m_name == varName)
  46. {
  47. foundCVar = &it;
  48. }
  49. }
  50. if(foundCVar)
  51. {
  52. #define ANKI_CVAR_NUMERIC_SET(type) \
  53. case CVarValueType::kNumeric##type: \
  54. { \
  55. type v; \
  56. err = value.toNumber(v); \
  57. if(!err) \
  58. { \
  59. static_cast<NumericCVar<type>&>(*foundCVar) = v; \
  60. } \
  61. break; \
  62. }
  63. Error err = Error::kNone;
  64. switch(foundCVar->m_type)
  65. {
  66. case CVarValueType::kString:
  67. static_cast<StringCVar&>(*foundCVar) = value;
  68. break;
  69. case CVarValueType::kBool:
  70. {
  71. U32 v;
  72. err = value.toNumber(v);
  73. if(!err)
  74. {
  75. static_cast<BoolCVar&>(*foundCVar) = (v != 0);
  76. }
  77. break;
  78. }
  79. ANKI_CVAR_NUMERIC_SET(U8)
  80. ANKI_CVAR_NUMERIC_SET(U16)
  81. ANKI_CVAR_NUMERIC_SET(U32)
  82. ANKI_CVAR_NUMERIC_SET(PtrSize)
  83. ANKI_CVAR_NUMERIC_SET(F32)
  84. ANKI_CVAR_NUMERIC_SET(F64)
  85. default:
  86. ANKI_ASSERT(0);
  87. }
  88. if(err)
  89. {
  90. ANKI_UTIL_LOGE("Wrong value for %s. Value will not be set", foundCVar->m_name.cstr());
  91. }
  92. }
  93. else
  94. {
  95. ANKI_UTIL_LOGE("Can't recognize command line argument: %s. Skipping", varName.cstr());
  96. }
  97. }
  98. return Error::kNone;
  99. }
  100. } // end namespace anki