Skip to content

Commit 6ebd484

Browse files
committed
Add is_max/is_min, tests.
1 parent 3fa06ef commit 6ebd484

3 files changed

Lines changed: 79 additions & 0 deletions

File tree

include/bitcoin/system/impl/math/limits.ipp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ constexpr Result limit(Integer value, Result minimum, Result maximum) NOEXCEPT
7878
// Integral bounds (dispatch for absolute_min/unsigned_max).
7979
// ----------------------------------------------------------------------------
8080

81+
template <typename Integer, if_integer<Integer>>
82+
constexpr bool is_max(Integer value) NOEXCEPT
83+
{
84+
return value == system::maximum<Integer>;
85+
}
86+
87+
template <typename Integer, if_integer<Integer>>
88+
constexpr bool is_min(Integer value) NOEXCEPT
89+
{
90+
return value == system::minimum<Integer>;
91+
}
92+
8193
template <typename Signed, if_signed_integral_integer<Signed>>
8294
constexpr to_unsigned_type<Signed> absolute_minimum() NOEXCEPT
8395
{

include/bitcoin/system/math/limits.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ constexpr Integer maximum = std::numeric_limits<Integer>::max();
7272
template <typename Integer, if_integer<Integer> = true>
7373
constexpr Integer minimum = std::numeric_limits<Integer>::min();
7474

75+
/// Is the maximum/minimum value of a integral integer?
76+
template <typename Integer, if_integer<Integer> = true>
77+
constexpr bool is_max(Integer value) NOEXCEPT;
78+
template <typename Integer, if_integer<Integer> = true>
79+
constexpr bool is_min(Integer value) NOEXCEPT;
80+
7581
// dispatch for absolute_min/unsigned_max
7682
template <typename Signed, if_signed_integral_integer<Signed> = true>
7783
constexpr to_unsigned_type<Signed> absolute_minimum() NOEXCEPT;

test/math/limits.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,37 @@ static_assert(minimum<uint64_t> == min_uint64);
177177
static_assert(minimum<uintx_t<42>> == zero);
178178
static_assert(is_same_type<decltype(minimum<int64_t>), const int64_t>);
179179

180+
// is_min
181+
182+
static_assert(is_min<int8_t >(min_int8));
183+
static_assert(is_min<int8_t >(min_int8));
184+
static_assert(is_min<int16_t>(min_int16));
185+
static_assert(is_min<int32_t>(min_int32));
186+
static_assert(is_min<int64_t>(min_int64));
187+
static_assert(is_min<uint8_t >(min_uint8));
188+
static_assert(is_min<uint16_t>(min_uint16));
189+
static_assert(is_min<uint32_t>(min_uint32));
190+
static_assert(is_min<uint64_t>(min_uint64));
191+
static_assert(!is_min<int8_t >(max_int8));
192+
static_assert(!is_min<int16_t>(max_int16));
193+
static_assert(!is_min<int32_t>(max_int32));
194+
static_assert(!is_min<int64_t>(max_int64));
195+
static_assert(!is_min<uint8_t >(max_uint8));
196+
static_assert(!is_min<uint16_t>(max_uint16));
197+
static_assert(!is_min<uint32_t>(max_uint32));
198+
static_assert(!is_min<uint64_t>(max_uint64));
199+
static_assert(!is_min<int8_t >(add1(min_int8)));
200+
static_assert(!is_min<int8_t >(add1(min_int8)));
201+
static_assert(!is_min<int16_t>(add1(min_int16)));
202+
static_assert(!is_min<int32_t>(add1(min_int32)));
203+
static_assert(!is_min<int64_t>(add1(min_int64)));
204+
static_assert(!is_min<uint8_t >(add1(min_uint8)));
205+
static_assert(!is_min<uint16_t>(add1(min_uint16)));
206+
static_assert(!is_min<uint32_t>(add1(min_uint32)));
207+
static_assert(!is_min<uint64_t>(add1(min_uint64)));
208+
static_assert(is_min<uintx_t<42>>(zero));
209+
static_assert(is_same_type<decltype(is_min<int64_t>(0)), bool>);
210+
180211
// maximum<T>
181212

182213
static_assert(maximum<int8_t > == max_int8);
@@ -190,6 +221,36 @@ static_assert(maximum<uint64_t> == max_uint64);
190221
static_assert(maximum<uintx_t<42>> == sub1(power2<uintx_t<42>>(42u)));
191222
static_assert(is_same_type<decltype(maximum<int16_t>), const int16_t>);
192223

224+
// is_max
225+
226+
static_assert(is_max<int8_t >(max_int8));
227+
static_assert(is_max<int16_t>(max_int16));
228+
static_assert(is_max<int32_t>(max_int32));
229+
static_assert(is_max<int64_t>(max_int64));
230+
static_assert(is_max<uint8_t >(max_uint8));
231+
static_assert(is_max<uint16_t>(max_uint16));
232+
static_assert(is_max<uint32_t>(max_uint32));
233+
static_assert(is_max<uint64_t>(max_uint64));
234+
static_assert(!is_max<int8_t >(min_int8));
235+
static_assert(!is_max<int8_t >(min_int8));
236+
static_assert(!is_max<int16_t>(min_int16));
237+
static_assert(!is_max<int32_t>(min_int32));
238+
static_assert(!is_max<int64_t>(min_int64));
239+
static_assert(!is_max<uint8_t >(min_uint8));
240+
static_assert(!is_max<uint16_t>(min_uint16));
241+
static_assert(!is_max<uint32_t>(min_uint32));
242+
static_assert(!is_max<uint64_t>(min_uint64));
243+
static_assert(!is_max<int8_t >(sub1(max_int8)));
244+
static_assert(!is_max<int16_t>(sub1(max_int16)));
245+
static_assert(!is_max<int32_t>(sub1(max_int32)));
246+
static_assert(!is_max<int64_t>(sub1(max_int64)));
247+
static_assert(!is_max<uint8_t >(sub1(max_uint8)));
248+
static_assert(!is_max<uint16_t>(sub1(max_uint16)));
249+
static_assert(!is_max<uint32_t>(sub1(max_uint32)));
250+
static_assert(!is_max<uint64_t>(sub1(max_uint64)));
251+
static_assert(is_max<uintx_t<42>>(sub1(power2<uintx_t<42>>(42u))));
252+
static_assert(is_same_type<decltype(is_max<int16_t>(0)), bool>);
253+
193254
// absolute_min<T>
194255

195256
static_assert(absolute_min<int8_t > == power2(sub1(bits<int8_t>)));

0 commit comments

Comments
 (0)