]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/algorithm/test/copy_if_test1.cpp
2 Copyright (c) Marshall Clow 2012.
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 For more information, see http://www.boost.org
10 #include <boost/config.hpp>
11 #include <boost/algorithm/cxx11/copy_if.hpp>
13 #define BOOST_TEST_MAIN
14 #include <boost/test/unit_test.hpp>
22 #include <boost/algorithm/cxx11/all_of.hpp>
23 #include <boost/algorithm/cxx11/none_of.hpp>
25 namespace ba
= boost::algorithm
;
26 // namespace ba = boost;
28 bool is_true ( int v
) { return true; }
29 bool is_false ( int v
) { return false; }
30 bool is_even ( int v
) { return v
% 2 == 0; }
31 bool is_odd ( int v
) { return v
% 2 == 1; }
33 template <typename Container
>
34 void test_copy_if ( Container
const &c
) {
36 typedef typename
Container::value_type value_type
;
37 std::vector
<value_type
> v
;
39 // None of the elements
41 ba::copy_if ( c
.begin (), c
.end (), back_inserter ( v
), is_false
);
42 BOOST_CHECK ( v
.size () == 0 );
45 ba::copy_if ( c
, back_inserter ( v
), is_false
);
46 BOOST_CHECK ( v
.size () == 0 );
50 ba::copy_if ( c
.begin (), c
.end (), back_inserter ( v
), is_true
);
51 BOOST_CHECK ( v
.size () == c
.size ());
52 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
55 ba::copy_if ( c
, back_inserter ( v
), is_true
);
56 BOOST_CHECK ( v
.size () == c
.size ());
57 BOOST_CHECK ( v
.size () == c
.size ());
58 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
60 // Some of the elements
62 ba::copy_if ( c
.begin (), c
.end (), back_inserter ( v
), is_even
);
63 BOOST_CHECK ( v
.size () == (size_t) std::count_if ( c
.begin (), c
.end (), is_even
));
64 BOOST_CHECK ( ba::all_of ( v
.begin (), v
.end (), is_even
));
67 ba::copy_if ( c
, back_inserter ( v
), is_even
);
68 BOOST_CHECK ( v
.size () == (size_t) std::count_if ( c
.begin (), c
.end (), is_even
));
69 BOOST_CHECK ( ba::all_of ( v
.begin (), v
.end (), is_even
));
73 template <typename Container
>
74 void test_copy_while ( Container
const &c
) {
76 typedef typename
Container::value_type value_type
;
77 typename
Container::const_iterator it
;
78 std::vector
<value_type
> v
;
80 // None of the elements
82 ba::copy_while ( c
.begin (), c
.end (), back_inserter ( v
), is_false
);
83 BOOST_CHECK ( v
.size () == 0 );
86 ba::copy_while ( c
, back_inserter ( v
), is_false
);
87 BOOST_CHECK ( v
.size () == 0 );
91 ba::copy_while ( c
.begin (), c
.end (), back_inserter ( v
), is_true
);
92 BOOST_CHECK ( v
.size () == c
.size ());
93 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
96 ba::copy_while ( c
, back_inserter ( v
), is_true
);
97 BOOST_CHECK ( v
.size () == c
.size ());
98 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
100 // Some of the elements
102 it
= ba::copy_while ( c
.begin (), c
.end (), back_inserter ( v
), is_even
).first
;
103 BOOST_CHECK ( v
.size () == (size_t) std::distance ( c
.begin (), it
));
104 BOOST_CHECK ( it
== c
.end () || !is_even ( *it
));
105 BOOST_CHECK ( ba::all_of ( v
.begin (), v
.end (), is_even
));
106 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
109 it
= ba::copy_while ( c
, back_inserter ( v
), is_even
).first
;
110 BOOST_CHECK ( v
.size () == (size_t) std::distance ( c
.begin (), it
));
111 BOOST_CHECK ( it
== c
.end () || !is_even ( *it
));
112 BOOST_CHECK ( ba::all_of ( v
.begin (), v
.end (), is_even
));
113 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
116 template <typename Container
>
117 void test_copy_until ( Container
const &c
) {
119 typedef typename
Container::value_type value_type
;
120 typename
Container::const_iterator it
;
121 std::vector
<value_type
> v
;
123 // None of the elements
125 ba::copy_until ( c
.begin (), c
.end (), back_inserter ( v
), is_true
);
126 BOOST_CHECK ( v
.size () == 0 );
129 ba::copy_until ( c
, back_inserter ( v
), is_true
);
130 BOOST_CHECK ( v
.size () == 0 );
134 ba::copy_until ( c
.begin (), c
.end (), back_inserter ( v
), is_false
);
135 BOOST_CHECK ( v
.size () == c
.size ());
136 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
139 ba::copy_until ( c
, back_inserter ( v
), is_false
);
140 BOOST_CHECK ( v
.size () == c
.size ());
141 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
143 // Some of the elements
145 it
= ba::copy_until ( c
.begin (), c
.end (), back_inserter ( v
), is_even
).first
;
146 BOOST_CHECK ( v
.size () == (size_t) std::distance ( c
.begin (), it
));
147 BOOST_CHECK ( it
== c
.end () || is_even ( *it
));
148 BOOST_CHECK ( ba::none_of ( v
.begin (), v
.end (), is_even
));
149 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
152 it
= ba::copy_until ( c
, back_inserter ( v
), is_even
).first
;
153 BOOST_CHECK ( v
.size () == (size_t) std::distance ( c
.begin (), it
));
154 BOOST_CHECK ( it
== c
.end () || is_even ( *it
));
155 BOOST_CHECK ( ba::none_of ( v
.begin (), v
.end (), is_even
));
156 BOOST_CHECK ( std::equal ( v
.begin (), v
.end (), c
.begin ()));
159 void test_sequence1 () {
161 for ( int i
= 5; i
< 15; ++i
)
164 test_copy_while ( v
);
165 test_copy_until ( v
);
168 for ( int i
= 25; i
> 15; --i
)
171 test_copy_while ( l
);
172 test_copy_until ( l
);
176 BOOST_AUTO_TEST_CASE( test_main
)