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