diff --git a/AK/NonnullOwnPtrVector.h b/AK/NonnullOwnPtrVector.h index 358f80679f..0616658ced 100644 --- a/AK/NonnullOwnPtrVector.h +++ b/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; }; } diff --git a/AK/NonnullRefPtrVector.h b/AK/NonnullRefPtrVector.h index f5e438f3de..296b92402e 100644 --- a/AK/NonnullRefPtrVector.h +++ b/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; }; } diff --git a/AK/Vector.h b/AK/Vector.h index 646a767bd1..c5c857aa63 100644 --- a/AK/Vector.h +++ b/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; }