17#define DC_TRAIT_DEBUGABLE(SELF) \
18 DC_REQUIRE_METHOD(void, SELF, debug, (SELF const*, dc_debug_fmt fmt, FILE*));
20#define NO_DEBUG PRIV(no_debug)
25 fprintf(
stream,
"(no debug provided)");
28#define _DC_DERIVE_DEBUG_MEMBER(MEMBER_TYPE, MEMBER_NAME) \
29 dc_debug_fmt_print(fmt, stream, STRINGIFY(MEMBER_NAME) ": "); \
30 NS(MEMBER_TYPE, debug)(&self->MEMBER_NAME, fmt, stream); \
31 fprintf(fmt, stream, ",\n");
33#define DC_DERIVE_DEBUG(TYPE) \
34 static TYPE NS(TYPE, DEBUG)(TYPE const* self, dc_debug_fmt fmt, FILE* stream) { \
35 fprintf(stream, STRINGIFY(TYPE) "@%p {\n", self); \
36 fmt = dc_debug_fmt_scope_begin(fmt); \
37 NS(TYPE, REFLECT)(_DC_DERIVE_DEBUG_MEMBER); \
38 fmt = dc_debug_fmt_scope_end(fmt); \
41#define _DERIVE_STD_DEBUG(TYPE, FMT, ...) \
42 static void NS(TYPE, debug)(TYPE const* self, dc_debug_fmt fmt, FILE* stream) { \
44 fprintf(stream, FMT, *self); \
51 fprintf(
stream,
"char*@%p \"%s\"", *
string, *
string);
54#if defined __cplusplus
55 #include <type_traits>
57 #define _DC_DEFAULT_DEBUG_CASE(TYPE, _, FMT, STREAM) \
58 if constexpr (std::is_same_v< \
59 TYPE, std::remove_cv_t<std::remove_reference_t<decltype(*item)>>>) { \
60 NS(TYPE, debug)(item, FMT, STREAM); \
63 #define _DC_DEFAULT_DEBUG(SELF, FMT, STREAM) \
64 [&]<typename T>(T item) { \
65 DC_STD_REFLECT(_DC_DEFAULT_DEBUG_CASE, FMT, STREAM) \
66 if constexpr (std::is_same_v<char*, std::remove_cv_t< \
67 std::remove_reference_t<decltype(*item)>>>) { \
68 dc_string_debug(item, FMT, STREAM); \
70 NO_DEBUG(item, FMT, STREAM); \
75 #define _DC_DEFAULT_DEBUG_CASE(TYPE, _, x) \
79 #define _DC_DEFAULT_DEBUG(SELF, FMT, STREAM) \
81 DC_STD_REFLECT(_DC_DEFAULT_DEBUG_CASE, f) char const*: dc_string_debug, \
82 default: PRIV(no_debug))(SELF, FMT, STREAM);
85#define DC_DEFAULT_DEBUG _DC_DEFAULT_DEBUG
#define _DERIVE_STD_DEBUG(TYPE, FMT,...)
static void PRIV no_debug(void const *self, dc_debug_fmt fmt, FILE *stream)
static void dc_string_debug(char const *const *string, dc_debug_fmt fmt, FILE *stream)
#define DC_STD_REFLECT(F,...)
Debug format helpers for debug printin data structures.
static FILE * stream(SELF *self)
Opens a file for.