]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/algorithm/test/clamp_test.cpp
1 // (C) Copyright Jesse Williamson 2009
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 #include <boost/config.hpp>
10 #include <boost/algorithm/clamp.hpp>
12 #define BOOST_TEST_MAIN
13 #include <boost/test/unit_test.hpp>
15 namespace ba
= boost::algorithm
;
17 BOOST_CONSTEXPR
bool intGreater ( int lhs
, int rhs
) { return lhs
> rhs
; }
18 BOOST_CONSTEXPR
bool doubleGreater ( double lhs
, double rhs
) { return lhs
> rhs
; }
22 custom ( int x
) : v(x
) {}
23 custom ( const custom
&rhs
) : v(rhs
.v
) {}
25 custom
& operator = ( const custom
&rhs
) { v
= rhs
.v
; return *this; }
27 bool operator < ( const custom
&rhs
) const { return v
< rhs
.v
; }
28 bool operator == ( const custom
&rhs
) const { return v
== rhs
.v
; } // need this for the test
30 std::ostream
& print ( std::ostream
&os
) const { return os
<< v
; }
35 std::ostream
& operator << ( std::ostream
& os
, const custom
&x
) { return x
.print ( os
); }
37 bool customLess ( const custom
&lhs
, const custom
&rhs
) { return lhs
.v
< rhs
.v
; }
42 // Inside the range, equal to the endpoints, and outside the endpoints.
43 BOOST_CHECK_EQUAL ( 3, ba::clamp ( 3, 1, 10 ));
44 BOOST_CHECK_EQUAL ( 1, ba::clamp ( 1, 1, 10 ));
45 BOOST_CHECK_EQUAL ( 1, ba::clamp ( 0, 1, 10 ));
46 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 10, 1, 10 ));
47 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 11, 1, 10 ));
48 BOOST_CXX14_CONSTEXPR
bool constexpr_res
= (
49 ba::clamp ( 3, 1, 10 ) == 3
51 BOOST_CHECK( constexpr_res
);
53 BOOST_CHECK_EQUAL ( 3, ba::clamp ( 3, 10, 1, intGreater
));
54 BOOST_CHECK_EQUAL ( 1, ba::clamp ( 1, 10, 1, intGreater
));
55 BOOST_CHECK_EQUAL ( 1, ba::clamp ( 0, 10, 1, intGreater
));
56 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 10, 10, 1, intGreater
));
57 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 11, 10, 1, intGreater
));
60 BOOST_CHECK_EQUAL ( -3, ba::clamp ( -3, -10, -1 ));
61 BOOST_CHECK_EQUAL ( -1, ba::clamp ( -1, -10, -1 ));
62 BOOST_CHECK_EQUAL ( -1, ba::clamp ( 0, -10, -1 ));
63 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -10, -10, -1 ));
64 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -11, -10, -1 ));
66 // Mixed positive and negative numbers
67 BOOST_CHECK_EQUAL ( 5, ba::clamp ( 5, -10, 10 ));
68 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -10, -10, 10 ));
69 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -15, -10, 10 ));
70 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 10, -10, 10 ));
71 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 15, -10, 10 ));
74 BOOST_CHECK_EQUAL ( 5U, ba::clamp ( 5U, 1U, 10U ));
75 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 1U, 1U, 10U ));
76 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 0U, 1U, 10U ));
77 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 10U, 1U, 10U ));
78 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 15U, 1U, 10U ));
81 BOOST_CHECK_EQUAL ( 5U, ba::clamp ( 5U, 1, 10 ));
82 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 1U, 1, 10 ));
83 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 0U, 1, 10 ));
84 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 10U, 1, 10 ));
85 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 15U, 1, 10 ));
88 BOOST_CHECK_EQUAL ( 5U, ba::clamp ( 5U, 1, 10. ));
89 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 1U, 1, 10. ));
90 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 0U, 1, 10. ));
91 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 10U, 1, 10. ));
92 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 15U, 1, 10. ));
95 BOOST_CHECK_EQUAL ( 56, ba::clamp ( foo
, 56.9, 129 ));
96 BOOST_CHECK_EQUAL ( 24910, ba::clamp ( foo
, 12345678, 123456999 ));
103 // Inside the range, equal to the endpoints, and outside the endpoints.
104 BOOST_CHECK_EQUAL ( 3.0, ba::clamp ( 3.0, 1.0, 10.0 ));
105 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 1.0, 1.0, 10.0 ));
106 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 0.0, 1.0, 10.0 ));
107 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 10.0, 1.0, 10.0 ));
108 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 11.0, 1.0, 10.0 ));
110 BOOST_CHECK_EQUAL ( 3.0, ba::clamp ( 3.0, 10.0, 1.0, doubleGreater
));
111 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 1.0, 10.0, 1.0, doubleGreater
));
112 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 0.0, 10.0, 1.0, doubleGreater
));
113 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 10.0, 10.0, 1.0, doubleGreater
));
114 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 11.0, 10.0, 1.0, doubleGreater
));
117 BOOST_CHECK_EQUAL ( -3.f
, ba::clamp ( -3.f
, -10.f
, -1.f
));
118 BOOST_CHECK_EQUAL ( -1.f
, ba::clamp ( -1.f
, -10.f
, -1.f
));
119 BOOST_CHECK_EQUAL ( -1.f
, ba::clamp ( 0.f
, -10.f
, -1.f
));
120 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10.f
, -1.f
));
121 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -11.f
, -10.f
, -1.f
));
123 // Mixed positive and negative numbers
124 BOOST_CHECK_EQUAL ( 5.f
, ba::clamp ( 5.f
, -10.f
, 10.f
));
125 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10.f
, 10.f
));
126 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -15.f
, -10.f
, 10.f
));
127 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 10.f
, -10.f
, 10.f
));
128 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 15.f
, -10.f
, 10.f
));
131 BOOST_CHECK_EQUAL ( 5.f
, ba::clamp ( 5.f
, -10., 10. ));
132 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10., 10. ));
133 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -15.f
, -10., 10. ));
134 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 10.f
, -10., 10. ));
135 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 15.f
, -10., 10. ));
138 BOOST_CHECK_EQUAL ( 5.f
, ba::clamp ( 5.f
, -10, 10 ));
139 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10, 10 ));
140 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -15.f
, -10, 10 ));
141 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 10.f
, -10, 10 ));
142 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 15.f
, -10, 10 ));
148 // Inside the range, equal to the endpoints, and outside the endpoints.
149 BOOST_CHECK_EQUAL ( custom( 3), ba::clamp ( custom( 3), custom(1), custom(10)));
150 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 1), custom(1), custom(10)));
151 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 0), custom(1), custom(10)));
152 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(10), custom(1), custom(10)));
153 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(11), custom(1), custom(10)));
155 BOOST_CHECK_EQUAL ( custom( 3), ba::clamp ( custom( 3), custom(1), custom(10), customLess
));
156 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 1), custom(1), custom(10), customLess
));
157 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 0), custom(1), custom(10), customLess
));
158 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(10), custom(1), custom(10), customLess
));
159 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(11), custom(1), custom(10), customLess
));
162 // BOOST_CHECK_EQUAL ( custom(1), ba::clamp ( custom(11), custom(1), custom(10)));
165 #define elementsof(v) (sizeof (v) / sizeof (v[0]))
166 #define a_begin(v) (&v[0])
167 #define a_end(v) (v + elementsof (v))
169 #define b_e(v) a_begin(v),a_end(v)
171 void test_int_range ()
173 int inputs
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 99, 999, -1, -3, -99, 234234 };
174 int outputs
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, -1, -1, -1, 10 };
175 std::vector
<int> results
;
176 std::vector
<int> in_v
;
178 std::copy ( a_begin(inputs
), a_end(inputs
), std::back_inserter ( in_v
));
180 ba::clamp_range ( a_begin(inputs
), a_end(inputs
), std::back_inserter ( results
), -1, 10 );
181 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
183 ba::clamp_range ( in_v
.begin (), in_v
.end (), std::back_inserter ( results
), -1, 10 );
184 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
187 ba::clamp_range ( a_begin(inputs
), a_end(inputs
), std::back_inserter ( results
), 10, -1, intGreater
);
188 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
190 ba::clamp_range ( in_v
.begin (), in_v
.end (), std::back_inserter ( results
), 10, -1, intGreater
);
191 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
194 ba::clamp_range ( a_range(inputs
), std::back_inserter ( results
), -1, 10 );
195 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
197 ba::clamp_range ( in_v
, std::back_inserter ( results
), -1, 10 );
198 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
201 ba::clamp_range ( a_range(inputs
), std::back_inserter ( results
), 10, -1, intGreater
);
202 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
204 ba::clamp_range ( in_v
, std::back_inserter ( results
), 10, -1, intGreater
);
205 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
208 int junk
[elementsof(inputs
)];
209 ba::clamp_range ( inputs
, junk
, 10, -1, intGreater
);
210 BOOST_CHECK ( std::equal ( b_e(junk
), outputs
));
213 void test_constexpr()
216 // Inside the range, equal to the endpoints, and outside the endpoints.
218 BOOST_CXX14_CONSTEXPR
bool check_inside
= (3 == ba::clamp ( 3, 1, 10 ));
219 BOOST_CHECK(check_inside
);
220 BOOST_CXX14_CONSTEXPR
bool check_min
= (1 == ba::clamp ( 1, 1, 10 ));
221 BOOST_CHECK(check_min
);
222 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (1 == ba::clamp ( 0, 1, 10 ));
223 BOOST_CHECK(check_min_out
);
224 BOOST_CXX14_CONSTEXPR
bool check_max
= (10 == ba::clamp ( 10, 1, 10 ));
225 BOOST_CHECK(check_max
);
226 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (10 == ba::clamp ( 11, 1, 10 ));
227 BOOST_CHECK(check_max_out
);
230 BOOST_CXX14_CONSTEXPR
bool check_inside
= (3 == ba::clamp ( 3, 10, 1, intGreater
));
231 BOOST_CHECK(check_inside
);
232 BOOST_CXX14_CONSTEXPR
bool check_min
= (1 == ba::clamp ( 1, 10, 1, intGreater
));
233 BOOST_CHECK(check_min
);
234 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (1 == ba::clamp ( 0, 10, 1, intGreater
));
235 BOOST_CHECK(check_min_out
);
236 BOOST_CXX14_CONSTEXPR
bool check_max
= (10 == ba::clamp ( 10, 10, 1, intGreater
));
237 BOOST_CHECK(check_max
);
238 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (10 == ba::clamp ( 11, 10, 1, intGreater
));
239 BOOST_CHECK(check_max_out
);
244 BOOST_CXX14_CONSTEXPR
bool check_inside
= (-3 == ba::clamp ( -3, -10, -1 ));
245 BOOST_CHECK(check_inside
);
246 BOOST_CXX14_CONSTEXPR
bool check_max
= (-1 == ba::clamp ( -1, -10, -1 ));
247 BOOST_CHECK(check_max
);
248 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (-1 == ba::clamp ( 0, -10, -1 ));
249 BOOST_CHECK(check_max_out
);
250 BOOST_CXX14_CONSTEXPR
bool check_min
= (-10 == ba::clamp ( -10, -10, -1 ));
251 BOOST_CHECK(check_min
);
252 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (-10 == ba::clamp ( -11, -10, -1 ));
253 BOOST_CHECK(check_min_out
);
256 // Mixed positive and negative numbers
258 BOOST_CXX14_CONSTEXPR
bool check_inside
= (5 == ba::clamp ( 5, -10, 10 ));
259 BOOST_CHECK(check_inside
);
260 BOOST_CXX14_CONSTEXPR
bool check_min
= (-10 == ba::clamp ( -10, -10, 10 ));
261 BOOST_CHECK(check_min
);
262 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (-10 == ba::clamp ( -15, -10, 10 ));
263 BOOST_CHECK(check_min_out
);
264 BOOST_CXX14_CONSTEXPR
bool check_max
= (10 == ba::clamp ( 10, -10, 10 ));
265 BOOST_CHECK(check_max
);
266 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (10 == ba::clamp ( 15, -10, 10 ));
267 BOOST_CHECK(check_max_out
);
271 BOOST_CXX14_CONSTEXPR
bool check_inside
= (5U == ba::clamp ( 5U, 1U, 10U ));
272 BOOST_CHECK(check_inside
);
273 BOOST_CXX14_CONSTEXPR
bool check_min
= (1U == ba::clamp ( 1U, 1U, 10U ));
274 BOOST_CHECK(check_min
);
275 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (1U == ba::clamp ( 0U, 1U, 10U ));
276 BOOST_CHECK(check_min_out
);
277 BOOST_CXX14_CONSTEXPR
bool check_max
= (10U == ba::clamp ( 10U, 1U, 10U ));
278 BOOST_CHECK(check_max
);
279 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (10U == ba::clamp ( 15U, 1U, 10U ));
280 BOOST_CHECK(check_max_out
);
284 BOOST_CXX14_CONSTEXPR
bool check_inside
= (5U == ba::clamp ( 5U, 1, 10 ));
285 BOOST_CHECK(check_inside
);
286 BOOST_CXX14_CONSTEXPR
bool check_min
= (1U == ba::clamp ( 1U, 1, 10 ));
287 BOOST_CHECK(check_min
);
288 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (1U == ba::clamp ( 0U, 1, 10 ));
289 BOOST_CHECK(check_min_out
);
290 BOOST_CXX14_CONSTEXPR
bool check_max
= (10U == ba::clamp ( 10U, 1, 10 ));
291 BOOST_CHECK(check_max
);
292 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (10U == ba::clamp ( 15U, 1, 10 ));
293 BOOST_CHECK(check_max_out
);
297 BOOST_CXX14_CONSTEXPR
bool check_inside
= (5U == ba::clamp ( 5U, 1, 10. ));
298 BOOST_CHECK(check_inside
);
299 BOOST_CXX14_CONSTEXPR
bool check_min
= (1U == ba::clamp ( 1U, 1, 10. ));
300 BOOST_CHECK(check_min
);
301 BOOST_CXX14_CONSTEXPR
bool check_min_out
= (1U == ba::clamp ( 0U, 1, 10. ));
302 BOOST_CHECK(check_min_out
);
303 BOOST_CXX14_CONSTEXPR
bool check_max
= (10U == ba::clamp ( 10U, 1, 10. ));
304 BOOST_CHECK(check_max
);
305 BOOST_CXX14_CONSTEXPR
bool check_max_out
= (10U == ba::clamp ( 15U, 1, 10. ));
306 BOOST_CHECK(check_max_out
);
309 BOOST_CXX14_CONSTEXPR
short foo
= 50;
310 BOOST_CXX14_CONSTEXPR
bool check_float
= ( 56 == ba::clamp ( foo
, 56.9, 129 ));
311 BOOST_CHECK(check_float
);
312 BOOST_CXX14_CONSTEXPR
bool check_over
= ( 24910 == ba::clamp ( foo
, 12345678, 123456999 ));
313 BOOST_CHECK(check_over
);
317 BOOST_AUTO_TEST_CASE( test_main
)
326 // test_float_range ();
327 // test_custom_range ();