diff --git a/AK/Vector.h b/AK/Vector.h index 14c5e7f507..88ed35ac19 100644 --- a/AK/Vector.h +++ b/AK/Vector.h @@ -29,6 +29,18 @@ public: T& at(unsigned i) { return *slot(i); } const T& at(unsigned i) const { return *slot(i); } + void remove(unsigned index) + { + ASSERT(index < m_size); + at(index).~T(); + for (unsigned i = index + 1; i < m_size; ++i) { + new (slot(i - 1)) T(std::move(at(i))); + at(i).~T(); + } + + --m_size; + } + private: friend class Vector; @@ -95,6 +107,11 @@ public: return value; } + void remove(unsigned index) + { + m_impl->remove(index); + } + void append(T&& value) { ensureCapacity(size() + 1); @@ -152,8 +169,8 @@ public: unsigned m_index { 0 }; }; - ConstIterator begin() const { return Iterator(*this, 0); } - ConstIterator end() const { return Iterator(*this, size()); } + ConstIterator begin() const { return ConstIterator(*this, 0); } + ConstIterator end() const { return ConstIterator(*this, size()); } private: static unsigned paddedCapacity(unsigned capacity) diff --git a/AK/test.cpp b/AK/test.cpp index f57036edf1..5c97d0a70a 100644 --- a/AK/test.cpp +++ b/AK/test.cpp @@ -127,5 +127,33 @@ int main(int, char**) problem.append("test"); } + { + auto printInts = [] (const Vector& v) { + printf("Vector {\n size: %u\n capacity: %u\n elements: ", v.size(), v.capacity()); + for (auto i : v) + printf("%d ", i); + printf("\n}\n"); + }; + + Vector v; + v.append(0); + v.append(1); + v.append(2); + v.append(3); + printInts(v); + + v.remove(1); + printInts(v); + + v.remove(0); + printInts(v); + + v.remove(0); + printInts(v); + + v.remove(0); + printInts(v); + } + return 0; }