ToString.cppm 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. module;
  2. #include <cstdio>
  3. #include <cstring>
  4. export module Core.ToString;
  5. import Core.Math;
  6. import Core.Meta;
  7. export namespace Core {
  8. size_t toString(signed char v, char* s, size_t n);
  9. size_t toString(char v, char* s, size_t n);
  10. size_t toString(short v, char* s, size_t n);
  11. size_t toString(int v, char* s, size_t n);
  12. size_t toString(long v, char* s, size_t n);
  13. size_t toString(long long v, char* s, size_t n);
  14. size_t toString(unsigned char v, char* s, size_t n);
  15. size_t toString(unsigned short v, char* s, size_t n);
  16. size_t toString(unsigned int v, char* s, size_t n);
  17. size_t toString(unsigned long v, char* s, size_t n);
  18. size_t toString(unsigned long long v, char* s, size_t n);
  19. size_t toString(float v, char* s, size_t n);
  20. size_t toString(double v, char* s, size_t n);
  21. size_t toString(const char* v, char* s, size_t n);
  22. size_t toString(char* v, char* s, size_t n);
  23. size_t toString(const unsigned char* v, char* s, size_t n);
  24. size_t toString(unsigned char* v, char* s, size_t n);
  25. size_t toString(bool v, char* s, size_t n);
  26. template<typename T>
  27. size_t toString(const T& t, char* s, size_t n);
  28. template<typename T>
  29. void addString(const T& t, char*& s, size_t& n, size_t& total) {
  30. size_t w = toString(t, s, n);
  31. total += w;
  32. w = Core::min(n, w);
  33. s += w;
  34. n -= w;
  35. }
  36. template<typename T>
  37. size_t toString(const T& t, char* s, size_t n) {
  38. if constexpr(Core::Iterable<T>) {
  39. size_t total = 0;
  40. addString("[", s, n, total);
  41. auto current = t.begin();
  42. auto end = t.end();
  43. if(current != end) {
  44. addString(*current, s, n, total);
  45. ++current;
  46. }
  47. while(current != end) {
  48. addString(", ", s, n, total);
  49. addString(*current, s, n, total);
  50. ++current;
  51. }
  52. addString("]", s, n, total);
  53. return total;
  54. } else {
  55. return t.toString(s, n);
  56. }
  57. }
  58. size_t copyFormatUntil(const char*& format, char*& s, size_t& n);
  59. template<typename T, typename... Args>
  60. void formatR(
  61. const char*& format, char*& s, size_t& n, size_t& total, const T& t,
  62. Args&&... args) {
  63. total += copyFormatUntil(format, s, n);
  64. addString(t, s, n, total);
  65. if constexpr(sizeof...(args) > 0) {
  66. formatR(format, s, n, total, Core::forward<Args>(args)...);
  67. }
  68. }
  69. template<typename... Args>
  70. size_t formatBuffer(char* s, size_t n, const char* format, Args&&... args) {
  71. if constexpr(sizeof...(args) > 0) {
  72. size_t total = 0;
  73. formatR(format, s, n, total, Core::forward<Args>(args)...);
  74. return total + toString(format, s, n);
  75. }
  76. return copyFormatUntil(format, s, n);
  77. }
  78. }