23 template <
typename T,
typename ET = amrex_enum_traits<T>,
24 std::enable_if_t<ET::value,
int> = 0>
25 std::vector<std::pair<std::string,T>> getNewEnumNameValuePairs ()
27 auto tmp =
amrex::split(std::string(ET::enum_names),
",");
28 std::vector<std::pair<std::string,T>> r;
29 r.reserve(tmp.size());
31 for (
auto const& item : tmp) {
34 r.emplace_back(
amrex::trim(kv[0]),
static_cast<T
>(next_value));
36 }
else if (kv.size() == 2) {
39 auto it = std::find_if(r.begin(), r.end(),
40 [&] (
auto const& x) ->
bool
41 { return x.first == value_string; });
44 this_value = it->second;
49 this_value =
static_cast<T
>(std::stoi(value_string));
52 next_value =
static_cast<int>(this_value) + 1;
54 std::string error_msg(
"amrex::getEnumNameIntPairs: AMREX_ENUM(");
55 error_msg.append(ET::class_name).append(
", ").append(ET::enum_names)
57 throw std::runtime_error(error_msg);
65 template <
typename T,
typename ET = amrex_enum_traits<T>,
66 std::enable_if_t<ET::value,
int> = 0>
70 static auto r = detail::getNewEnumNameValuePairs<T>();
87 template <
typename T,
typename ET = amrex_enum_traits<T>,
88 std::enable_if_t<ET::value,
int> = 0>
91 auto const& kv = getEnumNameValuePairs<T>();
92 auto it = std::find_if(kv.begin(), kv.end(),
93 [&] (
auto const&
x) ->
bool
94 { return x.first == s; });
98 std::string error_msg(
"amrex::getEnum: Unknown enum: ");
99 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
100 .append(
", ").append(ET::enum_names).append(
").");
101 throw std::runtime_error(error_msg);
121 template <
typename T,
typename ET = amrex_enum_traits<T>,
122 std::enable_if_t<ET::value,
int> = 0>
125 auto const& kv = getEnumNameValuePairs<T>();
127 auto it = std::find_if(kv.begin(), kv.end(),
128 [&] (
auto const&
x) ->
bool
129 { return amrex::toLower(x.first) == ls; });
130 if (it != kv.end()) {
133 std::string error_msg(
"amrex::getEnumCaseInsensitive: Unknown enum: ");
134 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
135 .append(
", ").append(ET::enum_names).append(
").");
136 throw std::runtime_error(error_msg);
154 template <
typename T,
typename ET = amrex_enum_traits<T>,
155 std::enable_if_t<ET::value,
int> = 0>
158 auto const& kv = getEnumNameValuePairs<T>();
159 auto it = std::find_if(kv.begin(), kv.end(),
160 [&] (
auto const&
x) ->
bool
161 { return x.second == v; });
162 if (it != kv.end()) {
165 std::string error_msg(
"amrex::getEnum: Unknown enum value: ");
166 error_msg.append(std::to_string(
static_cast<int>(v)))
167 .append(
" in AMREX_ENUM(").append(ET::class_name).append(
", ")
168 .append(ET::enum_names).append(
").");
169 throw std::runtime_error(error_msg);
170 return std::string();
174 template <
typename T,
typename ET = amrex_enum_traits<T>,
175 std::enable_if_t<ET::value,
int> = 0>
178 auto r =
amrex::split(std::string(ET::enum_names),
",");
180 auto found = s.find(
'=');
181 if (found != std::string::npos) {
189 template <
typename T,
typename ET = amrex_enum_traits<T>,
190 std::enable_if_t<ET::value,
int> = 0>
193 return std::string(ET::class_name);
200 template <
typename T,
typename ET = amrex_enum_traits<T>,
201 std::enable_if_t<ET::value,
int> = 0>
204 return static_cast<std::underlying_type_t<T>
>(v);
208#define AMREX_ENUM(CLASS, ...) \
209 enum class CLASS : int { __VA_ARGS__ }; \
211 struct CLASS##_EnumTraits { \
212 using enum_class_t = CLASS; \
213 static constexpr bool value = true; \
214 static constexpr std::string_view class_name{#CLASS}; \
215 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
218 CLASS##_EnumTraits amrex_get_enum_traits(CLASS)
decltype(amrex_get_enum_traits(std::declval< T >())) amrex_enum_traits
Definition AMReX_Enum.H:16
Definition AMReX_Amr.cpp:49
std::string getEnumClassName()
Definition AMReX_Enum.H:191
std::string getEnumNameString(T const &v)
Definition AMReX_Enum.H:156
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:89
std::vector< std::pair< std::string, T > > const & getEnumNameValuePairs()
Definition AMReX_Enum.H:67
T getEnumCaseInsensitive(std::string_view const &s)
Definition AMReX_Enum.H:123
std::vector< std::string > getEnumNameStrings()
Definition AMReX_Enum.H:176
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:202