|
@@ -19,6 +19,9 @@ size_t toString(const char* v, char* s, size_t n);
|
|
size_t toString(char* v, char* s, size_t n);
|
|
size_t toString(char* v, char* s, size_t n);
|
|
size_t toString(bool v, char* s, size_t n);
|
|
size_t toString(bool v, char* s, size_t n);
|
|
|
|
|
|
|
|
+template<typename T>
|
|
|
|
+size_t toString(const T& t, char* s, size_t n);
|
|
|
|
+
|
|
template<typename T>
|
|
template<typename T>
|
|
void addString(const T& t, char*& s, size_t& n, size_t& total) {
|
|
void addString(const T& t, char*& s, size_t& n, size_t& total) {
|
|
size_t w = toString(t, s, n);
|
|
size_t w = toString(t, s, n);
|
|
@@ -51,34 +54,27 @@ size_t toString(const T& t, char* s, size_t n) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void copyFormatUntil(const char*& format, char*& s, size_t& n);
|
|
|
|
-void copyFormat(const char*& format, char*& s, size_t& n);
|
|
|
|
|
|
+size_t copyFormatUntil(const char*& format, char*& s, size_t& n);
|
|
|
|
|
|
template<typename T, typename... Args>
|
|
template<typename T, typename... Args>
|
|
void formatR(
|
|
void formatR(
|
|
- const char*& format, char*& s, size_t& n, const T& t, Args&&... args) {
|
|
|
|
- copyFormatUntil(format, s, n);
|
|
|
|
- if(n > 1) {
|
|
|
|
- size_t w = Core::min(toString(t, s, n - 1), n - 1);
|
|
|
|
- s += w;
|
|
|
|
- n -= w;
|
|
|
|
- }
|
|
|
|
- *s = '\0';
|
|
|
|
|
|
+ const char*& format, char*& s, size_t& n, size_t& total, const T& t,
|
|
|
|
+ Args&&... args) {
|
|
|
|
+ total += copyFormatUntil(format, s, n);
|
|
|
|
+ addString(t, s, n, total);
|
|
if constexpr(sizeof...(args) > 0) {
|
|
if constexpr(sizeof...(args) > 0) {
|
|
- formatR(format, s, n, Core::forward<Args>(args)...);
|
|
|
|
|
|
+ formatR(format, s, n, total, Core::forward<Args>(args)...);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template<typename... Args>
|
|
template<typename... Args>
|
|
size_t formatBuffer(char* s, size_t n, const char* format, Args&&... args) {
|
|
size_t formatBuffer(char* s, size_t n, const char* format, Args&&... args) {
|
|
if constexpr(sizeof...(args) > 0) {
|
|
if constexpr(sizeof...(args) > 0) {
|
|
- formatR(format, s, n, Core::forward<Args>(args)...);
|
|
|
|
- copyFormat(format, s, n);
|
|
|
|
- } else {
|
|
|
|
- memcpy(s, format, Core::min(n, strlen(format)));
|
|
|
|
- s[n - (n > 0)] = 0;
|
|
|
|
|
|
+ size_t total = 0;
|
|
|
|
+ formatR(format, s, n, total, Core::forward<Args>(args)...);
|
|
|
|
+ return total + toString(format, s, n);
|
|
}
|
|
}
|
|
- return 0;
|
|
|
|
|
|
+ return copyFormatUntil(format, s, n);
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|
|
#endif
|