forked from organicmaps/organicmaps
Added buffer_vector::assign, constructor from iterators and == !=
This commit is contained in:
parent
2f0e1dd452
commit
6e4727243c
2 changed files with 71 additions and 0 deletions
|
@ -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, ());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue