22 template <
typename T,
typename ET = amrex_enum_traits<T>,
23 std::enable_if_t<ET::value,
int> = 0>
26 auto tmp =
amrex::split(std::string(ET::enum_names),
",");
27 std::vector<std::pair<std::string,T>>
r;
28 r.reserve(tmp.size());
30 for (
auto const& item : tmp) {
33 r.emplace_back(
amrex::trim(kv[0]),
static_cast<T
>(next_value));
35 }
else if (kv.size() == 2) {
38 auto it = std::find_if(
r.begin(),
r.end(),
39 [&] (
auto const&
x) ->
bool
40 { return x.first == value_string; });
43 this_value = it->second;
48 this_value =
static_cast<T
>(std::stoi(value_string));
51 next_value =
static_cast<int>(this_value) + 1;
53 std::string error_msg(
"amrex::getEnumNameIntPairs: AMREX_ENUM(");
54 error_msg.append(ET::class_name).append(
", ").append(ET::enum_names)
56 throw std::runtime_error(error_msg);
63 template <
typename T,
typename ET = amrex_enum_traits<T>,
64 std::enable_if_t<ET::value,
int> = 0>
68 static auto r = detail::getNewEnumNameValuePairs<T>();
85 template <
typename T,
typename ET = amrex_enum_traits<T>,
86 std::enable_if_t<ET::value,
int> = 0>
89 auto const& kv = getEnumNameValuePairs<T>();
90 auto it = std::find_if(kv.begin(), kv.end(),
91 [&] (
auto const&
x) ->
bool
92 { return x.first == s; });
96 std::string error_msg(
"amrex::getEnum: Unknown enum: ");
97 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
98 .append(
", ").append(ET::enum_names).append(
").");
99 throw std::runtime_error(error_msg);
119 template <
typename T,
typename ET = amrex_enum_traits<T>,
120 std::enable_if_t<ET::value,
int> = 0>
123 auto const& kv = getEnumNameValuePairs<T>();
125 auto it = std::find_if(kv.begin(), kv.end(),
126 [&] (
auto const&
x) ->
bool
127 { return amrex::toLower(x.first) == ls; });
128 if (it != kv.end()) {
131 std::string error_msg(
"amrex::getEnumCaseInsensitive: Unknown enum: ");
132 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
133 .append(
", ").append(ET::enum_names).append(
").");
134 throw std::runtime_error(error_msg);
152 template <
typename T,
typename ET = amrex_enum_traits<T>,
153 std::enable_if_t<ET::value,
int> = 0>
156 auto const& kv = getEnumNameValuePairs<T>();
157 auto it = std::find_if(kv.begin(), kv.end(),
158 [&] (
auto const&
x) ->
bool
159 { return x.second == v; });
160 if (it != kv.end()) {
163 std::string error_msg(
"amrex::getEnum: Unknown enum value: ");
164 error_msg.append(std::to_string(
static_cast<int>(v)))
165 .append(
" in AMREX_ENUM(").append(ET::class_name).append(
", ")
166 .append(ET::enum_names).append(
").");
167 throw std::runtime_error(error_msg);
168 return std::string();
172 template <
typename T,
typename ET = amrex_enum_traits<T>,
173 std::enable_if_t<ET::value,
int> = 0>
178 auto found = s.find(
'=');
179 if (found != std::string::npos) {
187 template <
typename T,
typename ET = amrex_enum_traits<T>,
188 std::enable_if_t<ET::value,
int> = 0>
191 return std::string(ET::class_name);
198 template <
typename T,
typename ET = amrex_enum_traits<T>,
199 std::enable_if_t<ET::value,
int> = 0>
202 return static_cast<std::underlying_type_t<T>
>(v);
206#define AMREX_ENUM(CLASS, ...) \
207 enum class CLASS : int { __VA_ARGS__ }; \
208 struct CLASS##_EnumTraits { \
209 using enum_class_t = CLASS; \
210 static constexpr bool value = true; \
211 static constexpr std::string_view class_name{#CLASS}; \
212 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
214 CLASS##_EnumTraits amrex_get_enum_traits(CLASS)
decltype(amrex_get_enum_traits(std::declval< T >())) amrex_enum_traits
Definition AMReX_Enum.H:16
std::vector< std::pair< std::string, T > > getNewEnumNameValuePairs()
Definition AMReX_Enum.H:24
Definition AMReX_Amr.cpp:49
std::string getEnumClassName()
Definition AMReX_Enum.H:189
std::string getEnumNameString(T const &v)
Definition AMReX_Enum.H:154
std::string trim(std::string s, std::string const &space)
Definition AMReX_String.cpp:25
std::string toLower(std::string s)
Converts all characters of the string into lower case based on std::locale.
Definition AMReX_String.cpp:11
T getEnum(std::string_view const &s)
Definition AMReX_Enum.H:87
std::vector< std::pair< std::string, T > > const & getEnumNameValuePairs()
Definition AMReX_Enum.H:65
T getEnumCaseInsensitive(std::string_view const &s)
Definition AMReX_Enum.H:121
std::vector< std::string > getEnumNameStrings()
Definition AMReX_Enum.H:174
std::vector< std::string > split(std::string const &s, std::string const &sep)
Split a string using given tokens in sep.
Definition AMReX_String.cpp:42
constexpr auto toUnderlying(T v) noexcept
Definition AMReX_Enum.H:200
Definition AMReX_FabArrayCommI.H:1000