Scroll to navigation

std::saturate_cast(3) C++ Standard Libary std::saturate_cast(3)

NAME

std::saturate_cast - std::saturate_cast

Synopsis


Defined in header <numeric>
template< class T, class U > (since C++26)
constexpr T saturate_cast( U x ) noexcept;


Converts the value x to a value of type T, clamping x between the minimum and
maximum values of type T.


It is a compile-time error if either T or U is not a signed or unsigned integer type
(including standard integer type and extended integer type).

Parameters


x - an integer value

Return value


* x, if x is representable as a value of type T. Otherwise,
* either the largest or smallest representable value of type T, whichever is
closer to the value of x.

Exceptions


Throws no exceptions.

Notes


Feature-test macro Value Std Feature
__cpp_lib_saturation_arithmetic 202311L (C++26) Saturation arithmetic

Possible implementation


See libstdc++ (gcc).

Example


Can be previewed on Compiler Explorer.

// Run this code


#include <cstdint>
#include <limits>
#include <numeric>


int main()
{
constexpr std::int16_t x1{696};


constexpr std::int8_t x2 = std::saturate_cast<std::int8_t>(x1);
static_assert(x2 == std::numeric_limits<std::int8_t>::max());


constexpr std::uint8_t x3 = std::saturate_cast<std::uint8_t>(x1);
static_assert(x3 == std::numeric_limits<std::uint8_t>::max());


constexpr std::int16_t y1{-696};


constexpr std::int8_t y2 = std::saturate_cast<std::int8_t>(y1);
static_assert(y2 == std::numeric_limits<std::int8_t>::min());


constexpr std::uint8_t y3 = std::saturate_cast<std::uint8_t>(y1);
static_assert(y3 == 0);
}

See also


bit_cast reinterpret the object representation of one type as that of another
(C++20) (function template)
clamp clamps a value between a pair of boundary values
(C++17) (function template)
in_range checks if an integer value is in the range of a given integer type
(C++20) (function template)

2024.06.10 http://cppreference.com