ToString.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #ifndef CORE_TO_STRING_H
  2. #define CORE_TO_STRING_H
  3. #include "core/Check.h"
  4. #include "core/Types.h"
  5. check_format(3, 4) size_t
  6. coreToString(char* buffer, size_t n, const char* format, ...);
  7. size_t toStringSize(const void* p, char* buffer, size_t n);
  8. size_t toStringInt(const void* p, char* buffer, size_t n);
  9. void stringAdd(size_t* w, char** buffer, size_t* n, size_t shift);
  10. struct QueueT;
  11. size_t toStringQueue(const struct QueueT* r, char* buffer, size_t n,
  12. ToString c);
  13. #define STRUCT_TO_STRING(type) \
  14. struct type##T; \
  15. size_t toString##type(const struct type##T* a, char* buffer, size_t n);
  16. STRUCT_TO_STRING(BitArray)
  17. STRUCT_TO_STRING(Box)
  18. STRUCT_TO_STRING(Matrix)
  19. STRUCT_TO_STRING(Plane)
  20. // clang-format off
  21. #define PAIR(a, b) a: b
  22. #define STRUCT_PAIR(name) \
  23. PAIR(const struct name##T*, toString##name), PAIR(struct name##T*, toString##name)
  24. // clang-format on
  25. #define toString(t, ...) \
  26. _Generic((t), \
  27. char*: coreToString, \
  28. STRUCT_PAIR(BitArray), \
  29. STRUCT_PAIR(Box), \
  30. STRUCT_PAIR(Matrix), \
  31. STRUCT_PAIR(Plane), \
  32. STRUCT_PAIR(Queue))(t, __VA_ARGS__)
  33. #endif