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/inplace_merge.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
22namespace boost
23{
24 namespace
25 {
26 template<class Container1, class Container2>
27 void test(Container1& cont1, Container2& cont2)
28 {
29 typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t;
30
31 typedef BOOST_DEDUCED_TYPENAME std::vector<value_t>::iterator
32 iterator_t BOOST_RANGE_UNUSED;
33
34 std::vector<value_t> reference_target(cont1.begin(), cont1.end());
35 reference_target.insert(reference_target.end(),
36 cont2.begin(), cont2.end());
37
38 std::vector<value_t> test_target(reference_target);
39 std::vector<value_t> test_target2(reference_target);
40
41 std::inplace_merge(reference_target.begin(),
42 reference_target.begin() + cont1.size(),
43 reference_target.end());
44
45 boost::inplace_merge(test_target,
46 test_target.begin() + cont1.size());
47
48 BOOST_CHECK_EQUAL_COLLECTIONS(
49 reference_target.begin(), reference_target.end(),
50 test_target.begin(), test_target.end()
51 );
52
53 boost::inplace_merge(boost::make_iterator_range(test_target2),
54 test_target2.begin() + cont1.size());
55
56 BOOST_CHECK_EQUAL_COLLECTIONS(
57 reference_target.begin(), reference_target.end(),
58 test_target2.begin(), test_target2.end()
59 );
60 }
61
62 template<class Container, class BinaryPredicate>
63 void sort_container(Container& cont, BinaryPredicate pred)
64 {
65 typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t;
66
67 std::vector<value_t> temp(cont.begin(), cont.end());
68 std::sort(temp.begin(), temp.end(), pred);
69 cont.assign(temp.begin(), temp.end());
70 }
71
72 template<class Container1,
73 class Container2,
74 class BinaryPredicate>
75 void test_pred(Container1 cont1, Container2 cont2, BinaryPredicate pred)
76 {
77 typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t;
78 typedef BOOST_DEDUCED_TYPENAME std::vector<value_t>::iterator
79 iterator_t BOOST_RANGE_UNUSED;
80
81 sort_container(cont1, pred);
82 sort_container(cont2, pred);
83
84 std::vector<value_t> reference_target(cont1.begin(), cont1.end());
85 reference_target.insert(reference_target.end(),
86 cont2.begin(), cont2.end());
87
88 std::vector<value_t> test_target(reference_target);
89 std::vector<value_t> test_target2(reference_target);
90
91 std::inplace_merge(reference_target.begin(),
92 reference_target.begin() + cont1.size(),
93 reference_target.end(), pred);
94
95 boost::inplace_merge(test_target,
96 test_target.begin() + cont1.size(),
97 pred);
98
99 BOOST_CHECK_EQUAL_COLLECTIONS(
100 reference_target.begin(), reference_target.end(),
101 test_target.begin(), test_target.end()
102 );
103
104 boost::inplace_merge(boost::make_iterator_range(test_target2),
105 test_target2.begin() + cont1.size(),
106 pred);
107
108 BOOST_CHECK_EQUAL_COLLECTIONS(
109 reference_target.begin(), reference_target.end(),
110 test_target2.begin(), test_target2.end()
111 );
112 }
113
114 template<class Container1, class Container2>
115 void test_inplace_merge_impl(Container1& cont1, Container2& cont2)
116 {
117 test(cont1, cont2);
118 test_pred(cont1, cont2, std::less<int>());
119 test_pred(cont1, cont2, std::greater<int>());
120 }
121
122 template<class Container1, class Container2>
123 void test_inplace_merge_impl()
124 {
125 using namespace boost::assign;
126
127 Container1 cont1;
128 Container2 cont2;
129
130 test_inplace_merge_impl(cont1, cont2);
131
132 cont1.clear();
133 cont2.clear();
134 cont1 += 1;
135 test_inplace_merge_impl(cont1, cont2);
136
137 cont1.clear();
138 cont2.clear();
139 cont2 += 1;
140 test_inplace_merge_impl(cont1, cont2);
141
142 cont1.clear();
143 cont2.clear();
144 cont1 += 1,3,5,7,9,11,13,15,17,19;
145 cont2 += 2,4,6,8,10,12,14,16,18,20;
146 test_inplace_merge_impl(cont1, cont2);
147 }
148
149 void test_inplace_merge()
150 {
151 test_inplace_merge_impl< std::vector<int>, std::vector<int> >();
152 }
153 }
154}
155
156
157boost::unit_test::test_suite*
158init_unit_test_suite(int argc, char* argv[])
159{
160 boost::unit_test::test_suite* test
161 = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.inplace_merge" );
162
163 test->add( BOOST_TEST_CASE( &boost::test_inplace_merge ) );
164
165 return test;
166}
167

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