Browse Source

AK: Delete Vector::resize() from Nonnull{Own,Ref}PtrVector.

It's not possible to grow one of these vectors beyond what's already in them
since it's not possible to default-construct Nonnull{Own,Ref}Ptr.

Add Vector::shrink() which can be used when you want to shrink the Vector
and delete resize() from the specialized Vectors.
Andreas Kling 6 năm trước cách đây
mục cha
commit
1686c4906b
3 tập tin đã thay đổi với 27 bổ sung9 xóa
  1. 6 0
      AK/NonnullOwnPtrVector.h
  2. 6 0
      AK/NonnullRefPtrVector.h
  3. 15 9
      AK/Vector.h

+ 6 - 0
AK/NonnullOwnPtrVector.h

@@ -41,6 +41,12 @@ public:
     const T& first() const { return at(0); }
     T& last() { return at(size() - 1); }
     const T& last() const { return at(size() - 1); }
+
+private:
+    // NOTE: You can't use resize() on a NonnullOwnPtrVector since making the vector
+    //       bigger would require being able to default-construct NonnullOwnPtrs.
+    //       Instead, use shrink(new_size).
+    void resize(int) = delete;
 };
 
 }

+ 6 - 0
AK/NonnullRefPtrVector.h

@@ -41,6 +41,12 @@ public:
     const T& first() const { return at(0); }
     T& last() { return at(size() - 1); }
     const T& last() const { return at(size() - 1); }
+
+private:
+    // NOTE: You can't use resize() on a NonnullRefPtrVector since making the vector
+    //       bigger would require being able to default-construct NonnullRefPtrs.
+    //       Instead, use shrink(new_size).
+    void resize(int) = delete;
 };
 
 }

+ 15 - 9
AK/Vector.h

@@ -407,8 +407,9 @@ public:
         m_capacity = new_capacity;
     }
 
-    void resize(int new_size)
+    void shrink(int new_size)
     {
+        ASSERT(new_size <= size());
         if (new_size == size())
             return;
 
@@ -417,14 +418,19 @@ public:
             return;
         }
 
-        if (new_size > size()) {
-            ensure_capacity(new_size);
-            for (int i = size(); i < new_size; ++i)
-                new (slot(i)) T;
-        } else {
-            for (int i = new_size; i < size(); ++i)
-                at(i).~T();
-        }
+        for (int i = new_size; i < size(); ++i)
+            at(i).~T();
+        m_size = new_size;
+    }
+
+    void resize(int new_size)
+    {
+        if (new_size <= size())
+            return shrink(new_size);
+
+        ensure_capacity(new_size);
+        for (int i = size(); i < new_size; ++i)
+            new (slot(i)) T;
         m_size = new_size;
     }