30 #ifndef BASE_STL_HELPERS_OSTREAM_HELPERS_HH
31 #define BASE_STL_HELPERS_OSTREAM_HELPERS_HH
39 #include "magic_enum/magic_enum.hh"
44 namespace opExtract_impl
64 std::enable_if_t<std::is_enum_v<E>,
68 return os << magic_enum::enum_name(
e);
71 template <
typename... T>
75 std::apply([&](
auto&&...
e) {
84 template <
typename T,
typename U>
92 std::enable_if_t<is_iterable_v<T>, std::ostream&>
102 template <
typename T>
113 template <
typename T>
117 template <
typename T>
124 template <
typename T>
131 template <
typename,
typename =
void>
134 template <
typename T>
136 std::void_t<decltype(
137 std::declval<std::ostream&>() << std::declval<T>())>> =
true;
139 template <
typename,
typename =
void>
142 template <
typename T>
144 std::void_t<decltype(
146 std::declval<T>()))>>
149 template <
typename T>
151 isOpExtractHelped<T> && !isOpExtractNativelySupported<T>;
153 template <
typename T>
158 return os <<
"nullptr";
160 if constexpr (isOpExtractHelped<T> || isOpExtractNativelySupported<T>) {
161 os <<
'(' <<
p <<
": ";
173 if constexpr (needsDispatch<T>) {
184 std::enable_if_t<opExtract_impl::needsDispatch<T>, std::ostream&>
192 #endif // BASE_STL_HELPERS_OSTREAM_HELPERS_HH