config_utility.hpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #ifndef SOPHIAR2_CONFIG_UTILITY_HPP
  2. #define SOPHIAR2_CONFIG_UTILITY_HPP
  3. #include "core/global_defs.h"
  4. #include "core/sophiar_pool.h"
  5. #include <nlohmann/json.hpp>
  6. #define ENSURE_ARRAY(item_name) \
  7. assert(config.contains(item_name)); \
  8. assert(config[item_name].is_array());
  9. #define ENSURE_STRING(item_name) \
  10. assert(config.contains(item_name)); \
  11. assert(config[item_name].is_string());
  12. #define ENSURE_STRING2(config, item_name) \
  13. assert(config.contains(item_name)); \
  14. assert(config[item_name].is_string());
  15. inline auto LOAD_BOOL_ITEM2(const nlohmann::json &config,
  16. const std::string &item_name) {
  17. assert(config.contains(item_name));
  18. assert(config[item_name].is_boolean());
  19. return config[item_name].get<bool>();
  20. }
  21. #define LOAD_BOOL_ITEM(item_name) \
  22. LOAD_BOOL_ITEM2(config, item_name)
  23. inline auto LOAD_FLOAT_ITEM2(const nlohmann::json &config,
  24. const std::string &item_name) {
  25. assert(config.contains(item_name));
  26. assert(config[item_name].is_boolean());
  27. return config[item_name].get<double>();
  28. }
  29. #define LOAD_FLOAT_ITEM(item_name) \
  30. LOAD_FLOAT_ITEM2(config, item_name)
  31. inline auto LOAD_UINT_ITEM2(const nlohmann::json &config,
  32. const std::string &item_name) {
  33. assert(config.contains(item_name));
  34. assert(config[item_name].is_boolean());
  35. return config[item_name].get<uint64_t>();
  36. }
  37. #define LOAD_UINT_ITEM(item_name) \
  38. LOAD_UINT_ITEM2(config, item_name)
  39. inline auto LOAD_STRING_ITEM2(const nlohmann::json &config,
  40. const std::string &item_name) {
  41. ENSURE_STRING2(config, item_name) \
  42. return config[item_name].get<std::string>();
  43. }
  44. #define LOAD_STRING_ITEM(item_name) \
  45. LOAD_STRING_ITEM2(config, item_name)
  46. template<typename SmallObjType>
  47. inline auto LOAD_VARIABLE_INDEX2_IMPL(const nlohmann::json &config,
  48. const std::string &var_name) {
  49. auto name = LOAD_STRING_ITEM2(config, var_name);
  50. using namespace sophiar;
  51. return REQUIRE_VARIABLE(SmallObjType, name);
  52. }
  53. #define LOAD_VARIABLE_INDEX2(config, var_type, var_name) \
  54. LOAD_VARIABLE_INDEX2_IMPL<var_type>(config, var_name)
  55. #define LOAD_VARIABLE_INDEX(var_type, var_name) \
  56. LOAD_VARIABLE_INDEX2(config ,var_type, var_name)
  57. inline auto TRY_LOAD_BOOL_ITEM2(const nlohmann::json &config,
  58. const std::string &var_name, bool default_val) {
  59. if (config.contains(var_name)) {
  60. assert(config[var_name].is_number());
  61. return config[var_name].get<bool>();
  62. } else {
  63. return default_val;
  64. }
  65. }
  66. #define TRY_LOAD_BOOL_ITEM(var_name, default_val) \
  67. TRY_LOAD_BOOL_ITEM2(config, var_name, default_val)
  68. inline auto TRY_LOAD_FLOAT_ITEM2(const nlohmann::json &config,
  69. const std::string &var_name, double default_val) {
  70. if (config.contains(var_name)) {
  71. assert(config[var_name].is_number());
  72. return config[var_name].get<double>();
  73. } else {
  74. return default_val;
  75. }
  76. }
  77. #define TRY_LOAD_FLOAT_ITEM(var_name, default_val) \
  78. TRY_LOAD_FLOAT_ITEM2(config, var_name, default_val)
  79. template<typename SmallObjType>
  80. inline sophiar::variable_index_type
  81. TRY_LOAD_VARIABLE_INDEX2_IMPL(const nlohmann::json &config,
  82. const std::string &var_name) {
  83. using namespace sophiar;
  84. if (config.contains(var_name)) {
  85. assert(config[var_name].is_string());
  86. auto _name = config[var_name].get<std::string>();
  87. return REQUIRE_VARIABLE(SmallObjType, _name);
  88. } else {
  89. return invalid_variable_index;
  90. }
  91. }
  92. #define TRY_LOAD_VARIABLE_INDEX2(config, var_type, var_name) \
  93. TRY_LOAD_VARIABLE_INDEX2_IMPL<var_type>(config, var_name)
  94. #define TRY_LOAD_VARIABLE_INDEX(var_type, var_name) \
  95. TRY_LOAD_VARIABLE_INDEX2(config, var_type, var_name)
  96. template<typename SmallObjType>
  97. inline auto LOAD_VARIABLE_INDEX_WITH_NAME_IMPL(const nlohmann::json &config,
  98. const std::string &var_name, std::string &var_name_out) {
  99. var_name_out = LOAD_STRING_ITEM(var_name);
  100. using namespace sophiar;
  101. return REQUIRE_VARIABLE(SmallObjType, var_name_out);
  102. }
  103. #define LOAD_VARIABLE_INDEX_WITH_NAME(var_type, var_name, var_name_out) \
  104. LOAD_VARIABLE_INDEX_WITH_NAME_IMPL<var_type>(config, var_name, var_name_out)
  105. #endif //SOPHIAR2_CONFIG_UTILITY_HPP