32 #ifndef NEARGYE_MAGIC_ENUM_IOSTREAM_HPP
33 #define NEARGYE_MAGIC_ENUM_IOSTREAM_HPP
38 #ifndef MAGIC_ENUM_USE_STD_MODULE
44 namespace ostream_operators {
46 template <
typename Char,
typename Traits,
typename E, detail::enable_if_t<E,
int> = 0>
47 std::basic_ostream<Char, Traits>&
operator<<(std::basic_ostream<Char, Traits>& os, E
value) {
48 using D = std::decay_t<E>;
53 if (
const auto name = enum_flags_name<D>(
value); !name.empty()) {
54 for (
const auto c : name) {
60 if (
const auto name = enum_name<D>(
value); !name.empty()) {
61 for (
const auto c : name) {
68 return (os <<
static_cast<U
>(
value));
71 template <
typename Char,
typename Traits,
typename E, detail::enable_if_t<E,
int> = 0>
72 std::basic_ostream<Char, Traits>&
operator<<(std::basic_ostream<Char, Traits>& os, optional<E>
value) {
78 namespace istream_operators {
80 template <
typename Char,
typename Traits,
typename E, detail::enable_if_t<E,
int> = 0>
81 std::basic_istream<Char, Traits>&
operator>>(std::basic_istream<Char, Traits>& is, E&
value) {
82 using D = std::decay_t<E>;
84 std::basic_string<Char, Traits> s;
88 if (
const auto v = enum_flags_cast<D>(s)) {
91 is.setstate(std::basic_ios<Char>::failbit);
94 if (
const auto v = enum_cast<D>(s)) {
97 is.setstate(std::basic_ios<Char>::failbit);
101 is.setstate(std::basic_ios<Char>::failbit);
108 namespace iostream_operators {
110 using magic_enum::ostream_operators::operator<<;
111 using magic_enum::istream_operators::operator>>;
117 #endif // NEARGYE_MAGIC_ENUM_IOSTREAM_HPP