27 const nlohmann::json &j_current,
28 const nlohmann::json &j,
29 bool has_used_defaults,
30 bool has_updated_config);
36 const nlohmann::json &j,
const std::string &key, T &value,
bool &has_used_defaults) {
37 if (j.contains(key)) {
38 j.at(key).get_to(value);
40 has_used_defaults =
true;
49 const nlohmann::json &j,
50 const std::string &key,
52 std::initializer_list<const char *> fallbacks,
53 bool &has_used_defaults,
54 bool &has_updated_config) {
56 if (j.contains(key)) {
57 j.at(key).get_to(value);
59 for (
const char *fallback : fallbacks) {
60 if (j.contains(fallback)) {
61 j.at(fallback).get_to(value);
62 has_updated_config =
true;
64 shamcomm::logs::warn_ln(
66 "Updating old key [" + std::string(fallback) +
"] to new key [" + key
72 has_used_defaults =
true;
86#define SHAMROCK_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
87 template<typename BasicJsonType> \
88 inline void to_json(BasicJsonType &j, const ENUM_TYPE &e) { \
90 static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
92 static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
94 auto it = std::find_if( \
97 [e](const std::pair<ENUM_TYPE, BasicJsonType> &ej_pair) -> bool { \
98 return ej_pair.first == e; \
100 if (it != std::end(m)) { \
103 throw shambase::make_except_with_loc<std::runtime_error>( \
104 "Invalid " #ENUM_TYPE " value: " + std::to_string(e)); \
107 template<typename BasicJsonType> \
108 inline void from_json(const BasicJsonType &j, ENUM_TYPE &e) { \
110 static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
112 static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
114 auto it = std::find_if( \
117 [&j](const std::pair<ENUM_TYPE, BasicJsonType> &ej_pair) -> bool { \
118 return ej_pair.second == j; \
120 if (it != std::end(m)) { \
123 throw shambase::make_except_with_loc<std::runtime_error>( \
124 "Invalid " #ENUM_TYPE " value: " + std::to_string(e)); \
i32 world_rank()
Gives the rank of the current process in the MPI communicator.
namespace for the main framework
void get_to_if_contains(const nlohmann::json &j, const std::string &key, T &value, bool &has_used_defaults)
std::string log_json_changes(const nlohmann::json &j_current, const nlohmann::json &j, bool has_used_defaults, bool has_updated_config)
Shown the changes between two JSON objects to log config changes.
void get_to_if_contains_fallbacks(const nlohmann::json &j, const std::string &key, T &value, std::initializer_list< const char * > fallbacks, bool &has_used_defaults, bool &has_updated_config)
Functions related to the MPI communicator.