ToString.cppm 2.8 KB

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