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;
50 this_value =
static_cast<T
>(std::stoi(value_string,
nullptr, 0));
53 next_value =
static_cast<int>(this_value) + 1;
55 std::string error_msg(
"amrex::getEnumNameIntPairs: AMREX_ENUM(");
56 error_msg.append(ET::class_name).append(
", ").append(ET::enum_names)
58 throw std::runtime_error(error_msg);
66 template <
typename T,
typename ET = amrex_enum_traits<T>,
67 std::enable_if_t<ET::value,
int> = 0>
71 static auto r = detail::getNewEnumNameValuePairs<T>();
88 template <
typename T,
typename ET = amrex_enum_traits<T>,
89 std::enable_if_t<ET::value,
int> = 0>
92 auto const& kv = getEnumNameValuePairs<T>();
93 auto it = std::find_if(kv.begin(), kv.end(),
94 [&] (
auto const&
x) ->
bool
95 { return x.first == s; });
99 std::string error_msg(
"amrex::getEnum: Unknown enum: ");
100 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
101 .append(
", ").append(ET::enum_names).append(
").");
102 throw std::runtime_error(error_msg);
122 template <
typename T,
typename ET = amrex_enum_traits<T>,
123 std::enable_if_t<ET::value,
int> = 0>
126 auto const& kv = getEnumNameValuePairs<T>();
128 auto it = std::find_if(kv.begin(), kv.end(),
129 [&] (
auto const&
x) ->
bool
130 { return amrex::toLower(x.first) == ls; });
131 if (it != kv.end()) {
134 std::string error_msg(
"amrex::getEnumCaseInsensitive: Unknown enum: ");
135 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
136 .append(
", ").append(ET::enum_names).append(
").");
137 throw std::runtime_error(error_msg);
155 template <
typename T,
typename ET = amrex_enum_traits<T>,
156 std::enable_if_t<ET::value,
int> = 0>
159 auto const& kv = getEnumNameValuePairs<T>();
160 auto it = std::find_if(kv.begin(), kv.end(),
161 [&] (
auto const&
x) ->
bool
162 { return x.second == v; });
163 if (it != kv.end()) {
166 std::string error_msg(
"amrex::getEnum: Unknown enum value: ");
167 error_msg.append(std::to_string(
static_cast<int>(v)))
168 .append(
" in AMREX_ENUM(").append(ET::class_name).append(
", ")
169 .append(ET::enum_names).append(
").");
170 throw std::runtime_error(error_msg);
171 return std::string();
175 template <
typename T,
typename ET = amrex_enum_traits<T>,
176 std::enable_if_t<ET::value,
int> = 0>
179 auto r =
amrex::split(std::string(ET::enum_names),
",");
181 auto found = s.find(
'=');
182 if (found != std::string::npos) {
190 template <
typename T,
typename ET = amrex_enum_traits<T>,
191 std::enable_if_t<ET::value,
int> = 0>
194 return std::string(ET::class_name);
201 template <
typename T,
typename ET = amrex_enum_traits<T>,
202 std::enable_if_t<ET::value,
int> = 0>
205 return static_cast<std::underlying_type_t<T>
>(v);
209#define AMREX_ENUM(CLASS, ...) \
210 enum class CLASS : int { __VA_ARGS__ }; \
212 struct CLASS##_EnumTraits { \
213 using enum_class_t = CLASS; \
214 static constexpr bool value = true; \
215 static constexpr std::string_view class_name{#CLASS}; \
216 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
219 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:192
std::string getEnumNameString(T const &v)
Definition AMReX_Enum.H:157
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:90
std::vector< std::pair< std::string, T > > const & getEnumNameValuePairs()
Definition AMReX_Enum.H:68
T getEnumCaseInsensitive(std::string_view const &s)
Definition AMReX_Enum.H:124
std::vector< std::string > getEnumNameStrings()
Definition AMReX_Enum.H:177
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:203