Added buffer_vector::assign, constructor from iterators and == !=

This commit is contained in:
Alex Zolotarev 2011-05-23 20:08:49 +02:00 committed by Alex Zolotarev
parent 2f0e1dd452
commit 6e4727243c
2 changed files with 71 additions and 0 deletions

View file

@ -187,3 +187,33 @@ UNIT_TEST(BufferVectorPopBack)
TEST(v.empty(), ());
}
}
UNIT_TEST(BufferVectorAssign)
{
int const arr5[] = {1, 2, 3, 4, 5};
buffer_vector<int, 5> 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<int, 5> v1(&arr5[0], &arr5[0] + ARRAY_SIZE(arr5));
buffer_vector<int, 10> v2(&arr5[0], &arr5[0] + ARRAY_SIZE(arr5));
buffer_vector<int, 3> 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, ());
}

View file

@ -27,6 +27,35 @@ public:
resize(n, c);
}
template <typename IterT>
explicit buffer_vector(IterT beg, IterT end) : m_size(0)
{
assign(beg, end);
}
template <typename IterT>
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<T, N> const & v)
{
return ::my::impl::DebugPrintSequence(v.data(), v.data() + v.size());
}
template <typename T, size_t N1, size_t N2>
inline bool operator==(buffer_vector<T, N1> const & v1, buffer_vector<T, N2> const & v2)
{
return (v1.size() == v2.size() && std::equal(v1.begin(), v1.end(), v2.begin()));
}
template <typename T, size_t N1, size_t N2>
inline bool operator!=(buffer_vector<T, N1> const & v1, buffer_vector<T, N2> const & v2)
{
return !(v1 == v2);
}