23 template <
typename data_t>
24 auto get_param(std::string
const& type, std::string
const& moduleName,
26 -> std::optional<std::remove_cvref_t<data_t>>
28 using base_data_t = std::remove_cvref_t<data_t>;
31 this->self().template get<base_data_t>({type, moduleName, paramName});
36 auto arrayValue = this->self().template get<std::vector<base_data_t>>(
37 {type, moduleName, paramName});
39 return get_discrete_value<base_data_t>(arrayValue.value(), engine);
42 auto mapValue = this->self().template get<std::map<std::string, base_data_t>>(
43 {type, moduleName, paramName});
47 return get_range_value<base_data_t>(mapValue.value(), engine);
58 template <
typename data_t>
59 auto get_discrete_value(std::vector<data_t>
const& data,
62 std::uniform_int_distribution<size_t> dist(0, data.size() - 1);
63 return data[dist(engine)];
66 template <
typename data_t>
68 auto get_range_value(std::map<std::string, data_t>
const& data,
71 if constexpr ( std::is_floating_point_v<data_t> ) {
72 std::uniform_real_distribution<data_t> dist(data.at(
"min"), data.at(
"max"));
75 else if constexpr ( std::is_integral_v<data_t> ) {
76 std::uniform_int_distribution<data_t> dist(data.at(
"min"), data.at(
"max"));
80 static_assert(
false,
"Invalid Type");