• 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/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 
22 namespace boost
23 {
24     namespace
25     {
26         template<class Container1, class Container2>
test(Container1 & cont1,Container2 & cont2)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>
sort_container(Container & cont,BinaryPredicate pred)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>
test_pred(Container1 cont1,Container2 cont2,BinaryPredicate pred)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>
test_inplace_merge_impl(Container1 & cont1,Container2 & cont2)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>
test_inplace_merge_impl()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 
test_inplace_merge()149         void test_inplace_merge()
150         {
151             test_inplace_merge_impl< std::vector<int>, std::vector<int> >();
152         }
153     }
154 }
155 
156 
157 boost::unit_test::test_suite*
init_unit_test_suite(int argc,char * argv[])158 init_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