diff --git a/utils/enum_option.hh b/utils/enum_option.hh index 1ca5902a92..3fb6e965dc 100644 --- a/utils/enum_option.hh +++ b/utils/enum_option.hh @@ -12,9 +12,10 @@ #pragma once #include -#include +#include #include #include +#include template concept HasMapInterface = requires(T t) { @@ -105,13 +106,27 @@ class enum_option { } // For various printers and formatters: - friend std::ostream& operator<<(std::ostream& s, const enum_option& opt) { + friend fmt::formatter>; +}; + +template +struct fmt::formatter> { + constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } + auto format(const enum_option& opt, fmt::format_context& ctx) const { auto found = find_if(opt._map.cbegin(), opt._map.cend(), - [&opt](const typename map_t::value_type& e) { return e.second == opt._value; }); + [&opt](const auto& e) { + return e.second == opt._value; + }); if (found == opt._map.cend()) { - return s << "?unknown"; + return fmt::format_to(ctx.out(), "?unknown"); } else { - return s << found->first; + return fmt::format_to(ctx.out(), "{}", found->first); } } }; + +template +std::ostream& operator<<(std::ostream& s, const enum_option& opt) { + fmt::print(s, "{}", opt); + return s; +}