29#ifndef _GLIBCXX_STDCKDINT_H
30#define _GLIBCXX_STDCKDINT_H
32#define __glibcxx_want_stdckdint_h
35#ifdef __cpp_lib_stdckdint_h
40#define __STDC_VERSION_STDCKDINT_H__ 202311L
42#ifndef _GLIBCXX_DOXYGEN
44namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
50 template<
typename _Tp>
51 concept __cv_unqual_signed_or_unsigned_integer_type
52 = std::same_as<_Tp, std::remove_cv_t<_Tp>>
53 && std::__is_standard_integer<_Tp>::value;
74template<
typename _Tp1,
typename _Tp2,
typename _Tp3>
76 ckd_add(_Tp1* __result, _Tp2 __a, _Tp3 __b)
78 using __gnu_cxx::__detail::__cv_unqual_signed_or_unsigned_integer_type;
79 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp1>);
80 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp2>);
81 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp3>);
82 return __builtin_add_overflow(__a, __b, __result);
85template<
typename _Tp1,
typename _Tp2,
typename _Tp3>
87 ckd_sub(_Tp1* __result, _Tp2 __a, _Tp3 __b)
89 using __gnu_cxx::__detail::__cv_unqual_signed_or_unsigned_integer_type;
90 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp1>);
91 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp2>);
92 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp3>);
93 return __builtin_sub_overflow(__a, __b, __result);
96template<
typename _Tp1,
typename _Tp2,
typename _Tp3>
98 ckd_mul(_Tp1* __result, _Tp2 __a, _Tp3 __b)
100 using __gnu_cxx::__detail::__cv_unqual_signed_or_unsigned_integer_type;
101 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp1>);
102 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp2>);
103 static_assert(__cv_unqual_signed_or_unsigned_integer_type<_Tp3>);
104 return __builtin_mul_overflow(__a, __b, __result);
107#ifndef _GLIBCXX_DOXYGEN
110using __gnu_cxx::ckd_add;
111using __gnu_cxx::ckd_sub;
112using __gnu_cxx::ckd_mul;
GNU extensions for public use.
Implementation details not part of the namespace __gnu_cxx interface.