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/lexicographical_compare.hpp>
11 #include <boost/test/test_tools.hpp>
12 #include <boost/test/unit_test.hpp>
14 #include <boost/assign.hpp>
15 #include <boost/range/value_type.hpp>
27 template<class ForwardRange1
, class ForwardRange2
>
28 void test_lexicographical_compare_impl_nopred(ForwardRange1
& rng1
,
31 const bool reference
= std::lexicographical_compare(
32 boost::begin(rng1
), boost::end(rng1
),
33 boost::begin(rng2
), boost::end(rng2
));
35 const bool test
= boost::lexicographical_compare(rng1
, rng2
);
37 BOOST_CHECK( reference
== test
);
38 BOOST_CHECK( test
== boost::lexicographical_compare(boost::make_iterator_range(rng1
), rng2
) );
39 BOOST_CHECK( test
== boost::lexicographical_compare(rng1
, boost::make_iterator_range(rng2
)) );
40 BOOST_CHECK( test
== boost::lexicographical_compare(boost::make_iterator_range(rng1
), boost::make_iterator_range(rng2
)) );
43 template<class ForwardRange1
, class ForwardRange2
,
44 class BinaryPredicate
>
45 void test_lexicographical_compare_impl_pred(ForwardRange1
& rng1
,
49 const bool reference
= std::lexicographical_compare(
50 boost::begin(rng1
), boost::end(rng1
),
51 boost::begin(rng2
), boost::end(rng2
),
54 const bool test
= boost::lexicographical_compare(rng1
, rng2
, pred
);
56 BOOST_CHECK( reference
== test
);
57 BOOST_CHECK( test
== boost::lexicographical_compare(boost::make_iterator_range(rng1
), rng2
, pred
) );
58 BOOST_CHECK( test
== boost::lexicographical_compare(rng1
, boost::make_iterator_range(rng2
), pred
) );
59 BOOST_CHECK( test
== boost::lexicographical_compare(boost::make_iterator_range(rng1
), boost::make_iterator_range(rng2
), pred
) );
62 template<class Container1
, class Container2
>
63 void test_lexicographical_compare_impl(Container1
& cont1
,
66 typedef BOOST_DEDUCED_TYPENAME
boost::range_value
<Container1
>::type value_t
;
68 test_lexicographical_compare_impl_nopred(cont1
, cont2
);
69 test_lexicographical_compare_impl_pred(cont1
, cont2
, std::less
<value_t
>());
70 test_lexicographical_compare_impl_pred(cont1
, cont2
, std::greater
<value_t
>());
73 template<class Container1
, class Container2
>
74 void test_lexicographical_compare_impl()
76 using namespace boost::assign
;
78 typedef BOOST_DEDUCED_TYPENAME
boost::remove_const
<Container1
>::type container1_t
;
79 typedef BOOST_DEDUCED_TYPENAME
boost::remove_const
<Container2
>::type container2_t
;
83 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
89 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
95 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
101 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
105 cont1
+= 1,2,3,4,5,6,7;
106 cont2
+= 1,2,3,4,5,6,7;
107 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
111 cont1
+= 1,2,3,4,5,6,7;
112 cont2
+= 1,2,3,4,5,6;
113 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
117 cont1
+= 1,2,3,4,5,6;
118 cont2
+= 1,2,3,4,5,6,7;
119 test_lexicographical_compare_impl
<Container1
,Container2
>(cont1
, cont2
);
122 template<class Container1
>
123 void test_lexicographical_compare_rhs()
125 typedef BOOST_DEDUCED_TYPENAME range_value
<Container1
>::type value_t
;
127 test_lexicographical_compare_impl
<Container1
, const std::vector
<value_t
> >();
128 test_lexicographical_compare_impl
<Container1
, const std::deque
<value_t
> >();
129 test_lexicographical_compare_impl
<Container1
, const std::list
<value_t
> >();
130 test_lexicographical_compare_impl
<Container1
, std::vector
<value_t
> >();
131 test_lexicographical_compare_impl
<Container1
, std::deque
<value_t
> >();
132 test_lexicographical_compare_impl
<Container1
, std::list
<value_t
> >();
135 void test_lexicographical_compare()
137 test_lexicographical_compare_rhs
< const std::vector
<int> >();
138 test_lexicographical_compare_rhs
< const std::deque
<int> >();
139 test_lexicographical_compare_rhs
< const std::list
<int> >();
140 test_lexicographical_compare_rhs
< std::vector
<int> >();
141 test_lexicographical_compare_rhs
< std::deque
<int> >();
142 test_lexicographical_compare_rhs
< std::list
<int> >();
148 boost::unit_test::test_suite
*
149 init_unit_test_suite(int argc
, char* argv
[])
151 boost::unit_test::test_suite
* test
152 = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.lexicographical_compare" );
154 test
->add( BOOST_TEST_CASE( &boost::test_lexicographical_compare
) );