Bladeren bron

remove for list and tests

Kajetan Johannes Hammerle 3 jaren geleden
bovenliggende
commit
46eabe90e0
2 gewijzigde bestanden met toevoegingen van 72 en 46 verwijderingen
  1. 42 27
      tests/ListTests.cpp
  2. 30 19
      utils/List.h

+ 42 - 27
tests/ListTests.cpp

@@ -10,30 +10,30 @@ static void testAdd(Test& test) {
     IntList list;
     list.add(5);
 
-    test.checkEqual(5, list[0], "list contains added value");
-    test.checkEqual(1, list.getLength(), "list sizes is increased by add");
+    test.checkEqual(5, list[0], "contains added value");
+    test.checkEqual(1, list.getLength(), "sizes is increased by add");
 }
 
 static void testMultipleAdd(Test& test) {
     IntList list;
     list.add(4).add(3).add(2);
-    test.checkEqual(4, list[0], "list contains added value");
-    test.checkEqual(3, list[1], "list contains added value");
-    test.checkEqual(2, list[2], "list contains added value");
-    test.checkEqual(3, list.getLength(), "list sizes is increased by add");
+    test.checkEqual(4, list[0], "contains added value");
+    test.checkEqual(3, list[1], "contains added value");
+    test.checkEqual(2, list[2], "contains added value");
+    test.checkEqual(3, list.getLength(), "sizes is increased by add");
 }
 
 static void testAddReplace(Test& test) {
     IntList list;
     list.add(5);
     list[0] = 3;
-    test.checkEqual(3, list[0], "list value is overwritten");
+    test.checkEqual(3, list[0], "value is overwritten");
 }
 
 static void testClear(Test& test) {
     IntList list;
     list.add(5).add(4).clear();
-    test.checkEqual(0, list.getLength(), "list length is 0 after clear");
+    test.checkEqual(0, list.getLength(), "length is 0 after clear");
 }
 
 static void testOverflow(Test& test) {
@@ -42,9 +42,9 @@ static void testOverflow(Test& test) {
         list.add(i);
     }
     for(int i = 0; i < list.getLength(); i++) {
-        test.checkEqual(i, list[i], "list still contains values after overflow");
+        test.checkEqual(i, list[i], "still contains values after overflow");
     }
-    test.checkEqual(true, true, "list survives overflow");
+    test.checkEqual(true, true, "survives overflow");
 }
 
 static void testCopy(Test& test) {
@@ -52,9 +52,9 @@ static void testCopy(Test& test) {
     list.add(1).add(2).add(3);
 
     IntList copy(list);
-    test.checkEqual(list.getLength(), copy.getLength(), "list copy has same length");
+    test.checkEqual(list.getLength(), copy.getLength(), "copy has same length");
     for(int i = 0; i < copy.getLength() && i < list.getLength(); i++) {
-        test.checkEqual(list[i], copy[i], "list copy has same values");
+        test.checkEqual(list[i], copy[i], "copy has same values");
     }
 }
 
@@ -64,9 +64,9 @@ static void testCopyAssignment(Test& test) {
 
     IntList copy;
     copy = list;
-    test.checkEqual(list.getLength(), copy.getLength(), "list copy assignment has same length");
+    test.checkEqual(list.getLength(), copy.getLength(), "copy assignment has same length");
     for(int i = 0; i < copy.getLength() && i < list.getLength(); i++) {
-        test.checkEqual(list[i], copy[i], "list copy assignment has same values");
+        test.checkEqual(list[i], copy[i], "copy assignment has same values");
     }
 }
 
@@ -75,11 +75,11 @@ static void testMove(Test& test) {
     list.add(1).add(2).add(3);
 
     IntList move(std::move(list));
-    test.checkEqual(0, list.getLength(), "moved list has length 0");
-    test.checkEqual(3, move.getLength(), "moved list passes length");
-    test.checkEqual(1, move[0], "moved list passes values");
-    test.checkEqual(2, move[1], "moved list passes values");
-    test.checkEqual(3, move[2], "moved list passes values");
+    test.checkEqual(0, list.getLength(), "moved has length 0");
+    test.checkEqual(3, move.getLength(), "moved passes length");
+    test.checkEqual(1, move[0], "moved passes values");
+    test.checkEqual(2, move[1], "moved passes values");
+    test.checkEqual(3, move[2], "moved passes values");
 }
 
 static void testMoveAssignment(Test& test) {
@@ -88,28 +88,42 @@ static void testMoveAssignment(Test& test) {
 
     IntList move;
     move = std::move(list);
-    test.checkEqual(0, list.getLength(), "assignment moved list has length 0");
-    test.checkEqual(3, move.getLength(), "assignment moved list passes length");
-    test.checkEqual(1, move[0], "assignment moved list passes values");
-    test.checkEqual(2, move[1], "assignment moved list passes values");
-    test.checkEqual(3, move[2], "assignment moved list passes values");
+    test.checkEqual(0, list.getLength(), "assignment moved has length 0");
+    test.checkEqual(3, move.getLength(), "assignment moved passes length");
+    test.checkEqual(1, move[0], "assignment moved passes values");
+    test.checkEqual(2, move[1], "assignment moved passes values");
+    test.checkEqual(3, move[2], "assignment moved passes values");
 }
 
 static void testToString1(Test& test) {
     IntList list;
     list.add(1).add(243).add(-423);
-    test.checkEqual(String("[1, 243, -423]"), String(list), "list to string 1");
+    test.checkEqual(String("[1, 243, -423]"), String(list), "to string 1");
 }
 
 static void testToString2(Test& test) {
     IntList list;
     list.add(1);
-    test.checkEqual(String("[1]"), String(list), "list to string 2");
+    test.checkEqual(String("[1]"), String(list), "to string 2");
 }
 
 static void testToString3(Test& test) {
     IntList list;
-    test.checkEqual(String("[]"), String(list), "list to string 3");
+    test.checkEqual(String("[]"), String(list), "to string 3");
+}
+
+static void testRemove(Test& test) {
+    IntList list;
+    list.add(4).add(3).add(2);
+    list.remove(0);
+    test.checkEqual(2, list[0], "remove 1");
+    test.checkEqual(3, list[1], "remove 2");
+    test.checkEqual(2, list.getLength(), "remove 3");
+    list.remove(1);
+    test.checkEqual(2, list[0], "remove 4");
+    test.checkEqual(1, list.getLength(), "remove 5");
+    list.remove(0);
+    test.checkEqual(0, list.getLength(), "remove 6");
 }
 
 void ListTests::test() {
@@ -126,5 +140,6 @@ void ListTests::test() {
     testToString1(test);
     testToString2(test);
     testToString3(test);
+    testRemove(test);
     test.finalize();
 }

+ 30 - 19
utils/List.h

@@ -8,16 +8,16 @@
 template<typename T, int N>
 class List final {
     char data[sizeof (T) * N];
-    int index = 0;
+    int length = 0;
 
     void copy(const List& other) {
-        for(int i = 0; i < other.index; i++) {
+        for(int i = 0; i < other.length; i++) {
             add(other[i]);
         }
     }
 
     void move(List&& other) {
-        for(int i = 0; i < other.index; i++) {
+        for(int i = 0; i < other.length; i++) {
             add(std::move(other[i]));
         }
     }
@@ -26,10 +26,10 @@ public:
     List() = default;
 
     List& clear() {
-        for(int i = 0; i < index; i++) {
+        for(int i = 0; i < length; i++) {
             (*this)[i].~T();
         }
-        index = 0;
+        length = 0;
         return *this;
     }
 
@@ -37,7 +37,7 @@ public:
         clear();
     }
 
-    List(const List& other) : index(0) {
+    List(const List& other) : length(0) {
         copy(other);
     }
 
@@ -49,7 +49,7 @@ public:
         return *this;
     }
 
-    List(List&& other) : index(0) {
+    List(List&& other) : length(0) {
         move(std::move(other));
         other.clear();
     }
@@ -68,7 +68,7 @@ public:
     }
 
     T* end() {
-        return reinterpret_cast<T*> (data) + index;
+        return reinterpret_cast<T*> (data) + length;
     }
 
     const T* begin() const {
@@ -76,34 +76,34 @@ public:
     }
 
     const T* end() const {
-        return reinterpret_cast<const T*> (data) + index;
+        return reinterpret_cast<const T*> (data) + length;
     }
 
     List& add(const T& t) {
-        if(index >= N) {
+        if(length >= N) {
             return *this;
         }
         new (end()) T(t);
-        index++;
+        length++;
         return *this;
     }
 
     List& add(T&& t) {
-        if(index >= N) {
+        if(length >= N) {
             return *this;
         }
         new (end()) T(std::move(t));
-        index++;
+        length++;
         return *this;
     }
 
     template<typename... Args>
     List& add(Args&&... args) {
-        if(index >= N) {
+        if(length >= N) {
             return *this;
         }
         new (end()) T(args...);
-        index++;
+        length++;
         return *this;
     }
 
@@ -116,21 +116,32 @@ public:
     }
 
     int getLength() const {
-        return index;
+        return length;
     }
 
     template<int L>
     void toString(StringBuffer<L>& s) const {
         s.append("[");
-        for(int i = 0; i < index - 1; i++) {
+        for(int i = 0; i < length - 1; i++) {
             s.append((*this)[i]);
             s.append(", ");
         }
-        if(index > 0) {
-            s.append((*this)[index - 1]);
+        if(length > 0) {
+            s.append((*this)[length - 1]);
         }
         s.append("]");
     }
+
+    void remove(int index) {
+        if(index + 1 == length) {
+            (*this)[index].~T();
+            length--;
+            return;
+        }
+        (*this)[index] = std::move((*this)[length - 1]);
+        (*this)[length - 1].~T();
+        length--;
+    }
 };
 
 #endif