From 6e4727243cb7a38a6bed2d62cd32c62760f5eec7 Mon Sep 17 00:00:00 2001 From: Alex Zolotarev Date: Mon, 23 May 2011 20:08:49 +0200 Subject: [PATCH] Added buffer_vector::assign, constructor from iterators and == != --- base/base_tests/buffer_vector_test.cpp | 30 +++++++++++++++++++ base/buffer_vector.hpp | 41 ++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/base/base_tests/buffer_vector_test.cpp b/base/base_tests/buffer_vector_test.cpp index e801fb2b9f..62133de144 100644 --- a/base/base_tests/buffer_vector_test.cpp +++ b/base/base_tests/buffer_vector_test.cpp @@ -187,3 +187,33 @@ UNIT_TEST(BufferVectorPopBack) TEST(v.empty(), ()); } } + +UNIT_TEST(BufferVectorAssign) +{ + int const arr5[] = {1, 2, 3, 4, 5}; + buffer_vector v(&arr5[0], &arr5[0] + ARRAY_SIZE(arr5)); + for (size_t i = 0; i < ARRAY_SIZE(arr5); ++i) + { + TEST_EQUAL(arr5[i], v[i], ()); + } + + int const arr10[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + v.assign(&arr10[0], &arr10[0] + ARRAY_SIZE(arr10)); + for (size_t i = 0; i < ARRAY_SIZE(arr10); ++i) + { + TEST_EQUAL(arr10[i], v[i], ()); + } +} + +UNIT_TEST(BufferVectorEquality) +{ + int const arr5[] = {1, 2, 3, 4, 5}; + buffer_vector v1(&arr5[0], &arr5[0] + ARRAY_SIZE(arr5)); + buffer_vector v2(&arr5[0], &arr5[0] + ARRAY_SIZE(arr5)); + buffer_vector v3(&arr5[0], &arr5[0] + ARRAY_SIZE(arr5)); + TEST_EQUAL(v1, v2, ()); + TEST_EQUAL(v1, v3, ()); + TEST_EQUAL(v2, v3, ()); + v1.push_back(999); + TEST_NOT_EQUAL(v1, v2, ()); +} diff --git a/base/buffer_vector.hpp b/base/buffer_vector.hpp index 24d9bb2d62..e618878ac8 100644 --- a/base/buffer_vector.hpp +++ b/base/buffer_vector.hpp @@ -27,6 +27,35 @@ public: resize(n, c); } + template + explicit buffer_vector(IterT beg, IterT end) : m_size(0) + { + assign(beg, end); + } + + template + void assign(IterT beg, IterT end) + { + if (m_size == USE_DYNAMIC) + m_dynamic.assign(beg, end); + else + { + m_size = 0; + while (beg != end) + { + if (m_size == N) + { + m_dynamic.reserve(N * 2); + SwitchToDynamic(); + while (beg != end) + m_dynamic.push_back(*beg++); + break; + } + m_static[m_size++] = *beg++; + } + } + } + void reserve(size_t n) { if (m_size == USE_DYNAMIC || n > N) @@ -198,3 +227,15 @@ inline string debug_print(buffer_vector const & v) { return ::my::impl::DebugPrintSequence(v.data(), v.data() + v.size()); } + +template +inline bool operator==(buffer_vector const & v1, buffer_vector const & v2) +{ + return (v1.size() == v2.size() && std::equal(v1.begin(), v1.end(), v2.begin())); +} + +template +inline bool operator!=(buffer_vector const & v1, buffer_vector const & v2) +{ + return !(v1 == v2); +}