30 #ifndef _GLIBCXX_INTCMP_H 31 #define _GLIBCXX_INTCMP_H 1 33 #ifdef _GLIBCXX_SYSHDR 34 #pragma GCC system_header 39 #ifdef __glibcxx_integer_comparison_functions // C++ >= 20 44 namespace std _GLIBCXX_VISIBILITY(default)
46 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
typename _Tp,
typename _Up>
50 cmp_equal(_Tp __t, _Up __u) noexcept
52 static_assert(__is_signed_or_unsigned_integer<_Tp>::value);
53 static_assert(__is_signed_or_unsigned_integer<_Up>::value);
55 if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
57 else if constexpr (is_signed_v<_Tp>)
58 return __t >= 0 && make_unsigned_t<_Tp>(__t) == __u;
60 return __u >= 0 && __t == make_unsigned_t<_Up>(__u);
63 template<
typename _Tp,
typename _Up>
65 cmp_not_equal(_Tp __t, _Up __u) noexcept
66 {
return !std::cmp_equal(__t, __u); }
68 template<
typename _Tp,
typename _Up>
70 cmp_less(_Tp __t, _Up __u) noexcept
72 static_assert(__is_signed_or_unsigned_integer<_Tp>::value);
73 static_assert(__is_signed_or_unsigned_integer<_Up>::value);
75 if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
77 else if constexpr (is_signed_v<_Tp>)
78 return __t < 0 || make_unsigned_t<_Tp>(__t) < __u;
80 return __u >= 0 && __t < make_unsigned_t<_Up>(__u);
83 template<
typename _Tp,
typename _Up>
85 cmp_greater(_Tp __t, _Up __u) noexcept
86 {
return std::cmp_less(__u, __t); }
88 template<
typename _Tp,
typename _Up>
90 cmp_less_equal(_Tp __t, _Up __u) noexcept
91 {
return !std::cmp_less(__u, __t); }
93 template<
typename _Tp,
typename _Up>
95 cmp_greater_equal(_Tp __t, _Up __u) noexcept
96 {
return !std::cmp_less(__t, __u); }
98 template<
typename _Res,
typename _Tp>
100 in_range(_Tp __t) noexcept
102 static_assert(__is_signed_or_unsigned_integer<_Res>::value);
103 static_assert(__is_signed_or_unsigned_integer<_Tp>::value);
106 if constexpr (is_signed_v<_Tp> == is_signed_v<_Res>)
107 return __int_traits<_Res>::__min <= __t
108 && __t <= __int_traits<_Res>::__max;
109 else if constexpr (is_signed_v<_Tp>)
111 && make_unsigned_t<_Tp>(__t) <= __int_traits<_Res>::__max;
113 return __t <= make_unsigned_t<_Res>(__int_traits<_Res>::__max);
116 _GLIBCXX_END_NAMESPACE_VERSION
119 #endif // __glibcxx_integer_comparison_functions 120 #endif // _GLIBCXX_INTCMP_H ISO C++ entities toplevel namespace is std.
__numeric_traits_integer< _Tp > __int_traits
Convenience alias for __numeric_traits<integer-type>.