Kajetan Johannes Hammerle 3 ay önce
ebeveyn
işleme
eae5d68d01

+ 13 - 17
include/core/ToString.hpp

@@ -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(bool v, char* s, size_t n);
 
+template<typename T>
+size_t toString(const T& t, char* s, size_t n);
+
 template<typename T>
 void addString(const T& t, char*& s, size_t& n, size_t& total) {
     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>
 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) {
-        formatR(format, s, n, Core::forward<Args>(args)...);
+        formatR(format, s, n, total, Core::forward<Args>(args)...);
     }
 }
 
 template<typename... Args>
 size_t formatBuffer(char* s, size_t n, const char* format, Args&&... args) {
     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

+ 12 - 14
src/ToString.cpp

@@ -32,26 +32,24 @@ size_t toString(bool v, char* s, size_t n) {
     return e < 0 ? 0 : static_cast<size_t>(e);
 }
 
-void copyFormatUntil(const char*& format, char*& s, size_t& n) {
-    while(*format != '\0' && n > 1) {
+size_t copyFormatUntil(const char*& format, char*& s, size_t& n) {
+    size_t w = 0;
+    while(*format != '\0') {
         char u = *(format++);
         if(u == '#') {
             if(*format != '#') {
-                return;
+                break;
             }
             format++;
         }
-        *s = u;
-        s++;
-        n--;
+        if(n > 1) {
+            *(s++) = u;
+            n--;
+        }
+        w++;
     }
-    *s = '\0';
-}
-
-void copyFormat(const char*& format, char*& s, size_t& n) {
-    while(*format != '\0' && n > 1) {
-        *(s++) = *(format++);
-        n--;
+    if(n > 0) {
+        *s = '\0';
     }
-    *s = '\0';
+    return w;
 }

+ 1 - 0
test/modules/TestTests.cpp

@@ -7,6 +7,7 @@ void testTest() {
     TEST(0l, 1);
     TEST(0lu, 1);
     TEST(0llu, 1);
+    TEST(Core::Vector2(1.0f, 2.0f), Core::Vector2(1.0f, 3.0f));
     TEST_STRING("a", "b");
     TEST_FALSE(true);
     TEST_TRUE(false);

+ 13 - 2
test/modules/UtilityTests.cpp

@@ -136,8 +136,19 @@ static void testMinMax() {
 
 static void testToString() {
     char buffer[512];
-    formatBuffer(buffer, sizeof(buffer), "aa##a", 1, 2, 3);
-    TEST_STRING("aa#a123", buffer);
+    TEST(10, formatBuffer(buffer, sizeof(buffer), "a#a##a", 1.0, 2, 3));
+    TEST_STRING("a1.00a#a23", buffer);
+    TEST(5, formatBuffer(buffer, sizeof(buffer), "aa##ab"));
+    TEST_STRING("aa#ab", buffer);
+    TEST(6, formatBuffer(buffer, 3, "aaaaaa"));
+    TEST_STRING("aa", buffer);
+    TEST(4, formatBuffer(buffer, 4, "a#", 456));
+    TEST_STRING("a45", buffer);
+    TEST(10, formatBuffer(buffer, 4, "# # #", 456, 567, 78));
+    TEST_STRING("456", buffer);
+    TEST(10, formatBuffer(buffer, 1, "# # #", 456, 567, 78));
+    TEST_STRING("", buffer);
+    TEST(10, formatBuffer(nullptr, 0, "# # #", 456ll, 567l, 78ull));
 }
 
 void testUtility(bool light) {

+ 16 - 0
test/modules/VectorTests.cpp

@@ -152,6 +152,20 @@ static void testDiv() {
     TEST(V3(-1.0f, -2.0f, -3.0f), V3(-3.0f, -6.0f, -9.0f) / 3.0f);
 }
 
+static void testSetDivVector() {
+    TEST(
+        V3(-6.0f, -4.0f, -2.0f),
+        V3(-12.0f, -4.0f, -6.0f) / V3(2.0f, 1.0f, 3.0f));
+    TEST(
+        V3(2.0f, -1.0f, 1.0f),
+        V3(-6.0f, -4.0f, -2.0f) / V3(-3.0f, 4.0f, -2.0f));
+}
+
+static void testDivVector() {
+    TEST(V3(-2, -0.5f, -1), V3(2, 1, 3) / V3(-1, -2, -3));
+    TEST(V3(0.5f, 2, 1), V3(1, 2, 3) / V3(2, 1, 3));
+}
+
 static void testDot() {
     TEST_FLOAT(9.0f, V3(-4.0f, 2.0f, -3.0f).dot(V3(-1.0f, -2.0f, -3.0f)), eps);
     TEST_FLOAT(-22.0f, V3(2.0f, 2.0f, -4.0f).dot(V3(1.0f, -2.0f, 5.0f)), eps);
@@ -213,6 +227,8 @@ void testVector() {
     testMulVector();
     testSetDiv();
     testDiv();
+    testSetDivVector();
+    testDivVector();
     testDot();
     testSquareLength();
     testLength();