Citlali
Loading...
Searching...
No Matches
config.h
Go to the documentation of this file.
1#pragma once
2
4
5template<typename param_t, typename option_t, typename key_vec_t>
6void check_allowed(param_t param, key_vec_t &missing_keys, key_vec_t &invalid_keys,
7 std::vector<param_t> allowed, option_t option) {
8 // loop through allowed values and see if param is contained within it
9 if (!std::any_of(allowed.begin(), allowed.end(), [&](const auto i){return i==param;})) {
10 // temporary vector to hold current invalid param's keys
11 std::vector<std::string> invalid_temp;
12 // push back invalid keys into temp vector
13 engine_utils::for_each_in_tuple(option, [&](const auto &x) {
14 invalid_temp.push_back(x);
15 });
16
17 // push temp invalid keys vector into invalid keys vector
18 invalid_keys.push_back(invalid_temp);
19 }
20}
21
22template<typename param_t, typename option_t, typename key_vec_t>
23void check_range(param_t param, key_vec_t &missing_keys, key_vec_t &invalid_keys,
24 std::vector<param_t> min_val, std::vector<param_t> max_val,
25 option_t option) {
26
27 bool invalid = false;
28
29 // make sure param is larger than minimum
30 if (!min_val.empty()) {
31 if (param < min_val.at(0)) {
32 invalid = true;
33 }
34 }
35
36 // make sure param is smaller than maximum
37 if (!max_val.empty()) {
38 if (param > max_val.at(0)) {
39 invalid = true;
40 }
41 }
42
43 // if param is invalid
44 if (invalid) {
45 // temporary vector to hold current invalid param's keys
46 std::vector<std::string> invalid_temp;
47 // push back invalid keys into temp vector
48 engine_utils::for_each_in_tuple(option, [&](const auto &x) {
49 invalid_temp.push_back(x);
50 });
51
52 // push temp invalid keys vector into invalid keys vector
53 invalid_keys.push_back(invalid_temp);
54 }
55}
56
57template <typename config_t, typename param_t, typename option_t, typename key_vec_t>
58void get_config_value(config_t config, param_t &param, key_vec_t &missing_keys,
59 key_vec_t &invalid_keys, option_t option, std::vector<param_t> allowed={},
60 std::vector<param_t> min_val={}, std::vector<param_t> max_val={}) {
61
62 std::shared_ptr<spdlog::logger> logger = spdlog::get("citlali_logger");
63
64 // check if config option exists
65 try {
66 if (config.template has_typed<param_t>(option_t(option))) {
67 // get the parameter from config
68 param = config.template get_typed<param_t>(option_t(option));
69
70 // if allowed values is specified, check against them
71 if (!allowed.empty()) {
72 check_allowed(param, missing_keys, invalid_keys, allowed, option);
73 }
74
75 // if a range is specified, check against them
76 if (!min_val.empty() || !max_val.empty()) {
77 check_range(param, missing_keys, invalid_keys, min_val, max_val, option);
78 }
79
80 logger->debug("got {} from config",option);
81 }
82 // else mark as missing
83 else {
84 // temporary vector to hold current missing param's keys
85 std::vector<std::string> missing_temp;
86 // push back missing keys into temp vector
87 engine_utils::for_each_in_tuple(option, [&](const auto &x) {
88 missing_temp.push_back(x);
89 });
90 // push temp missing keys vector into invalid keys vector
91 missing_keys.push_back(missing_temp);
92 }
93 }
94 catch (YAML::TypedBadConversion<param_t>) {
95 // temporary vector to hold current invalid param's keys
96 std::vector<std::string> invalid_temp;
97 // push back invalid keys into temp vector
98 engine_utils::for_each_in_tuple(option, [&](const auto &x) {
99 invalid_temp.push_back(x);
100 });
101
102 // push temp invalid keys vector into invalid keys vector
103 invalid_keys.push_back(invalid_temp);
104 }
105 catch (YAML::InvalidNode) {
106 // temporary vector to hold current invalid param's keys
107 std::vector<std::string> invalid_temp;
108 // push back invalid keys into temp vector
109 engine_utils::for_each_in_tuple(option, [&](const auto &x) {
110 invalid_temp.push_back(x);
111 });
112
113 // push temp invalid keys vector into invalid keys vector
114 invalid_keys.push_back(invalid_temp);
115 }
116}
void get_config_value(config_t config, param_t &param, key_vec_t &missing_keys, key_vec_t &invalid_keys, option_t option, std::vector< param_t > allowed={}, std::vector< param_t > min_val={}, std::vector< param_t > max_val={})
Definition config.h:58
void check_range(param_t param, key_vec_t &missing_keys, key_vec_t &invalid_keys, std::vector< param_t > min_val, std::vector< param_t > max_val, option_t option)
Definition config.h:23
void check_allowed(param_t param, key_vec_t &missing_keys, key_vec_t &invalid_keys, std::vector< param_t > allowed, option_t option)
Definition config.h:6
void for_each_in_tuple(const std::tuple< Ts... > &tuple, F func, std::index_sequence< Is... >)
Definition utils.h:307