diff --git a/base/base_tests/buffer_vector_test.cpp b/base/base_tests/buffer_vector_test.cpp index 3b9e64e899..eef766dc07 100644 --- a/base/base_tests/buffer_vector_test.cpp +++ b/base/base_tests/buffer_vector_test.cpp @@ -363,3 +363,24 @@ UNIT_TEST(BufferVector_OnlyMoveableItems) for (size_t i = 0; i < 10; ++i) TEST_EQUAL(*v[i], i, ()); } + +UNIT_TEST(BufferVector_Erase) +{ + buffer_vector v1; + std::vector v2; + for (int i = 1; i < 100; ++i) + { + v1.push_back(i); + v2.push_back(i); + } + + while (v1.size() > 1) + { + v1.erase(v1.begin() + v1.size() / 3, v1.begin() + 2 * v1.size () / 3); + v2.erase(v2.begin() + v2.size() / 3, v2.begin() + 2 * v2.size () / 3); + + TEST_EQUAL(v1.size(), v2.size(), ()); + for (size_t i = 0; i < v1.size(); ++i) + TEST_EQUAL(v1[i], v2[i], ()); + } +} diff --git a/base/buffer_vector.hpp b/base/buffer_vector.hpp index 34805ea3dd..31a399264c 100644 --- a/base/buffer_vector.hpp +++ b/base/buffer_vector.hpp @@ -410,6 +410,19 @@ public: resize(std::distance(b, i)); } + void erase(iterator first, iterator last) + { + if (first == last) + return; + + auto const numToErase = std::distance(first, last); + for (; first != end() - numToErase; ++first) + { + Swap(*first, *(first + numToErase)); + } + resize(std::distance(begin(), first)); + } + private: void SwitchToDynamic() {