]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/range/test/algorithm_test/merge.cpp
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)
7 // For more information, see http://www.boost.org/libs/range/
9 #include <boost/range/algorithm/merge.hpp>
11 #include <boost/test/test_tools.hpp>
12 #include <boost/test/unit_test.hpp>
14 #include <boost/assign.hpp>
15 #include <boost/bind.hpp>
27 template<class Container1
, class Container2
>
28 void test(Container1
& cont1
, Container2
& cont2
)
30 typedef BOOST_DEDUCED_TYPENAME
Container1::value_type value_t
;
31 typedef BOOST_DEDUCED_TYPENAME
std::vector
<value_t
>::iterator iterator_t
;
33 std::vector
<value_t
> reference_target( cont1
.size() + cont2
.size() );
35 iterator_t reference_it
36 = std::merge(cont1
.begin(), cont1
.end(),
37 cont2
.begin(), cont2
.end(),
38 reference_target
.begin());
40 std::vector
<value_t
> test_target( cont1
.size() + cont2
.size() );
43 = boost::merge(cont1
, cont2
, test_target
.begin());
46 std::distance
<iterator_t
>(reference_target
.begin(), reference_it
),
47 std::distance
<iterator_t
>(test_target
.begin(), test_it
)
50 BOOST_CHECK_EQUAL_COLLECTIONS(
51 reference_target
.begin(), reference_target
.end(),
52 test_target
.begin(), test_target
.end()
55 test_it
= boost::merge(boost::make_iterator_range(cont1
),
56 cont2
, test_target
.begin());
59 std::distance
<iterator_t
>(reference_target
.begin(), reference_it
),
60 std::distance
<iterator_t
>(test_target
.begin(), test_it
)
63 BOOST_CHECK_EQUAL_COLLECTIONS(
64 reference_target
.begin(), reference_target
.end(),
65 test_target
.begin(), test_target
.end()
68 test_it
= boost::merge(cont1
, boost::make_iterator_range(cont2
),
72 std::distance
<iterator_t
>(reference_target
.begin(), reference_it
),
73 std::distance
<iterator_t
>(test_target
.begin(), test_it
)
76 BOOST_CHECK_EQUAL_COLLECTIONS(
77 reference_target
.begin(), reference_target
.end(),
78 test_target
.begin(), test_target
.end()
81 test_it
= boost::merge(boost::make_iterator_range(cont1
),
82 boost::make_iterator_range(cont2
),
86 std::distance
<iterator_t
>(reference_target
.begin(), reference_it
),
87 std::distance
<iterator_t
>(test_target
.begin(), test_it
)
90 BOOST_CHECK_EQUAL_COLLECTIONS(
91 reference_target
.begin(), reference_target
.end(),
92 test_target
.begin(), test_target
.end()
96 template<class Container
, class BinaryPredicate
>
97 void sort_container(Container
& cont
, BinaryPredicate pred
)
99 typedef BOOST_DEDUCED_TYPENAME
Container::value_type value_t
;
101 std::vector
<value_t
> temp(cont
.begin(), cont
.end());
102 std::sort(temp
.begin(), temp
.end(), pred
);
103 cont
.assign(temp
.begin(), temp
.end());
106 template<class Container1
,
108 class BinaryPredicate
>
109 void test_pred(Container1 cont1
, Container2 cont2
, BinaryPredicate pred
)
111 typedef BOOST_DEDUCED_TYPENAME
Container1::value_type value_t
;
112 typedef BOOST_DEDUCED_TYPENAME
std::vector
<value_t
>::iterator iterator_t
;
114 sort_container(cont1
, pred
);
115 sort_container(cont2
, pred
);
117 std::vector
<value_t
> reference_target( cont1
.size() + cont2
.size() );
119 iterator_t reference_it
120 = std::merge(cont1
.begin(), cont1
.end(),
121 cont2
.begin(), cont2
.end(),
122 reference_target
.begin(), pred
);
124 std::vector
<value_t
> test_target( cont1
.size() + cont2
.size() );
127 = boost::merge(cont1
, cont2
, test_target
.begin(), pred
);
130 std::distance(reference_target
.begin(), reference_it
),
131 std::distance(test_target
.begin(), test_it
)
134 BOOST_CHECK_EQUAL_COLLECTIONS(
135 reference_target
.begin(), reference_target
.end(),
136 test_target
.begin(), test_target
.end()
139 test_it
= boost::merge(boost::make_iterator_range(cont1
), cont2
,
140 test_target
.begin(), pred
);
143 std::distance(reference_target
.begin(), reference_it
),
144 std::distance(test_target
.begin(), test_it
)
147 BOOST_CHECK_EQUAL_COLLECTIONS(
148 reference_target
.begin(), reference_target
.end(),
149 test_target
.begin(), test_target
.end()
152 test_it
= boost::merge(cont1
, boost::make_iterator_range(cont2
),
153 test_target
.begin(), pred
);
156 std::distance(reference_target
.begin(), reference_it
),
157 std::distance(test_target
.begin(), test_it
)
160 BOOST_CHECK_EQUAL_COLLECTIONS(
161 reference_target
.begin(), reference_target
.end(),
162 test_target
.begin(), test_target
.end()
165 test_it
= boost::merge(boost::make_iterator_range(cont1
),
166 boost::make_iterator_range(cont2
),
167 test_target
.begin(), pred
);
170 std::distance(reference_target
.begin(), reference_it
),
171 std::distance(test_target
.begin(), test_it
)
174 BOOST_CHECK_EQUAL_COLLECTIONS(
175 reference_target
.begin(), reference_target
.end(),
176 test_target
.begin(), test_target
.end()
180 template<class Container1
, class Container2
>
181 void test_merge_impl(Container1
& cont1
, Container2
& cont2
)
184 test_pred(cont1
, cont2
, std::less
<int>());
185 test_pred(cont1
, cont2
, std::greater
<int>());
188 template<class Container1
, class Container2
>
189 void test_merge_impl()
191 using namespace boost::assign
;
196 test_merge_impl(cont1
, cont2
);
201 test_merge_impl(cont1
, cont2
);
206 test_merge_impl(cont1
, cont2
);
210 cont1
+= 1,3,5,7,9,11,13,15,17,19;
211 cont2
+= 2,4,6,8,10,12,14,16,18,20;
212 test_merge_impl(cont1
, cont2
);
217 test_merge_impl
< std::vector
<int>, std::vector
<int> >();
218 test_merge_impl
< std::list
<int>, std::list
<int> >();
219 test_merge_impl
< std::deque
<int>, std::deque
<int> >();
221 test_merge_impl
< std::list
<int>, std::vector
<int> >();
222 test_merge_impl
< std::vector
<int>, std::list
<int> >();
228 boost::unit_test::test_suite
*
229 init_unit_test_suite(int argc
, char* argv
[])
231 boost::unit_test::test_suite
* test
232 = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.merge" );
234 test
->add( BOOST_TEST_CASE( &boost::test_merge
) );