30#ifndef _GLIBCXX_SAT_ARITH_H
31#define _GLIBCXX_SAT_ARITH_H 1
33#pragma GCC system_header
37#ifdef __glibcxx_saturation_arithmetic
42namespace std _GLIBCXX_VISIBILITY(default)
44_GLIBCXX_BEGIN_NAMESPACE_VERSION
47 template<
typename _Tp>
requires __is_standard_integer<_Tp>::value
49 add_sat(_Tp __x, _Tp __y)
noexcept
52 if (!__builtin_add_overflow(__x, __y, &__z))
54 if constexpr (is_unsigned_v<_Tp>)
55 return __gnu_cxx::__int_traits<_Tp>::__max;
57 return __gnu_cxx::__int_traits<_Tp>::__min;
59 return __gnu_cxx::__int_traits<_Tp>::__max;
63 template<
typename _Tp>
requires __is_standard_integer<_Tp>::value
65 sub_sat(_Tp __x, _Tp __y)
noexcept
68 if (!__builtin_sub_overflow(__x, __y, &__z))
70 if constexpr (is_unsigned_v<_Tp>)
71 return __gnu_cxx::__int_traits<_Tp>::__min;
73 return __gnu_cxx::__int_traits<_Tp>::__min;
75 return __gnu_cxx::__int_traits<_Tp>::__max;
79 template<
typename _Tp>
requires __is_standard_integer<_Tp>::value
81 mul_sat(_Tp __x, _Tp __y)
noexcept
84 if (!__builtin_mul_overflow(__x, __y, &__z))
86 if constexpr (is_unsigned_v<_Tp>)
87 return __gnu_cxx::__int_traits<_Tp>::__max;
88 else if (__x < 0 != __y < 0)
89 return __gnu_cxx::__int_traits<_Tp>::__min;
91 return __gnu_cxx::__int_traits<_Tp>::__max;
95 template<
typename _Tp>
requires __is_standard_integer<_Tp>::value
97 div_sat(_Tp __x, _Tp __y)
noexcept
99 __glibcxx_assert(__y != 0);
100 if constexpr (is_signed_v<_Tp>)
101 if (__x == __gnu_cxx::__int_traits<_Tp>::__min && __y == _Tp(-1))
102 return __gnu_cxx::__int_traits<_Tp>::__max;
107 template<
typename _Res,
typename _Tp>
108 requires __is_standard_integer<_Res>::value
109 && __is_standard_integer<_Tp>::value
111 saturate_cast(_Tp __x)
noexcept
113 constexpr int __digits_R = __gnu_cxx::__int_traits<_Res>::__digits;
114 constexpr int __digits_T = __gnu_cxx::__int_traits<_Tp>::__digits;
115 constexpr _Res __max_Res = __gnu_cxx::__int_traits<_Res>::__max;
117 if constexpr (is_signed_v<_Res> == is_signed_v<_Tp>)
119 if constexpr (__digits_R < __digits_T)
121 constexpr _Res __min_Res = __gnu_cxx::__int_traits<_Res>::__min;
123 if (__x <
static_cast<_Tp
>(__min_Res))
125 else if (__x >
static_cast<_Tp
>(__max_Res))
129 else if constexpr (is_signed_v<_Tp>)
134 return __gnu_cxx::__int_traits<_Res>::__max;
141 return static_cast<_Res
>(__x);
144_GLIBCXX_END_NAMESPACE_VERSION
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
ISO C++ entities toplevel namespace is std.