diff --git a/Src/Base/AMReX_Enum.H b/Src/Base/AMReX_Enum.H index 2bb503d4113..b94e30d396e 100644 --- a/Src/Base/AMReX_Enum.H +++ b/Src/Base/AMReX_Enum.H @@ -67,6 +67,26 @@ namespace amrex } } + template , + std::enable_if_t = 0> + T getEnumCaseInsensitive (std::string_view const& s) + { + auto const& kv = getEnumNameValuePairs(); + std::string ls = amrex::toLower(std::string(s)); + auto it = std::find_if(kv.begin(), kv.end(), + [&] (auto const& x) -> bool + { return amrex::toLower(x.first) == ls; }); + if (it != kv.end()) { + return it->second; + } else { + std::string error_msg("amrex::getEnumCaseInsensitive: Unknown enum: "); + error_msg.append(s).append(" in AMREX_ENUM(").append(ET::class_name) + .append(", ").append(ET::enum_names).append(")."); + throw std::runtime_error(error_msg); + return T(); + } + } + template , std::enable_if_t = 0> std::string getEnumNameString (T const& v) diff --git a/Src/Base/AMReX_ParmParse.H b/Src/Base/AMReX_ParmParse.H index 63c0c45431a..42e62a05ab3 100644 --- a/Src/Base/AMReX_ParmParse.H +++ b/Src/Base/AMReX_ParmParse.H @@ -1329,19 +1329,14 @@ public: std::string s; int exist = this->query(name, s, ival); if (exist) { - s = amrex::toLower(s); - auto const& enum_names = amrex::getEnumNameStrings(); - auto found = std::find_if(enum_names.begin(), enum_names.end(), - [&] (std::string const& ename) { - return amrex::toLower(ename) == s; - }); - if (found != enum_names.end()) { - ref = static_cast(std::distance(enum_names.begin(), found)); - } else { - std::string msg("query_enum_case_insensitive(\""); - msg.append(name).append("\",").append(amrex::getEnumClassName()) - .append("&) failed."); - throw std::runtime_error(msg); + try { + ref = amrex::getEnumCaseInsensitive(s); + } catch (...) { + if (amrex::Verbose() > 0) { + amrex::Print() << "amrex::ParmParse::query_enum_case_insensitive (input name: " + << this->prefixedName(name) << "):\n"; + } + throw; } } return exist; diff --git a/Tests/Enum/main.cpp b/Tests/Enum/main.cpp index 69ed91adc27..b0647836e49 100644 --- a/Tests/Enum/main.cpp +++ b/Tests/Enum/main.cpp @@ -129,6 +129,11 @@ int main (int argc, char* argv[]) AMREX_ALWAYS_ASSERT(amrex::getEnum("green") == MyColor2::green); AMREX_ALWAYS_ASSERT(amrex::getEnum("blue") == MyColor2::blue); AMREX_ALWAYS_ASSERT(amrex::getEnum("Default") == MyColor2::Default); + + auto my_blue = MyColor2::Default; + ParmParse pp; + pp.query_enum_case_insensitive("color5", my_blue); + AMREX_ALWAYS_ASSERT(my_blue == MyColor2::blue); } amrex::Finalize();