6#pragma push_macro("_LIBCPP_REMOVE_TRANSITIVE_INCLUDES")
7#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
8#define _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
20#include <initializer_list>
23#if defined(ZEROERR_ENABLE_PFR) && (ZEROERR_CXX_STANDARD >= 14)
27#if defined(ZEROERR_ENABLE_MAGIC_ENUM) && (ZEROERR_CXX_STANDARD >= 17)
28#include "magic_enum.hpp"
31#if defined(ZEROERR_ENABLE_DSVIZ)
53template <
typename T,
typename =
void>
75 template <
typename... Args>
78 call(std::forward<Args>(args)...);
84 call(std::forward<
decltype(value)>(value));
92 template <
typename T,
typename... V>
93 void call(T&& value, V&&... others) {
95 call(std::forward<V>(others)...);
109 template <
class Stream>
127 return demangle(
typeid(t).name());
130#if defined(ZEROERR_ENABLE_MAGIC_ENUM) && (ZEROERR_CXX_STANDARD >= 17)
139 os << tab(
level) <<
"<unprintable enum " <<
type(value) <<
">" <<
lb;
148 !std::is_function<
typename std::remove_pointer<T>::type>::value)
150 if (value ==
nullptr)
153 os << tab(
level) <<
"<" <<
type(value) <<
" at " <<
static_cast<const void*
>(value) <<
">" <<
lb;
157 std::is_function<
typename std::remove_pointer<T>::type>::value)
159 if (value ==
nullptr)
163 <<
reinterpret_cast<const void*
>(value) <<
">" <<
lb;
166 template <
class R,
class... Args>
167 void print(
const std::function<R(Args...)>& value,
unsigned level,
const char*
lb, rank<3>) {
171 os << tab(
level) <<
"<" <<
type(value) <<
" holding "
172 << demangle(value.target_type().name()) <<
">" <<
lb;
178 template <
typename T, std::
size_t N>
190 print(
const T& value,
unsigned level,
const char*
lb, rank<1>) {
191 os << tab(
level) <<
'\'' << value <<
'\'' <<
lb;
194#if defined(ZEROERR_ENABLE_PFR) && (ZEROERR_CXX_STANDARD >= 14)
195 template <
class StructType,
unsigned... I>
196 void print_struct(
const StructType& s,
unsigned,
const char*, detail::seq<I...>) {
197 int _[] = {(
os << (I == 0 ?
"" :
", ") << pfr::get<I>(s), 0)...};
202 print(
const T& value,
unsigned level,
const char*
lb, rank<1>) {
205 detail::gen_seq<pfr::tuple_size<T>::value>{});
211 print(
const T& value,
unsigned level,
const char*
lb, rank<2>) {
212 os << tab(
level) << (value ?
"true" :
"false") <<
lb;
220 print(
const T& value,
unsigned level,
const char*
lb, rank<2>) {
223 for (
auto iter = value.begin(); iter != value.end(); ++iter) {
226 if (next == value.end()) last =
true;
233 print(
const T& value,
unsigned level,
const char*
lb, rank<3>) {
236 for (
auto iter = value.begin(); iter != value.end(); ++iter) {
239 if (next == value.end()) last =
true;
247 print(
const T& value,
unsigned level,
const char*
lb, rank<3>) {
248 if (value.get() ==
nullptr)
251 os << tab(
level) <<
"<" <<
type(value) <<
" at " <<
static_cast<const void*
>(value.get()) <<
">" <<
lb;
256 print(
const T& value,
unsigned level,
const char*
lb, rank<4>) {
259 for (
auto iter = value.begin(); iter != value.end(); ++iter) {
262 if (next == value.end()) last =
true;
263 print((*iter).first,
level + 1,
" : ", rank<max_rank>{});
271 print(
const T& value,
unsigned level,
const char*
lb, rank<4>) {
272 const auto locked = value.lock();
277 print(
const T& value,
unsigned level,
const char*
lb, rank<4>) {
278 os << tab(
level) <<
"(" << value.real() <<
"+" << value.imag() <<
"i)" <<
lb;
282 print(
const T& value,
unsigned level,
const char*
lb, rank<4>) {
284 write_string(value,
typename detail::is_string_like<T>::type{});
289 void write_string(
const T& value, std::true_type) {
290 if (value.size() != 0)
291 os.
write(value.data(),
static_cast<std::size_t
>(value.size()));
294 void write_string(
const T& value, std::false_type) {
295 const char* text = value;
296 os << (text ? text :
"nullptr");
299 template <
class TupType>
300 inline void print_tuple(
const TupType&,
unsigned,
const char*, detail::seq<>) {}
302 template <
class TupType,
unsigned... I>
303 inline void print_tuple(
const TupType& _tup,
unsigned level,
const char*, detail::seq<I...>) {
304 int _[] = {(
os << (I == 0 ?
"" :
", "),
305 print(detail::tuple_get<I>(_tup),
level + 1,
"", rank<max_rank>{}), 0)...};
310 print(
const T& value,
unsigned level,
const char*
lb, rank<3>) {
316 void print_text(
const char* value) {
os << value; }
317 template <
class T>
void print_text(
const T& value) {
os.
write(value.data(), value.size()); }
319 const char* quote() {
return isQuoted ?
"\"" :
""; }
325 template <class T, typename std::enable_if<detail::StringLike<T>::owning &&
326 !std::is_same<T, String>::value,
int>
::type = 0>
327 operator T()
const {
return str(); }
342 printer.
call(*
static_cast<T*
>(
const_cast<void*
>(value)));
347 return {
const_cast<const void*
>(
static_cast<const volatile void*
>(std::addressof(value))),
348 &printDiagnosticValue<T>};
382#pragma pop_macro("_LIBCPP_REMOVE_TRANSITIVE_INCLUDES")
void clear()
Definition buffer.h:35
void attach(Stream &stream)
Definition buffer.h:18
StringBuffer & write(const char *data, std::size_t size)
Definition buffer.cpp:5
void flush()
Definition buffer.cpp:12
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_POP
Definition config.h:283
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_PUSH
Definition config.h:235
void printDiagnosticValue(Printer &printer, const void *value)
Definition print.h:341
void_t< decltype(zeroerr::PrinterExt(std::declval< zeroerr::Printer & >(), std::declval< T & >(), 0, nullptr, zeroerr::rank< zeroerr::max_rank >()))> has_printer_ext
Definition print.h:59
void void_t
Definition typetraits.h:55
DiagnosticValue makeDiagnosticValue(T &value)
Definition print.h:346
Definition assert_text.cpp:5
StringBuffer & operator<<(StringBuffer &buffer, const Printer &printer)
Definition print.h:331
Printer & getStderrPrinter()
Definition print.cpp:14
void PrinterExt(Printer &, const T &, unsigned, const char *, rank< 0 >)
PrinterExt is an extension of Printer that allows user to write custom rules for printing.
Definition print.h:370
Printer & getStdoutPrinter()
Definition print.cpp:9
constexpr unsigned max_rank
Definition print.h:41
A functor class Printer for printing a value of any type.
Definition print.h:74
Printer()
Definition print.h:108
int indent
Definition print.h:119
print(const T &value, unsigned level, const char *lb, rank< 0 >)
Definition print.h:135
bool clear_stream_before_printing
Definition print.h:123
unsigned const char * lb
Definition print.h:149
Printer & operator()(Args &&... args)
Definition print.h:76
Printer(const Printer &other)
Definition print.h:111
StringBuffer & os
Definition print.h:121
bool isColorful
Definition print.h:116
unsigned const char rank< 0 >
Definition print.h:149
bool isQuoted
Definition print.h:118
void call(T &&value, V &&... others)
Definition print.h:93
static zeroerr::String type(const T &t)
Definition print.h:126
bool isCompact
Definition print.h:117
Printer(Stream &stream)
Definition print.h:110
Printer & operator()(std::initializer_list< T > &&value)
Definition print.h:82
void call(T &&value)
Definition print.h:99
void check_stream()
Definition print.h:88
ZEROERR_ENABLE_IF(ZEROERR_IS_POINTER &&!std::is_function< typename std::remove_pointer< T >::type >::value) print(const T &value
bool use_stringstream
Definition print.h:122
const char * line_break
Definition print.h:120
unsigned level
Definition print.h:149
has_extension is a type trait to check if user defined PrinterExt for a type
Definition print.h:54
Definition typetraits.h:97
rank is a helper class for Printer to define the priority of overloaded functions.
Definition typetraits.h:43
#define last
Definition table.cpp:255
#define ZEROERR_IS_MAP
Definition typetraits.h:351
#define ZEROERR_IS_ENUM
Definition typetraits.h:339
#define ZEROERR_IS_CONTAINER
Definition typetraits.h:340
#define ZEROERR_IS_POD
Definition typetraits.h:352
#define ZEROERR_IS_FLOAT
Definition typetraits.h:338
#define ZEROERR_IS_INT
Definition typetraits.h:337
#define ZEROERR_IS_POINTER
Definition typetraits.h:342
#define ZEROERR_IS_CLASS
Definition typetraits.h:345
#define ZEROERR_IS_STREAMABLE
Definition typetraits.h:346
#define ZEROERR_IS_CHAR
Definition typetraits.h:343
#define ZEROERR_IS_WCHAR
Definition typetraits.h:344
#define ZEROERR_IS_STRING
Definition typetraits.h:341
#define ZEROERR_IS_AUTOPTR
Definition typetraits.h:350
#define ZEROERR_IS_COMPLEX
Definition typetraits.h:348
#define ZEROERR_IS_BOOL
Definition typetraits.h:349
#define ZEROERR_ENABLE_IF(x)
Definition typetraits.h:334
#define ZEROERR_IS_ARRAY
Definition typetraits.h:347