<limits> Support
Description
The library provides std::numeric_limits specializations for all safe integer types.
These specializations delegate to the underlying type’s numeric_limits, ensuring consistent behavior with the built-in types.
#include <boost/safe_numbers/limits.hpp>
namespace std {
template <>
struct numeric_limits<boost::safe_numbers::u8>;
template <>
struct numeric_limits<boost::safe_numbers::u16>;
template <>
struct numeric_limits<boost::safe_numbers::u32>;
template <>
struct numeric_limits<boost::safe_numbers::u64>;
template <>
struct numeric_limits<boost::safe_numbers::u128>;
} // namespace std
Specialization
Each specialization has the following structure, where T is the safe integer type and basis_type is its underlying integer type:
namespace std {
template <>
struct numeric_limits<T>
{
using basis_type = typename T::basis_type;
// Static member constants
static constexpr bool is_specialized = std::numeric_limits<basis_type>::is_specialized;
static constexpr bool is_signed = std::numeric_limits<basis_type>::is_signed;
static constexpr bool is_integer = std::numeric_limits<basis_type>::is_integer;
static constexpr bool is_exact = std::numeric_limits<basis_type>::is_exact;
static constexpr bool has_infinity = std::numeric_limits<basis_type>::has_infinity;
static constexpr bool has_quiet_NaN = std::numeric_limits<basis_type>::has_quiet_NaN;
static constexpr bool has_signaling_NaN = std::numeric_limits<basis_type>::has_signaling_NaN;
// Deprecated in C++23
static constexpr std::float_denorm_style has_denorm = std::numeric_limits<basis_type>::has_denorm;
static constexpr bool has_denorm_loss = std::numeric_limits<basis_type>::has_denorm_loss;
static constexpr std::float_round_style round_style = std::numeric_limits<basis_type>::round_style;
static constexpr bool is_iec559 = std::numeric_limits<basis_type>::is_iec559;
static constexpr bool is_bounded = std::numeric_limits<basis_type>::is_bounded;
static constexpr bool is_modulo = std::numeric_limits<basis_type>::is_modulo;
static constexpr int digits = std::numeric_limits<basis_type>::digits;
static constexpr int digits10 = std::numeric_limits<basis_type>::digits10;
static constexpr int max_digits10 = std::numeric_limits<basis_type>::max_digits10;
static constexpr int radix = std::numeric_limits<basis_type>::radix;
static constexpr int min_exponent = std::numeric_limits<basis_type>::min_exponent;
static constexpr int min_exponent10 = std::numeric_limits<basis_type>::min_exponent10;
static constexpr int max_exponent = std::numeric_limits<basis_type>::max_exponent;
static constexpr int max_exponent10 = std::numeric_limits<basis_type>::max_exponent10;
static constexpr bool traps = std::numeric_limits<basis_type>::traps;
static constexpr bool tinyness_before = std::numeric_limits<basis_type>::tinyness_before;
// Static member functions
static constexpr T min() noexcept;
static constexpr T max() noexcept;
static constexpr T lowest() noexcept;
static constexpr T epsilon() noexcept;
static constexpr T round_error() noexcept;
static constexpr T infinity() noexcept;
static constexpr T quiet_NaN() noexcept;
static constexpr T signaling_NaN() noexcept;
static constexpr T denorm_min() noexcept;
};
} // namespace std
Member Constants
For unsigned integer types, the following values are consistent across all specializations:
| Member | Value | Description |
|---|---|---|
|
|
Type has a specialization |
|
|
Type is unsigned |
|
|
Type represents integers |
|
|
Type uses exact representations |
|
|
Type cannot represent infinity |
|
|
Type cannot represent quiet NaN |
|
|
Type cannot represent signaling NaN |
|
|
Type does not have denormalized values |
|
|
No denormalization loss |
|
|
Rounding truncates toward zero |
|
|
Not IEC 559 (IEEE 754) compliant |
|
|
Type has finite range |
|
|
Overflow does not wrap (throws instead) |
|
|
Binary representation |
|
|
Not applicable for integers |
|
|
Not applicable for integers |
|
|
Not applicable for integers |
|
|
Not applicable for integers |
|
platform-dependent |
Whether arithmetic traps |
|
|
Not applicable for integers |
Type-Specific Values
| Type | digits |
digits10 |
max_digits10 |
|---|---|---|---|
|
8 |
2 |
3 |
|
16 |
4 |
5 |
|
32 |
9 |
10 |
|
64 |
18 |
20 |
|
128 |
38 |
39 |
Member Functions
static constexpr T min() noexcept;
Returns the minimum finite value (always T{0} for unsigned types).
static constexpr T max() noexcept;
Returns the maximum finite value.
static constexpr T lowest() noexcept;
Returns the lowest finite value (same as min() for unsigned types).
static constexpr T epsilon() noexcept;
Returns T{0} (not meaningful for integer types).
static constexpr T round_error() noexcept;
Returns T{0} (not meaningful for integer types).
static constexpr T infinity() noexcept;
Returns T{0} (unsigned integers cannot represent infinity).
static constexpr T quiet_NaN() noexcept;
Returns T{0} (unsigned integers cannot represent NaN).
static constexpr T signaling_NaN() noexcept;
Returns T{0} (unsigned integers cannot represent NaN).
static constexpr T denorm_min() noexcept;
Returns T{0} (not meaningful for integer types).