29 #ifndef _GLIBCXX_STDCKDINT_H
30 #define _GLIBCXX_STDCKDINT_H
32 #if __cplusplus > 202302L
33 #include <type_traits>
36 #define __STDC_VERSION_STDCKDINT_H__ 202311L
38 #ifndef _GLIBCXX_DOXYGEN
40 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
61 template<
typename _Tp1,
typename _Tp2,
typename _Tp3>
63 ckd_add(_Tp1* __result, _Tp2 __a, _Tp3 __b)
65 static_assert(std::__is_signed_or_unsigned_integer<_Tp1>::value);
66 static_assert(std::__is_signed_or_unsigned_integer<_Tp2>::value);
67 static_assert(std::__is_signed_or_unsigned_integer<_Tp3>::value);
68 return __builtin_add_overflow(__a, __b, __result);
71 template<
typename _Tp1,
typename _Tp2,
typename _Tp3>
73 ckd_sub(_Tp1* __result, _Tp2 __a, _Tp3 __b)
75 static_assert(std::__is_signed_or_unsigned_integer<_Tp1>::value);
76 static_assert(std::__is_signed_or_unsigned_integer<_Tp2>::value);
77 static_assert(std::__is_signed_or_unsigned_integer<_Tp3>::value);
78 return __builtin_sub_overflow(__a, __b, __result);
81 template<
typename _Tp1,
typename _Tp2,
typename _Tp3>
83 ckd_mul(_Tp1* __result, _Tp2 __a, _Tp3 __b)
85 static_assert(std::__is_signed_or_unsigned_integer<_Tp1>::value);
86 static_assert(std::__is_signed_or_unsigned_integer<_Tp2>::value);
87 static_assert(std::__is_signed_or_unsigned_integer<_Tp3>::value);
88 return __builtin_mul_overflow(__a, __b, __result);
91 #ifndef _GLIBCXX_DOXYGEN
94 using __gnu_cxx::ckd_add;
95 using __gnu_cxx::ckd_sub;
96 using __gnu_cxx::ckd_mul;
101 #endif // _GLIBCXX_STDCKDINT_H