#ifndef CORE_TO_STRING_H #define CORE_TO_STRING_H #include "core/Check.h" #include "core/Types.h" check_format(3, 4) size_t coreToString(char* buffer, size_t n, const char* format, ...); size_t toStringSize(const size_t* p, char* buffer, size_t n); size_t toStringInt(const int* p, char* buffer, size_t n); void stringAdd(size_t* w, char** buffer, size_t* n, size_t shift); #define STRUCT_TO_STRING(type) \ struct type##T; \ size_t toString##type(const struct type##T* a, char* buffer, size_t n); STRUCT_TO_STRING(BitArray) STRUCT_TO_STRING(Box) STRUCT_TO_STRING(Matrix) STRUCT_TO_STRING(Plane) // clang-format off #define PAIR(a, b) a: b #define STRUCT_PAIR(name) \ PAIR(const struct name##T*, toString##name), PAIR(struct name##T*, toString##name) // clang-format on #define toString(t, ...) \ _Generic((t), \ char*: coreToString, \ STRUCT_PAIR(BitArray), \ STRUCT_PAIR(Box), \ STRUCT_PAIR(Matrix), \ STRUCT_PAIR(Plane))(t, __VA_ARGS__) #endif