@@ -25,10 +25,10 @@ _LIBCPP_PUSH_MACROS
25
25
26
26
_LIBCPP_BEGIN_NAMESPACE_STD
27
27
28
- #if _LIBCPP_STD_VER >= 26
28
+ #if _LIBCPP_STD_VER >= 20
29
29
30
30
template <__libcpp_integer _Tp>
31
- _LIBCPP_HIDE_FROM_ABI constexpr _Tp add_sat (_Tp __x, _Tp __y) noexcept {
31
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp __add_sat (_Tp __x, _Tp __y) noexcept {
32
32
if (_Tp __sum; !__builtin_add_overflow (__x, __y, &__sum))
33
33
return __sum;
34
34
// Handle overflow
@@ -46,7 +46,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Tp add_sat(_Tp __x, _Tp __y) noexcept {
46
46
}
47
47
48
48
template <__libcpp_integer _Tp>
49
- _LIBCPP_HIDE_FROM_ABI constexpr _Tp sub_sat (_Tp __x, _Tp __y) noexcept {
49
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp __sub_sat (_Tp __x, _Tp __y) noexcept {
50
50
if (_Tp __sub; !__builtin_sub_overflow (__x, __y, &__sub))
51
51
return __sub;
52
52
// Handle overflow
@@ -65,7 +65,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Tp sub_sat(_Tp __x, _Tp __y) noexcept {
65
65
}
66
66
67
67
template <__libcpp_integer _Tp>
68
- _LIBCPP_HIDE_FROM_ABI constexpr _Tp mul_sat (_Tp __x, _Tp __y) noexcept {
68
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp __mul_sat (_Tp __x, _Tp __y) noexcept {
69
69
if (_Tp __mul; !__builtin_mul_overflow (__x, __y, &__mul))
70
70
return __mul;
71
71
// Handle overflow
@@ -81,7 +81,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Tp mul_sat(_Tp __x, _Tp __y) noexcept {
81
81
}
82
82
83
83
template <__libcpp_integer _Tp>
84
- _LIBCPP_HIDE_FROM_ABI constexpr _Tp div_sat (_Tp __x, _Tp __y) noexcept {
84
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp __div_sat (_Tp __x, _Tp __y) noexcept {
85
85
_LIBCPP_ASSERT_UNCATEGORIZED (__y != 0 , " Division by 0 is undefined" );
86
86
if constexpr (__libcpp_unsigned_integer<_Tp>) {
87
87
return __x / __y;
@@ -94,7 +94,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Tp div_sat(_Tp __x, _Tp __y) noexcept {
94
94
}
95
95
96
96
template <__libcpp_integer _Rp, __libcpp_integer _Tp>
97
- _LIBCPP_HIDE_FROM_ABI constexpr _Rp saturate_cast (_Tp __x) noexcept {
97
+ _LIBCPP_HIDE_FROM_ABI constexpr _Rp __saturate_cast (_Tp __x) noexcept {
98
98
// Saturation is impossible edge case when ((min _Rp) < (min _Tp) && (max _Rp) > (max _Tp)) and it is expected to be
99
99
// optimized out by the compiler.
100
100
@@ -107,6 +107,35 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Rp saturate_cast(_Tp __x) noexcept {
107
107
return static_cast <_Rp>(__x);
108
108
}
109
109
110
+ #endif // _LIBCPP_STD_VER >= 20
111
+
112
+ #if _LIBCPP_STD_VER >= 26
113
+
114
+ template <__libcpp_integer _Tp>
115
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp add_sat (_Tp __x, _Tp __y) noexcept {
116
+ return std::add_sat (__x, __y);
117
+ }
118
+
119
+ template <__libcpp_integer _Tp>
120
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp sub_sat (_Tp __x, _Tp __y) noexcept {
121
+ return std::sub_sat (__x, __y);
122
+ }
123
+
124
+ template <__libcpp_integer _Tp>
125
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp mul_sat (_Tp __x, _Tp __y) noexcept {
126
+ return std::mul_sat (__x, __y);
127
+ }
128
+
129
+ template <__libcpp_integer _Tp>
130
+ _LIBCPP_HIDE_FROM_ABI constexpr _Tp div_sat (_Tp __x, _Tp __y) noexcept {
131
+ return std::div_sat (__x, __y);
132
+ }
133
+
134
+ template <__libcpp_integer _Rp, __libcpp_integer _Tp>
135
+ _LIBCPP_HIDE_FROM_ABI constexpr _Rp saturate_cast (_Tp __x) noexcept {
136
+ return std::saturate_cast<_Rp>(__x);
137
+ }
138
+
110
139
#endif // _LIBCPP_STD_VER >= 26
111
140
112
141
_LIBCPP_END_NAMESPACE_STD
0 commit comments