13#include "../utils/error_handling.h"
16namespace param_details
20enum class TypeErr { none,
generic, boolean, out_of_range };
23[[noreturn]]
void Report_TypeErr_(
const std::string& param,
const std::string& str,
const std::string& dtype,
24 TypeErr type_convert_err);
33param_details::TypeErr try_int64_(
const std::string& str, std::int64_t& val);
34param_details::TypeErr try_double_(
const std::string& str,
double& val);
35param_details::TypeErr try_bool_(
const std::string& str,
bool& val);
36param_details::TypeErr try_string_(
const std::string& str, std::string& val);
39inline param_details::TypeErr try_int_(
const std::string& str,
int& val)
42 TypeErr err = try_int64_(str, tmp);
43 if ((err == param_details::TypeErr::none) and (INT_MIN <= tmp) && (tmp <= INT_MAX)) {
47 return (err == TypeErr::none) ? TypeErr::out_of_range : err;
77 std::string param_str;
82 std::map<std::string, ParamEntry> entries_;
91 ParameterMap(std::FILE* fp,
int argc,
char** argv,
bool close_fp =
false);
94 ParameterMap(
const std::string& fname,
int argc,
char** argv);
97 std::size_t size() {
return entries_.size(); }
100 bool has_param(
const std::string& param) {
return entries_.find(param) != entries_.end(); }
107 template <
typename T>
108 bool param_has_type(
const std::string& param)
110 return try_get_<T>(param,
true).has_value();
121 template <
typename T>
122 T value(
const std::string& param)
124 std::optional<T> result = try_get_<T>(param,
false);
125 if (not result.has_value()) {
126 CHOLLA_ERROR(
"The \"%s\" parameter was not specified.", param.c_str());
128 return result.value();
145 bool value_or(
const std::string& param,
bool default_val)
147 return try_get_<bool>(param,
false).value_or(default_val);
150 int value_or(
const std::string& param,
int default_val) {
return try_get_<int>(param,
false).value_or(default_val); }
152 std::int64_t value_or(
const std::string& param, std::int64_t default_val)
154 return try_get_<std::int64_t>(param,
false).value_or(default_val);
157 double value_or(
const std::string& param,
double default_val)
159 return try_get_<double>(param,
false).value_or(default_val);
162 std::string value_or(
const std::string& param,
const std::string& default_val)
164 return try_get_<std::string>(param,
false).value_or(default_val);
167 std::string value_or(
const std::string& param,
const char* default_val)
169 return try_get_<std::string>(param,
false).value_or(default_val);
182 int warn_unused_parameters(
const std::set<std::string>& ignore_params,
bool abort_on_warning =
false,
183 bool suppress_warning_msg =
false)
const;
186 bool Contains_Table(std::string table_name)
const;
193 void Enforce_Table_Content_Uniform_Access_Status(std::string table_name,
bool expect_unused)
const;
203 template <
typename T>
204 std::optional<T> try_get_(
const std::string& param,
bool is_type_check);
208std::optional<T> ParameterMap::try_get_(
const std::string& param,
bool is_type_check)
210 auto keyvalue_pair = entries_.find(param);
211 if (keyvalue_pair == entries_.end())
return {};
213 const std::string& str = (keyvalue_pair->second).param_str;
217 param_details::TypeErr err{};
218 const char* dtype_name;
222 if constexpr (std::is_same_v<T, bool>) {
223 err = param_details::try_bool_(str, val);
225 }
else if constexpr (std::is_same_v<T, std::int64_t>) {
226 err = param_details::try_int64_(str, val);
227 dtype_name =
"int64_t";
228 }
else if constexpr (std::is_same_v<T, double>) {
229 err = param_details::try_double_(str, val);
230 dtype_name =
"double";
231 }
else if constexpr (std::is_same_v<T, std::string>) {
232 err = param_details::try_string_(str, val);
233 dtype_name =
"string";
234 }
else if constexpr (std::is_same_v<T, int>) {
235 err = param_details::try_int_(str, val);
238 static_assert(always_false<T>,
"template type can only be bool, int, std::int64_t, double, or std::string.");
242 if (err != param_details::TypeErr::none) {
243 if (is_type_check)
return {};
244 param_details::Report_TypeErr_(param, str, dtype_name, err);
247 if (not is_type_check) (keyvalue_pair->second).accessed =
true;
A class that provides map-like access to parameter files.
Definition ParameterMap.h:74
Definition ParameterMap.h:76