#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 coreToStringSize(const void* p, char* buffer, size_t n); size_t coreToStringInt(const void* p, char* buffer, size_t n); void coreStringAdd(size_t* w, char** buffer, size_t* n, size_t shift); struct CoreQueueT; size_t coreToStringQueue(const struct CoreQueueT* r, char* buffer, size_t n, CoreToString c); struct CoreHashMapT; size_t coreToStringHashMap(const struct CoreHashMapT* m, char* buffer, size_t n, CoreToString keyString, CoreToString valueString); #define CORE_STRUCT_TO_STRING(type) \ struct Core##type##T; \ size_t coreToString##type(const struct Core##type##T* a, char* buffer, \ size_t n); CORE_STRUCT_TO_STRING(BitArray) CORE_STRUCT_TO_STRING(Box) CORE_STRUCT_TO_STRING(Matrix) CORE_STRUCT_TO_STRING(Plane) #ifdef IMPORT_CORE #define toStringSize coreToStringSize #define toStringInt coreToStringInt #define stringAdd coreStringAdd #define toStringQueue coreToStringQueue #define toStringHashMap coreToStringHashMap #define toStringBitArray coreToStringBitArray #define toStringBox coreToStringBox #define toStringMatrix coreToStringMatrix #define toStringPlane coreToStringPlane // clang-format off #define CORE_PAIR(a, b) a: b // clang-format on #define CORE_STRUCT_PAIR(name) \ CORE_PAIR(const struct Core##name##T*, toString##name), \ CORE_PAIR(struct Core##name##T*, toString##name) #define toString(t, ...) \ _Generic((t), \ char*: coreToString, \ CORE_STRUCT_PAIR(BitArray), \ CORE_STRUCT_PAIR(Box), \ CORE_STRUCT_PAIR(Matrix), \ CORE_STRUCT_PAIR(Plane), \ CORE_STRUCT_PAIR(Queue), \ CORE_STRUCT_PAIR(HashMap))(t, __VA_ARGS__) #endif #endif