3535#include " magic_enum.hpp"
3636#include " magic_enum_flags.hpp"
3737
38- #if !defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT)
39- # define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT 1
40- # define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
41- #endif
42-
43- namespace magic_enum ::customize {
44- // customize enum to enable/disable automatic std::format
45- template <typename E>
46- constexpr bool enum_format_enabled () noexcept {
47- return MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT;
38+ template <typename E, std::enable_if_t <std::is_enum_v<std::decay_t <E>>, int > = 0 >
39+ std::string format_as (E e) {
40+ using D = std::decay_t <E>;
41+
42+ if constexpr (magic_enum::detail::supported<D>::value) {
43+ if constexpr (magic_enum::detail::subtype_v<D> == magic_enum::detail::enum_subtype::flags) {
44+ if (const auto name = magic_enum::enum_flags_name<D>(e); !name.empty ()) {
45+ return {name.data (), name.size ()};
46+ }
47+ } else {
48+ if (const auto name = magic_enum::enum_name<D>(e); !name.empty ()) {
49+ return {name.data (), name.size ()};
50+ }
51+ }
4852 }
49- } // magic_enum::customize
53+ return std::to_string (magic_enum::enum_integer<D>(e));
54+ }
5055
5156#if defined(__cpp_lib_format)
5257
@@ -55,60 +60,13 @@ namespace magic_enum::customize {
5560#endif
5661
5762template <typename E>
58- struct std ::formatter<E, std::enable_if_t <std::is_enum_v<std::decay_t <E>> && magic_enum::customize::enum_format_enabled<E>() , char >> : std::formatter<std::string_view, char > {
63+ struct std ::formatter<E, std::enable_if_t <std::is_enum_v<std::decay_t <E>>, char >> : std::formatter<std::string_view, char > {
5964 template <class FormatContext >
6065 auto format (E e, FormatContext& ctx) const {
61- static_assert (std::is_same_v<char , string_view::value_type>, " formatter requires string_view::value_type type same as char." );
62- using D = std::decay_t <E>;
63-
64- if constexpr (magic_enum::detail::supported<D>::value) {
65- if constexpr (magic_enum::detail::subtype_v<D> == magic_enum::detail::enum_subtype::flags) {
66- if (const auto name = magic_enum::enum_flags_name<D>(e); !name.empty ()) {
67- return formatter<std::string_view, char >::format (std::string_view{name.data (), name.size ()}, ctx);
68- }
69- } else {
70- if (const auto name = magic_enum::enum_name<D>(e); !name.empty ()) {
71- return formatter<std::string_view, char >::format (std::string_view{name.data (), name.size ()}, ctx);
72- }
73- }
74- }
75- return formatter<std::string_view, char >::format (std::to_string (magic_enum::enum_integer<D>(e)), ctx);
66+ return formatter<std::string_view, char >::format (format_as<E>(e), ctx);
7667 }
7768};
7869
7970#endif
8071
81- #if defined(FMT_VERSION)
82-
83- #include < fmt/format.h>
84-
85- template <typename E>
86- struct fmt ::formatter<E, std::enable_if_t <std::is_enum_v<std::decay_t <E>> && magic_enum::customize::enum_format_enabled<E>(), char >> : fmt::formatter<std::string_view> {
87- template <class FormatContext >
88- auto format (E e, FormatContext& ctx) const {
89- static_assert (std::is_same_v<char , string_view::value_type>, " formatter requires string_view::value_type type same as char." );
90- using D = std::decay_t <E>;
91-
92- if constexpr (magic_enum::detail::supported<D>::value) {
93- if constexpr (magic_enum::detail::subtype_v<D> == magic_enum::detail::enum_subtype::flags) {
94- if (const auto name = magic_enum::enum_flags_name<D>(e); !name.empty ()) {
95- return formatter<std::string_view, char >::format (std::string_view{name.data (), name.size ()}, ctx);
96- }
97- } else {
98- if (const auto name = magic_enum::enum_name<D>(e); !name.empty ()) {
99- return formatter<std::string_view, char >::format (std::string_view{name.data (), name.size ()}, ctx);
100- }
101- }
102- }
103- return formatter<std::string_view, char >::format (std::to_string (magic_enum::enum_integer<D>(e)), ctx);
104- }
105- };
106-
107- #endif
108-
109- #if defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE)
110- # undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
111- # undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
112- #endif
113-
11472#endif // NEARGYE_MAGIC_ENUM_FORMAT_HPP
0 commit comments