]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/algorithm/test/clamp_test.cpp
3519659818ed82cf56fadbc157bb9c4788dea3e9
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 bool intGreater ( int lhs
, int rhs
) { return lhs
> rhs
; }
18 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 ));
49 BOOST_CHECK_EQUAL ( 3, ba::clamp ( 3, 10, 1, intGreater
));
50 BOOST_CHECK_EQUAL ( 1, ba::clamp ( 1, 10, 1, intGreater
));
51 BOOST_CHECK_EQUAL ( 1, ba::clamp ( 0, 10, 1, intGreater
));
52 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 10, 10, 1, intGreater
));
53 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 11, 10, 1, intGreater
));
56 BOOST_CHECK_EQUAL ( -3, ba::clamp ( -3, -10, -1 ));
57 BOOST_CHECK_EQUAL ( -1, ba::clamp ( -1, -10, -1 ));
58 BOOST_CHECK_EQUAL ( -1, ba::clamp ( 0, -10, -1 ));
59 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -10, -10, -1 ));
60 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -11, -10, -1 ));
62 // Mixed positive and negative numbers
63 BOOST_CHECK_EQUAL ( 5, ba::clamp ( 5, -10, 10 ));
64 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -10, -10, 10 ));
65 BOOST_CHECK_EQUAL ( -10, ba::clamp ( -15, -10, 10 ));
66 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 10, -10, 10 ));
67 BOOST_CHECK_EQUAL ( 10, ba::clamp ( 15, -10, 10 ));
70 BOOST_CHECK_EQUAL ( 5U, ba::clamp ( 5U, 1U, 10U ));
71 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 1U, 1U, 10U ));
72 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 0U, 1U, 10U ));
73 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 10U, 1U, 10U ));
74 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 15U, 1U, 10U ));
77 BOOST_CHECK_EQUAL ( 5U, ba::clamp ( 5U, 1, 10 ));
78 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 1U, 1, 10 ));
79 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 0U, 1, 10 ));
80 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 10U, 1, 10 ));
81 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 15U, 1, 10 ));
84 BOOST_CHECK_EQUAL ( 5U, ba::clamp ( 5U, 1, 10. ));
85 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 1U, 1, 10. ));
86 BOOST_CHECK_EQUAL ( 1U, ba::clamp ( 0U, 1, 10. ));
87 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 10U, 1, 10. ));
88 BOOST_CHECK_EQUAL ( 10U, ba::clamp ( 15U, 1, 10. ));
91 BOOST_CHECK_EQUAL ( 56, ba::clamp ( foo
, 56.9, 129 ));
92 BOOST_CHECK_EQUAL ( 24910, ba::clamp ( foo
, 12345678, 123456999 ));
99 // Inside the range, equal to the endpoints, and outside the endpoints.
100 BOOST_CHECK_EQUAL ( 3.0, ba::clamp ( 3.0, 1.0, 10.0 ));
101 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 1.0, 1.0, 10.0 ));
102 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 0.0, 1.0, 10.0 ));
103 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 10.0, 1.0, 10.0 ));
104 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 11.0, 1.0, 10.0 ));
106 BOOST_CHECK_EQUAL ( 3.0, ba::clamp ( 3.0, 10.0, 1.0, doubleGreater
));
107 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 1.0, 10.0, 1.0, doubleGreater
));
108 BOOST_CHECK_EQUAL ( 1.0, ba::clamp ( 0.0, 10.0, 1.0, doubleGreater
));
109 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 10.0, 10.0, 1.0, doubleGreater
));
110 BOOST_CHECK_EQUAL ( 10.0, ba::clamp ( 11.0, 10.0, 1.0, doubleGreater
));
113 BOOST_CHECK_EQUAL ( -3.f
, ba::clamp ( -3.f
, -10.f
, -1.f
));
114 BOOST_CHECK_EQUAL ( -1.f
, ba::clamp ( -1.f
, -10.f
, -1.f
));
115 BOOST_CHECK_EQUAL ( -1.f
, ba::clamp ( 0.f
, -10.f
, -1.f
));
116 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10.f
, -1.f
));
117 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -11.f
, -10.f
, -1.f
));
119 // Mixed positive and negative numbers
120 BOOST_CHECK_EQUAL ( 5.f
, ba::clamp ( 5.f
, -10.f
, 10.f
));
121 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10.f
, 10.f
));
122 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -15.f
, -10.f
, 10.f
));
123 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 10.f
, -10.f
, 10.f
));
124 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 15.f
, -10.f
, 10.f
));
127 BOOST_CHECK_EQUAL ( 5.f
, ba::clamp ( 5.f
, -10., 10. ));
128 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10., 10. ));
129 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -15.f
, -10., 10. ));
130 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 10.f
, -10., 10. ));
131 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 15.f
, -10., 10. ));
134 BOOST_CHECK_EQUAL ( 5.f
, ba::clamp ( 5.f
, -10, 10 ));
135 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -10.f
, -10, 10 ));
136 BOOST_CHECK_EQUAL ( -10.f
, ba::clamp ( -15.f
, -10, 10 ));
137 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 10.f
, -10, 10 ));
138 BOOST_CHECK_EQUAL ( 10.f
, ba::clamp ( 15.f
, -10, 10 ));
144 // Inside the range, equal to the endpoints, and outside the endpoints.
145 BOOST_CHECK_EQUAL ( custom( 3), ba::clamp ( custom( 3), custom(1), custom(10)));
146 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 1), custom(1), custom(10)));
147 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 0), custom(1), custom(10)));
148 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(10), custom(1), custom(10)));
149 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(11), custom(1), custom(10)));
151 BOOST_CHECK_EQUAL ( custom( 3), ba::clamp ( custom( 3), custom(1), custom(10), customLess
));
152 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 1), custom(1), custom(10), customLess
));
153 BOOST_CHECK_EQUAL ( custom( 1), ba::clamp ( custom( 0), custom(1), custom(10), customLess
));
154 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(10), custom(1), custom(10), customLess
));
155 BOOST_CHECK_EQUAL ( custom(10), ba::clamp ( custom(11), custom(1), custom(10), customLess
));
158 // BOOST_CHECK_EQUAL ( custom(1), ba::clamp ( custom(11), custom(1), custom(10)));
161 #define elementsof(v) (sizeof (v) / sizeof (v[0]))
162 #define a_begin(v) (&v[0])
163 #define a_end(v) (v + elementsof (v))
165 #define b_e(v) a_begin(v),a_end(v)
167 void test_int_range ()
169 int inputs
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 99, 999, -1, -3, -99, 234234 };
170 int outputs
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, -1, -1, -1, 10 };
171 std::vector
<int> results
;
172 std::vector
<int> in_v
;
174 std::copy ( a_begin(inputs
), a_end(inputs
), std::back_inserter ( in_v
));
176 ba::clamp_range ( a_begin(inputs
), a_end(inputs
), std::back_inserter ( results
), -1, 10 );
177 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
179 ba::clamp_range ( in_v
.begin (), in_v
.end (), std::back_inserter ( results
), -1, 10 );
180 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
183 ba::clamp_range ( a_begin(inputs
), a_end(inputs
), std::back_inserter ( results
), 10, -1, intGreater
);
184 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
186 ba::clamp_range ( in_v
.begin (), in_v
.end (), std::back_inserter ( results
), 10, -1, intGreater
);
187 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
190 ba::clamp_range ( a_range(inputs
), std::back_inserter ( results
), -1, 10 );
191 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
193 ba::clamp_range ( in_v
, std::back_inserter ( results
), -1, 10 );
194 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
197 ba::clamp_range ( a_range(inputs
), std::back_inserter ( results
), 10, -1, intGreater
);
198 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
200 ba::clamp_range ( in_v
, std::back_inserter ( results
), 10, -1, intGreater
);
201 BOOST_CHECK ( std::equal ( results
.begin(), results
.end (), outputs
));
204 int junk
[elementsof(inputs
)];
205 ba::clamp_range ( inputs
, junk
, 10, -1, intGreater
);
206 BOOST_CHECK ( std::equal ( b_e(junk
), outputs
));
209 BOOST_AUTO_TEST_CASE( test_main
)
216 // test_float_range ();
217 // test_custom_range ();