Added static_vector::erase() and tests.

[SVN r81990]
This commit is contained in:
Adam Wulkiewicz
2012-12-15 23:21:59 +00:00
parent b985f5a561
commit addc5eebcf
2 changed files with 95 additions and 0 deletions

View File

@@ -159,6 +159,33 @@ public:
this->destroy(this->ptr(m_size));
}
void erase(iterator position)
{
// TODO change name of this macro
BOOST_GEOMETRY_INDEX_ASSERT_UNUSED_PARAM(difference_type dist = std::distance(this->begin(), position));
BOOST_ASSERT_MSG(0 <= dist && dist < m_size, "invalid iterator");
this->move(position + 1, this->end(), position); // may throw
this->destroy(this->end() - 1);
--m_size;
}
void erase(iterator first, iterator last)
{
// TODO change name of this macro
BOOST_GEOMETRY_INDEX_ASSERT_UNUSED_PARAM(difference_type distf = std::distance(this->begin(), first));
BOOST_GEOMETRY_INDEX_ASSERT_UNUSED_PARAM(difference_type distl = std::distance(this->begin(), last));
BOOST_ASSERT_MSG(0 <= distf && distf < m_size, "invalid iterator");
BOOST_ASSERT_MSG(0 <= distl && distl < m_size, "invalid iterator");
difference_type n = std::distance(first, last);
BOOST_ASSERT_MSG(0 <= n, "invalid iterator");
this->move(last, this->end(), first); // may throw
this->destroy(this->end() - n, this->end());
m_size -= n;
}
// basic
template <typename Iterator>
void assign(Iterator first, Iterator last)
@@ -358,6 +385,25 @@ private:
std::copy(first, last, dst); // may throw
}
// move
void move(iterator first, iterator last, iterator dst)
{
this->move_dispatch(first, last, dst, has_trivial_assign<value_type>()); // may throw
}
void move_dispatch(value_type * first, value_type * last, value_type * dst,
boost::true_type const& /*has_trivial_assign*/)
{
::memmove(dst, first, sizeof(value_type) * std::distance(first, last));
}
void move_dispatch(value_type * first, value_type * last, value_type * dst,
boost::false_type const& /*has_trivial_assign*/)
{
std::copy(first, last, dst); // may throw
}
// uninitialized_copy
template <typename Iterator>

View File

@@ -299,6 +299,50 @@ void test_iterators_nd()
test_compare_ranges(s.rbegin(), s.rend(), v.begin(), v.end());
}
template <typename T, size_t N>
void test_erase_nd()
{
static_vector<T, N> s;
for ( size_t i = 0 ; i < N ; ++i )
s.push_back(T(i));
{
static_vector<T, N> s1(s);
for ( size_t i = 1 ; i < N ; ++i )
{
BOOST_CHECK(s1.front() == T(i-1));
s1.erase(s1.begin());
BOOST_CHECK(s1.front() == T(i));
}
BOOST_CHECK(s1.size() == 1);
}
{
static_vector<T, N> s1(s);
for ( size_t i = N ; i > 1 ; --i )
{
BOOST_CHECK(s1.back() == T(i-1));
s1.erase(s1.end() - 1);
BOOST_CHECK(s1.back() == T(i-2));
}
BOOST_CHECK(s1.size() == 1);
}
{
static_vector<T, N> s1(s);
for ( size_t i = 1 ; i < N - 2 ; i += 3 )
{
BOOST_CHECK(s1.front() == T(i-1));
s1.erase(s1.begin(), s1.begin() + 3);
BOOST_CHECK(s1.front() == T(i+2));
}
}
}
int test_main(int, char* [])
{
BOOST_CHECK(counting_value::count() == 0);
@@ -348,5 +392,10 @@ int test_main(int, char* [])
test_iterators_nd<counting_value, 10>();
BOOST_CHECK(counting_value::count() == 0);
test_erase_nd<int, 10>();
test_erase_nd<value_nd, 10>();
test_erase_nd<counting_value, 10>();
BOOST_CHECK(counting_value::count() == 0);
return 0;
}