28 template <
typename T,
typename ET = amrex_enum_traits<T>>
30 std::vector<std::pair<std::string,T>> getNewEnumNameValuePairs ()
32 auto tmp =
amrex::split(std::string(ET::enum_names),
",");
33 std::vector<std::pair<std::string,T>> r;
34 r.reserve(tmp.size());
36 for (
auto const& item : tmp) {
39 r.emplace_back(
amrex::trim(kv[0]),
static_cast<T
>(next_value));
41 }
else if (kv.size() == 2) {
44 auto it = std::find_if(r.begin(), r.end(),
45 [&] (
auto const&
x) ->
bool
46 { return x.first == value_string; });
49 this_value = it->second;
55 this_value =
static_cast<T
>(std::stoi(value_string,
nullptr, 0));
58 next_value =
static_cast<int>(this_value) + 1;
60 std::string error_msg(
"amrex::getEnumNameIntPairs: AMREX_ENUM(");
61 error_msg.append(ET::class_name).append(
", ").append(ET::enum_names)
63 throw std::runtime_error(error_msg);
79 template <
typename T,
typename ET = amrex_enum_traits<T>>
84 static auto r = detail::getNewEnumNameValuePairs<T>();
105 template <
typename T,
typename ET = amrex_enum_traits<T>>
109 auto const& kv = getEnumNameValuePairs<T>();
110 auto it = std::find_if(kv.begin(), kv.end(),
111 [&] (
auto const&
x) ->
bool
112 { return x.first == s; });
113 if (it != kv.end()) {
116 std::string error_msg(
"amrex::getEnum: Unknown enum: ");
117 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
118 .append(
", ").append(ET::enum_names).append(
").");
119 throw std::runtime_error(error_msg);
141 template <
typename T,
typename ET = amrex_enum_traits<T>>
145 auto const& kv = getEnumNameValuePairs<T>();
147 auto it = std::find_if(kv.begin(), kv.end(),
148 [&] (
auto const&
x) ->
bool
149 { return amrex::toLower(x.first) == ls; });
150 if (it != kv.end()) {
153 std::string error_msg(
"amrex::getEnumCaseInsensitive: Unknown enum: ");
154 error_msg.append(s).append(
" in AMREX_ENUM(").append(ET::class_name)
155 .append(
", ").append(ET::enum_names).append(
").");
156 throw std::runtime_error(error_msg);
178 template <
typename T,
typename ET = amrex_enum_traits<T>>
182 auto const& kv = getEnumNameValuePairs<T>();
183 auto it = std::find_if(kv.begin(), kv.end(),
184 [&] (
auto const&
x) ->
bool
185 { return x.second == v; });
186 if (it != kv.end()) {
189 std::string error_msg(
"amrex::getEnumNameString: Unknown enum value: ");
190 error_msg.append(std::to_string(
static_cast<int>(v)))
191 .append(
" in AMREX_ENUM(").append(ET::class_name).append(
", ")
192 .append(ET::enum_names).append(
").");
193 throw std::runtime_error(error_msg);
194 return std::string();
204 template <
typename T,
typename ET = amrex_enum_traits<T>>
208 auto r =
amrex::split(std::string(ET::enum_names),
",");
210 auto found = s.find(
'=');
211 if (found != std::string::npos) {
225 template <
typename T,
typename ET = amrex_enum_traits<T>>
229 return std::string(ET::class_name);
238 template <
typename T,
typename ET = amrex_enum_traits<T>>
242 return static_cast<std::underlying_type_t<T>
>(v);
260#define AMREX_ENUM(CLASS, ...) \
261 enum class CLASS : int { __VA_ARGS__ }; \
263 struct CLASS##_EnumTraits { \
264 using enum_class_t = CLASS; \
265 static constexpr bool value = true; \
266 static constexpr std::string_view class_name{#CLASS}; \
267 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
270 CLASS##_EnumTraits amrex_get_enum_traits(CLASS)
272#define AMREX_ENUM_IN_CLASS(CLASS, ...) \
273 enum class CLASS : int { __VA_ARGS__ }; \
275 struct CLASS##_EnumTraits { \
276 using enum_class_t = CLASS; \
277 static constexpr bool value = true; \
278 static constexpr std::string_view class_name{#CLASS}; \
279 static constexpr std::string_view enum_names{#__VA_ARGS__}; \
282 friend CLASS##_EnumTraits amrex_get_enum_traits(CLASS) { return {}; } \
283 static_assert(true, "")
decltype(amrex_get_enum_traits(std::declval< T >())) amrex_enum_traits
Definition AMReX_Enum.H:21
T getEnum(std::string_view const &s)
Convert a string to an enum value.
Definition AMReX_Enum.H:107
constexpr auto toUnderlying(T v) noexcept
Return the underlying integer value of an enum enumerator.
Definition AMReX_Enum.H:240
std::string getEnumClassName()
Return the class name string of an AMREX_ENUM-declared enum type.
Definition AMReX_Enum.H:227
std::string getEnumNameString(T const &v)
Get the name string of an enum value.
Definition AMReX_Enum.H:180
std::vector< std::string > getEnumNameStrings()
Return a list of all enumerator name strings for an AMREX_ENUM-declared type.
Definition AMReX_Enum.H:206
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:81
T getEnumCaseInsensitive(std::string_view const &s)
Convert a string case-insensitively to an enum value.
Definition AMReX_Enum.H:143
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