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
24namespace
25{
26 template<class Container1, class Container2>
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>
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
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
106boost::unit_test::test_suite*
107init_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

source code of boost/libs/range/test/algorithm_test/swap_ranges.cpp