29 template <
typename T,
typename ET = amrex_enum_traits<T>>
31 std::vector<std::pair<std::string,T>> getNewEnumNameValuePairs ()
33 auto tmp =
amrex::split(std::string(ET::enum_names),
",");
34 std::vector<std::pair<std::string,T>> r;
35 r.reserve(tmp.size());
37 for (
auto const& item : tmp) {
40 r.emplace_back(
amrex::trim(kv[0]),
static_cast<T
>(next_value));
42 }
else if (kv.size() == 2) {
45 auto it = std::find_if(r.begin(), r.end(),
46 [&] (
auto const&
x) ->
bool
47 { return x.first == value_string; });
50 this_value = it->second;
53 auto s = value_string;
54 s.erase(std::remove(s.begin(), s.end(),
'\''), s.end());
56 this_value =
static_cast<T
>(std::stoi(s, &pos, 0));
59 if (s.find_first_not_of(
"uUlLzZ", pos) != std::string::npos) {
60 std::string error_msg(
"amrex::getEnumNameValuePairs: unsupported enumerator initializer `");
61 error_msg.append(value_string).append(
"` in AMREX_ENUM(")
62 .append(ET::class_name).append(
", ").append(ET::enum_names)
64 throw std::runtime_error(error_msg);
68 next_value =
static_cast<int>(this_value) + 1;
70 std::string error_msg(
"amrex::getEnumNameIntPairs: AMREX_ENUM(");
71 error_msg.append(ET::class_name).append(
", ").append(ET::enum_names)
73 throw std::runtime_error(error_msg);
89 template <
typename T,
typename ET = amrex_enum_traits<T>>
94 static auto r = detail::getNewEnumNameValuePairs<T>();
115 template <
typename T,
typename ET = amrex_enum_traits<T>>
119 auto const& kv = getEnumNameValuePairs<T>();
120 auto it = std::find_if(kv.begin(), kv.end(),
121 [&] (
auto const&
x) ->
bool
122 { return x.first == s; });
123 if (it != kv.end()) {
126 std::string error_msg(
"amrex::getEnum: Unknown enum: ");
127 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
128 .append(
", ").append(ET::enum_names).append(
").");
129 throw std::runtime_error(error_msg);
151 template <
typename T,
typename ET = amrex_enum_traits<T>>
155 auto const& kv = getEnumNameValuePairs<T>();
157 auto it = std::find_if(kv.begin(), kv.end(),
158 [&] (
auto const&
x) ->
bool
159 { return amrex::toLower(x.first) == ls; });
160 if (it != kv.end()) {
163 std::string error_msg(
"amrex::getEnumCaseInsensitive: Unknown enum: ");
164 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
165 .append(
", ").append(ET::enum_names).append(
").");
166 throw std::runtime_error(error_msg);
188 template <
typename T,
typename ET = amrex_enum_traits<T>>
192 auto const& kv = getEnumNameValuePairs<T>();
193 auto it = std::find_if(kv.begin(), kv.end(),
194 [&] (
auto const&
x) ->
bool
195 { return x.second == v; });
196 if (it != kv.end()) {
199 std::string error_msg(
"amrex::getEnumNameString: Unknown enum value: ");
200 error_msg.append(std::to_string(
static_cast<int>(v)))
201 .append(
" in AMREX_ENUM(").append(ET::class_name).append(
", ")
202 .append(ET::enum_names).append(
").");
203 throw std::runtime_error(error_msg);
204 return std::string();
214 template <
typename T,
typename ET = amrex_enum_traits<T>>
218 auto r =
amrex::split(std::string(ET::enum_names),
",");
220 auto found = s.find(
'=');
221 if (found != std::string::npos) {
235 template <
typename T,
typename ET = amrex_enum_traits<T>>
239 return std::string(ET::class_name);
248 template <
typename T,
typename ET = amrex_enum_traits<T>>
252 return static_cast<std::underlying_type_t<T>
>(v);
270#define AMREX_ENUM(CLASS, ...) \
271 enum class CLASS : int { __VA_ARGS__ }; \
273 struct CLASS##_EnumTraits { \
274 using enum_class_t = CLASS; \
275 static constexpr bool value = true; \
276 static constexpr std::string_view class_name{#CLASS}; \
277 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
280 CLASS##_EnumTraits amrex_get_enum_traits(CLASS)
282#define AMREX_ENUM_IN_CLASS(CLASS, ...) \
283 enum class CLASS : int { __VA_ARGS__ }; \
285 struct CLASS##_EnumTraits { \
286 using enum_class_t = CLASS; \
287 static constexpr bool value = true; \
288 static constexpr std::string_view class_name{#CLASS}; \
289 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
292 friend CLASS##_EnumTraits amrex_get_enum_traits(CLASS) { return {}; } \
293 static_assert(true, "")
decltype(amrex_get_enum_traits(std::declval< T >())) amrex_enum_traits
Definition AMReX_Enum.H:22
T getEnum(std::string_view const &s)
Convert a string to an enum value.
Definition AMReX_Enum.H:117
constexpr auto toUnderlying(T v) noexcept
Return the underlying integer value of an enum enumerator.
Definition AMReX_Enum.H:250
std::string getEnumClassName()
Return the class name string of an AMREX_ENUM-declared enum type.
Definition AMReX_Enum.H:237
std::string getEnumNameString(T const &v)
Get the name string of an enum value.
Definition AMReX_Enum.H:190
std::vector< std::string > getEnumNameStrings()
Return a list of all enumerator name strings for an AMREX_ENUM-declared type.
Definition AMReX_Enum.H:216
std::vector< std::pair< std::string, T > > const & getEnumNameValuePairs()
Return all (name, value) pairs for an AMREX_ENUM-declared enum type.
Definition AMReX_Enum.H:91
T getEnumCaseInsensitive(std::string_view const &s)
Convert a string case-insensitively to an enum value.
Definition AMReX_Enum.H:153
Definition AMReX_Amr.cpp:50
std::string trim(std::string s, std::string const &space)
Definition AMReX_String.cpp:26
std::string toLower(std::string s)
Converts all characters of the string into lower case based on std::locale.
Definition AMReX_String.cpp:12
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:44