123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- // Boost.Range library
- //
- // Copyright Neil Groves 2014. Use, modification and
- // distribution is subject to the Boost Software License, Version
- // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- // For more information, see http://www.boost.org/libs/range/
- //
- #include <boost/detail/workaround.hpp>
- #include <boost/range/iterator_range_core.hpp>
- #include <boost/cstdint.hpp>
- #include <boost/test/test_tools.hpp>
- #include <boost/test/unit_test.hpp>
- #include <vector>
- namespace boost_range_test
- {
- namespace
- {
- class single_pass_iterator
- : public boost::iterator_facade<
- single_pass_iterator,
- boost::int32_t,
- boost::single_pass_traversal_tag,
- const boost::int32_t&
- >
- {
- friend class boost::iterator_core_access;
- typedef std::vector<boost::int32_t>::const_iterator iterator_t;
- public:
- single_pass_iterator() { }
- explicit single_pass_iterator(iterator_t it)
- : m_it(it)
- {
- }
- private:
- void increment()
- {
- ++m_it;
- }
- bool equal(single_pass_iterator other) const
- {
- return m_it == other.m_it;
- }
- reference dereference() const
- {
- return *m_it;
- }
- iterator_t m_it;
- };
- class bidirectional_iterator
- : public boost::iterator_facade<
- bidirectional_iterator,
- boost::int32_t,
- boost::bidirectional_traversal_tag,
- const boost::int32_t&
- >
- {
- friend class boost::iterator_core_access;
- typedef std::vector<boost::int32_t>::const_iterator iterator_t;
- public:
- bidirectional_iterator() { }
- explicit bidirectional_iterator(iterator_t it)
- : m_it(it)
- {
- }
- private:
- void increment()
- {
- ++m_it;
- }
- void decrement()
- {
- --m_it;
- }
- bool equal(bidirectional_iterator other) const
- {
- return m_it == other.m_it;
- }
- reference dereference() const
- {
- return *m_it;
- }
- iterator_t m_it;
- };
- template<typename SinglePassRange>
- boost::iterator_range<single_pass_iterator>
- single_pass_range(const SinglePassRange& rng)
- {
- return boost::iterator_range<single_pass_iterator>(
- single_pass_iterator(boost::begin(rng)),
- single_pass_iterator(boost::end(rng)));
- }
- template<typename BidirectionalRange>
- boost::iterator_range<bidirectional_iterator>
- bidirectional_range(const BidirectionalRange& rng)
- {
- return boost::iterator_range<bidirectional_iterator>(
- bidirectional_iterator(boost::begin(rng)),
- bidirectional_iterator(boost::end(rng)));
- }
- void test_drop_front()
- {
- std::vector<boost::int32_t> v;
- std::vector<boost::int32_t> ref_output;
- for (boost::int32_t i = 0; i < 10; ++i)
- {
- v.push_back(i);
- ref_output.push_back(i);
- }
- boost::iterator_range<single_pass_iterator> rng = single_pass_range(v);
- BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
- ref_output.begin(), ref_output.end());
- rng.drop_front();
- ref_output.erase(ref_output.begin());
- BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
- ref_output.begin(), ref_output.end());
- rng.drop_front(5);
- ref_output.erase(ref_output.begin(), ref_output.begin() + 5);
- BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
- ref_output.begin(), ref_output.end());
- }
- void test_drop_back()
- {
- std::vector<boost::int32_t> v;
- std::vector<boost::int32_t> ref_output;
- for (boost::int32_t i = 0; i < 10; ++i)
- {
- v.push_back(i);
- ref_output.push_back(i);
- }
- boost::iterator_range<bidirectional_iterator> rng = bidirectional_range(v);
- BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
- ref_output.begin(), ref_output.end());
- rng.drop_back();
- ref_output.pop_back();
- BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
- ref_output.begin(), ref_output.end());
- rng.drop_back(5);
- ref_output.erase(ref_output.end() - 5, ref_output.end());
- BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
- ref_output.begin(), ref_output.end());
- }
- } // anonymous namespace
- } // namespace boost_range_test
- boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] )
- {
- boost::unit_test::test_suite* test =
- BOOST_TEST_SUITE("Boost.Range iterator_range drop functions");
- test->add(BOOST_TEST_CASE(&boost_range_test::test_drop_front));
- test->add(BOOST_TEST_CASE(&boost_range_test::test_drop_back));
- return test;
- }
|