• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  Copyright Neil Groves 2009. Use, modification and
2 //  distribution is subject to the Boost Software License, Version
3 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 //
6 //
7 // For more information, see http://www.boost.org/libs/range/
8 //
9 #include <boost/range/algorithm/rotate.hpp>
10 
11 #include <boost/test/test_tools.hpp>
12 #include <boost/test/unit_test.hpp>
13 
14 #include <boost/assign.hpp>
15 #include <algorithm>
16 #include <functional>
17 #include <list>
18 #include <numeric>
19 #include <deque>
20 #include <vector>
21 
22 namespace boost
23 {
24     namespace
25     {
26         template<class Container, class Iterator>
test_rotate_impl(Container & cont,Iterator where_it)27         void test_rotate_impl(Container& cont, Iterator where_it)
28         {
29             Container reference(cont);
30             Container test(cont);
31 
32             Iterator reference_where_it = reference.begin();
33             std::advance(reference_where_it,
34                 std::distance(cont.begin(), where_it));
35 
36             std::rotate(reference.begin(), reference_where_it, reference.end());
37 
38             Iterator test_where_it = test.begin();
39             std::advance(test_where_it,
40                 std::distance(cont.begin(), where_it));
41 
42             boost::rotate(test, test_where_it);
43 
44             BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(),
45                                            test.begin(), test.end() );
46 
47             test = cont;
48             test_where_it = test.begin();
49             std::advance(test_where_it,
50                          std::distance(cont.begin(), where_it));
51 
52             boost::rotate(boost::make_iterator_range(test), test_where_it);
53 
54             BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(),
55                                            test.begin(), test.end() );
56         }
57 
58         template<class Container>
test_rotate_impl(Container & cont)59         void test_rotate_impl(Container& cont)
60         {
61             typedef BOOST_DEDUCED_TYPENAME range_iterator<Container>::type iterator_t;
62 
63             iterator_t last = cont.end();
64             for (iterator_t it = cont.begin(); it != last; ++it)
65             {
66                 test_rotate_impl(cont, it);
67             }
68         }
69 
70         template<class Container>
test_rotate_impl()71         void test_rotate_impl()
72         {
73             using namespace boost::assign;
74 
75             Container cont;
76             test_rotate_impl(cont);
77 
78             cont.clear();
79             cont += 1;
80             test_rotate_impl(cont);
81 
82             cont.clear();
83             cont += 1,2,3,4,5,6,7,8,9;
84             test_rotate_impl(cont);
85         }
86 
test_rotate()87         void test_rotate()
88         {
89             test_rotate_impl< std::vector<int> >();
90             test_rotate_impl< std::list<int> >();
91             test_rotate_impl< std::deque<int> >();
92         }
93     }
94 }
95 
96 
97 boost::unit_test::test_suite*
init_unit_test_suite(int argc,char * argv[])98 init_unit_test_suite(int argc, char* argv[])
99 {
100     boost::unit_test::test_suite* test
101         = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.rotate" );
102 
103     test->add( BOOST_TEST_CASE( &boost::test_rotate ) );
104 
105     return test;
106 }
107