30 #ifndef _GLIBCXX_MAX_SIZE_TYPE_H
31 #define _GLIBCXX_MAX_SIZE_TYPE_H 1
33 #ifdef _GLIBCXX_SYSHDR
34 #pragma GCC system_header
37 #if __cplusplus > 201703L && __cpp_lib_concepts
50 namespace std _GLIBCXX_VISIBILITY(default)
52 _GLIBCXX_BEGIN_NAMESPACE_VERSION
54 template<
typename _Tp>
55 struct numeric_limits;
64 __max_size_type() =
default;
66 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
68 __max_size_type(_Tp __i) noexcept
69 : _M_val(__i), _M_msb(__i < 0)
73 __max_size_type(
const __max_diff_type& __d) noexcept;
75 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
77 operator _Tp() const noexcept
81 operator bool() const noexcept
82 {
return _M_val != 0 || _M_msb != 0; }
84 constexpr __max_size_type
88 constexpr __max_size_type
89 operator~() const noexcept
90 {
return __max_size_type{~_M_val, !_M_msb}; }
92 constexpr __max_size_type
94 {
return operator~() + 1; }
96 constexpr __max_size_type&
98 {
return *
this += 1; }
100 constexpr __max_size_type
101 operator++(
int) noexcept
108 constexpr __max_size_type&
109 operator--() noexcept
110 {
return *
this -= 1; }
112 constexpr __max_size_type
113 operator--(
int) noexcept
120 constexpr __max_size_type&
121 operator+=(
const __max_size_type& __r) noexcept
123 const auto __sum = _M_val + __r._M_val;
124 const bool __overflow = (__sum < _M_val);
125 _M_msb = _M_msb ^ __r._M_msb ^ __overflow;
130 constexpr __max_size_type&
131 operator-=(
const __max_size_type& __r) noexcept
132 {
return *
this += -__r; }
134 constexpr __max_size_type&
135 operator*=(__max_size_type __r) noexcept
137 constexpr __max_size_type __threshold
138 = __rep(1) << (_S_rep_bits / 2 - 1);
139 if (_M_val < __threshold && __r < __threshold)
142 _M_val = _M_val * __r._M_val;
148 const bool __lsb = _M_val & 1;
149 const bool __rlsb = __r._M_val & 1;
152 _M_val = (2 * _M_val * __r._M_val
153 + _M_val * __rlsb + __r._M_val * __lsb);
155 *
this += __rlsb * __lsb;
161 constexpr __max_size_type&
162 operator/=(
const __max_size_type& __r) noexcept
164 __glibcxx_assert(__r != 0);
166 if (!_M_msb && !__r._M_msb) [[likely]]
167 _M_val /= __r._M_val;
168 else if (_M_msb && __r._M_msb)
170 _M_val = (_M_val >= __r._M_val);
173 else if (!_M_msb && __r._M_msb)
175 else if (_M_msb && !__r._M_msb)
181 const auto __orig = *
this;
183 _M_val /= __r._M_val;
185 if (__orig - *
this * __r >= __r)
191 constexpr __max_size_type&
192 operator%=(
const __max_size_type& __r) noexcept
194 if (!_M_msb && !__r._M_msb) [[likely]]
195 _M_val %= __r._M_val;
197 *
this -= (*
this / __r) * __r;
201 constexpr __max_size_type&
202 operator<<=(
const __max_size_type& __r) noexcept
204 __glibcxx_assert(__r <= _S_rep_bits);
207 _M_msb = (_M_val >> (_S_rep_bits - __r._M_val)) & 1;
209 if (__r._M_val == _S_rep_bits) [[unlikely]]
212 _M_val <<= __r._M_val;
217 constexpr __max_size_type&
218 operator>>=(
const __max_size_type& __r) noexcept
220 __glibcxx_assert(__r <= _S_rep_bits);
223 if (__r._M_val == _S_rep_bits) [[unlikely]]
226 _M_val >>= __r._M_val;
228 if (_M_msb) [[unlikely]]
230 _M_val |= __rep(1) << (_S_rep_bits - __r._M_val);
237 constexpr __max_size_type&
238 operator&=(
const __max_size_type& __r) noexcept
240 _M_val &= __r._M_val;
241 _M_msb &= __r._M_msb;
245 constexpr __max_size_type&
246 operator|=(
const __max_size_type& __r) noexcept
248 _M_val |= __r._M_val;
249 _M_msb |= __r._M_msb;
253 constexpr __max_size_type&
254 operator^=(
const __max_size_type& __r) noexcept
256 _M_val ^= __r._M_val;
257 _M_msb ^= __r._M_msb;
261 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
262 friend constexpr _Tp&
263 operator+=(_Tp& __a,
const __max_size_type& __b) noexcept
264 {
return (__a =
static_cast<_Tp
>(__a + __b)); }
266 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
267 friend constexpr _Tp&
268 operator-=(_Tp& __a,
const __max_size_type& __b) noexcept
269 {
return (__a =
static_cast<_Tp
>(__a - __b)); }
271 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
272 friend constexpr _Tp&
273 operator*=(_Tp& __a,
const __max_size_type& __b) noexcept
274 {
return (__a =
static_cast<_Tp
>(__a * __b)); }
276 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
277 friend constexpr _Tp&
278 operator/=(_Tp& __a,
const __max_size_type& __b) noexcept
279 {
return (__a =
static_cast<_Tp
>(__a / __b)); }
281 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
282 friend constexpr _Tp&
283 operator%=(_Tp& __a,
const __max_size_type& __b) noexcept
284 {
return (__a =
static_cast<_Tp
>(__a % __b)); }
286 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
287 friend constexpr _Tp&
288 operator&=(_Tp& __a,
const __max_size_type& __b) noexcept
289 {
return (__a =
static_cast<_Tp
>(__a & __b)); }
291 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
292 friend constexpr _Tp&
293 operator|=(_Tp& __a,
const __max_size_type& __b) noexcept
294 {
return (__a =
static_cast<_Tp
>(__a | __b)); }
296 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
297 friend constexpr _Tp&
298 operator^=(_Tp& __a,
const __max_size_type& __b) noexcept
299 {
return (__a =
static_cast<_Tp
>(__a ^ __b)); }
301 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
302 friend constexpr _Tp&
303 operator<<=(_Tp& __a,
const __max_size_type& __b) noexcept
304 {
return (__a =
static_cast<_Tp
>(__a << __b)); }
306 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
307 friend constexpr _Tp&
308 operator>>=(_Tp& __a,
const __max_size_type& __b) noexcept
309 {
return (__a =
static_cast<_Tp
>(__a >> __b)); }
311 friend constexpr __max_size_type
312 operator+(__max_size_type __l,
const __max_size_type& __r) noexcept
318 friend constexpr __max_size_type
319 operator-(__max_size_type __l,
const __max_size_type& __r) noexcept
325 friend constexpr __max_size_type
326 operator*(__max_size_type __l,
const __max_size_type& __r) noexcept
332 friend constexpr __max_size_type
333 operator/(__max_size_type __l,
const __max_size_type& __r) noexcept
339 friend constexpr __max_size_type
340 operator%(__max_size_type __l,
const __max_size_type& __r) noexcept
346 friend constexpr __max_size_type
347 operator<<(__max_size_type __l,
const __max_size_type& __r) noexcept
353 friend constexpr __max_size_type
354 operator>>(__max_size_type __l,
const __max_size_type& __r) noexcept
360 friend constexpr __max_size_type
361 operator&(__max_size_type __l,
const __max_size_type& __r) noexcept
367 friend constexpr __max_size_type
368 operator|(__max_size_type __l,
const __max_size_type& __r) noexcept
374 friend constexpr __max_size_type
375 operator^(__max_size_type __l,
const __max_size_type& __r) noexcept
381 friend constexpr
bool
382 operator==(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
383 {
return __l._M_val == __r._M_val && __l._M_msb == __r._M_msb; }
385 #if __cpp_lib_three_way_comparison
386 friend constexpr strong_ordering
387 operator<=>(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
389 if (__l._M_msb ^ __r._M_msb)
390 return __l._M_msb ? strong_ordering::greater : strong_ordering::less;
392 return __l._M_val <=> __r._M_val;
395 friend constexpr
bool
396 operator!=(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
397 {
return !(__l == __r); }
399 friend constexpr
bool
400 operator<(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
402 if (__l._M_msb == __r._M_msb)
403 return __l._M_val < __r._M_val;
408 friend constexpr
bool
409 operator>(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
410 {
return __r < __l; }
412 friend constexpr
bool
413 operator<=(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
414 {
return !(__l > __r); }
416 friend constexpr
bool
417 operator>=(
const __max_size_type& __l,
const __max_size_type& __r) noexcept
418 {
return __r <= __l; }
421 #if __SIZEOF_INT128__
423 using __rep =
unsigned __int128;
425 using __rep =
unsigned long long;
427 static constexpr
size_t _S_rep_bits =
sizeof(__rep) * __CHAR_BIT__;
430 unsigned _M_msb:1 = 0;
433 __max_size_type(__rep __val,
int __msb) noexcept
434 : _M_val(__val), _M_msb(__msb)
437 friend __max_diff_type;
442 class __max_diff_type
445 __max_diff_type() =
default;
447 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
449 __max_diff_type(_Tp __i) noexcept
454 __max_diff_type(
const __max_size_type& __d) noexcept
458 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
460 operator _Tp() const noexcept
461 {
return static_cast<_Tp
>(_M_rep); }
464 operator bool() const noexcept
465 {
return _M_rep != 0; }
467 constexpr __max_diff_type
471 constexpr __max_diff_type
473 {
return __max_diff_type(-_M_rep); }
475 constexpr __max_diff_type
476 operator~() const noexcept
477 {
return __max_diff_type(~_M_rep); }
479 constexpr __max_diff_type&
480 operator++() noexcept
481 {
return *
this += 1; }
483 constexpr __max_diff_type
484 operator++(
int) noexcept
491 constexpr __max_diff_type&
492 operator--() noexcept
493 {
return *
this -= 1; }
495 constexpr __max_diff_type
496 operator--(
int) noexcept
503 constexpr __max_diff_type&
504 operator+=(
const __max_diff_type& __r) noexcept
506 _M_rep += __r._M_rep;
510 constexpr __max_diff_type&
511 operator-=(
const __max_diff_type& __r) noexcept
513 _M_rep -= __r._M_rep;
517 constexpr __max_diff_type&
518 operator*=(
const __max_diff_type& __r) noexcept
520 _M_rep *= __r._M_rep;
524 constexpr __max_diff_type&
525 operator/=(
const __max_diff_type& __r) noexcept
527 __glibcxx_assert (__r != 0);
528 const bool __neg = *
this < 0;
529 const bool __rneg = __r < 0;
530 if (!__neg && !__rneg)
531 _M_rep = _M_rep / __r._M_rep;
532 else if (__neg && __rneg)
533 _M_rep = -_M_rep / -__r._M_rep;
534 else if (__neg && !__rneg)
535 _M_rep = -(-_M_rep / __r._M_rep);
537 _M_rep = -(_M_rep / -__r._M_rep);
541 constexpr __max_diff_type&
542 operator%=(
const __max_diff_type& __r) noexcept
544 __glibcxx_assert (__r != 0);
545 if (*
this >= 0 && __r > 0)
546 _M_rep %= __r._M_rep;
548 *
this -= (*
this / __r) * __r;
552 constexpr __max_diff_type&
553 operator<<=(
const __max_diff_type& __r) noexcept
555 _M_rep.operator<<=(__r._M_rep);
559 constexpr __max_diff_type&
560 operator>>=(
const __max_diff_type& __r) noexcept
563 const auto __msb = _M_rep._M_msb;
564 _M_rep >>= __r._M_rep;
566 _M_rep |= ~(__max_size_type(-1) >> __r._M_rep);
570 constexpr __max_diff_type&
571 operator&=(
const __max_diff_type& __r) noexcept
573 _M_rep &= __r._M_rep;
577 constexpr __max_diff_type&
578 operator|=(
const __max_diff_type& __r) noexcept
580 _M_rep |= __r._M_rep;
584 constexpr __max_diff_type&
585 operator^=(
const __max_diff_type& __r) noexcept
587 _M_rep ^= __r._M_rep;
591 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
592 friend constexpr _Tp&
593 operator+=(_Tp& __a,
const __max_diff_type& __b) noexcept
594 {
return (__a =
static_cast<_Tp
>(__a + __b)); }
596 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
597 friend constexpr _Tp&
598 operator-=(_Tp& __a,
const __max_diff_type& __b) noexcept
599 {
return (__a =
static_cast<_Tp
>(__a - __b)); }
601 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
602 friend constexpr _Tp&
603 operator*=(_Tp& __a,
const __max_diff_type& __b) noexcept
604 {
return (__a =
static_cast<_Tp
>(__a * __b)); }
606 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
607 friend constexpr _Tp&
608 operator/=(_Tp& __a,
const __max_diff_type& __b) noexcept
609 {
return (__a =
static_cast<_Tp
>(__a / __b)); }
611 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
612 friend constexpr _Tp&
613 operator%=(_Tp& __a,
const __max_diff_type& __b) noexcept
614 {
return (__a =
static_cast<_Tp
>(__a % __b)); }
616 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
617 friend constexpr _Tp&
618 operator&=(_Tp& __a,
const __max_diff_type& __b) noexcept
619 {
return (__a =
static_cast<_Tp
>(__a & __b)); }
621 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
622 friend constexpr _Tp&
623 operator|=(_Tp& __a,
const __max_diff_type& __b) noexcept
624 {
return (__a =
static_cast<_Tp
>(__a | __b)); }
626 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
627 friend constexpr _Tp&
628 operator^=(_Tp& __a,
const __max_diff_type& __b) noexcept
629 {
return (__a =
static_cast<_Tp
>(__a ^ __b)); }
631 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
632 friend constexpr _Tp&
633 operator<<=(_Tp& __a,
const __max_diff_type& __b) noexcept
634 {
return (__a =
static_cast<_Tp
>(__a << __b)); }
636 template<
typename _Tp> requires integral<_Tp> || __is_int128<_Tp>
637 friend constexpr _Tp&
638 operator>>=(_Tp& __a,
const __max_diff_type& __b) noexcept
639 {
return (__a =
static_cast<_Tp
>(__a >> __b)); }
641 friend constexpr __max_diff_type
642 operator+(__max_diff_type __l,
const __max_diff_type& __r) noexcept
648 friend constexpr __max_diff_type
649 operator-(__max_diff_type __l,
const __max_diff_type& __r) noexcept
655 friend constexpr __max_diff_type
656 operator*(__max_diff_type __l,
const __max_diff_type& __r) noexcept
662 friend constexpr __max_diff_type
663 operator/(__max_diff_type __l,
const __max_diff_type& __r) noexcept
669 friend constexpr __max_diff_type
670 operator%(__max_diff_type __l,
const __max_diff_type& __r) noexcept
676 friend constexpr __max_diff_type
677 operator<<(__max_diff_type __l,
const __max_diff_type& __r) noexcept
683 friend constexpr __max_diff_type
684 operator>>(__max_diff_type __l,
const __max_diff_type& __r) noexcept
690 friend constexpr __max_diff_type
691 operator&(__max_diff_type __l,
const __max_diff_type& __r) noexcept
697 friend constexpr __max_diff_type
698 operator|(__max_diff_type __l,
const __max_diff_type& __r) noexcept
704 friend constexpr __max_diff_type
705 operator^(__max_diff_type __l,
const __max_diff_type& __r) noexcept
711 friend constexpr
bool
712 operator==(
const __max_diff_type& __l,
const __max_diff_type& __r) noexcept
713 {
return __l._M_rep == __r._M_rep; }
715 #if __cpp_lib_three_way_comparison
716 constexpr strong_ordering
717 operator<=>(
const __max_diff_type& __r)
const noexcept
719 const auto __lsign = _M_rep._M_msb;
720 const auto __rsign = __r._M_rep._M_msb;
721 if (__lsign ^ __rsign)
722 return __lsign ? strong_ordering::less : strong_ordering::greater;
724 return _M_rep <=> __r._M_rep;
727 friend constexpr
bool
728 operator!=(
const __max_diff_type& __l,
const __max_diff_type& __r) noexcept
729 {
return !(__l == __r); }
732 operator<(
const __max_diff_type& __r)
const noexcept
734 const auto __lsign = _M_rep._M_msb;
735 const auto __rsign = __r._M_rep._M_msb;
736 if (__lsign ^ __rsign)
739 return _M_rep < __r._M_rep;
742 friend constexpr
bool
743 operator>(
const __max_diff_type& __l,
const __max_diff_type& __r) noexcept
744 {
return __r < __l; }
746 friend constexpr
bool
747 operator<=(
const __max_diff_type& __l,
const __max_diff_type& __r) noexcept
748 {
return !(__r < __l); }
750 friend constexpr
bool
751 operator>=(
const __max_diff_type& __l,
const __max_diff_type& __r) noexcept
752 {
return !(__l < __r); }
756 __max_size_type _M_rep = 0;
758 friend class __max_size_type;
762 __max_size_type::__max_size_type(
const __max_diff_type& __d) noexcept
763 : __max_size_type(__d._M_rep)
770 struct numeric_limits<ranges::__detail::__max_size_type>
772 using _Sp = ranges::__detail::__max_size_type;
776 static constexpr
bool is_exact =
true;
777 static constexpr
int digits
780 =
static_cast<int>(
digits * numbers::ln2 / numbers::ln10);
788 {
return _Sp(
static_cast<_Sp::__rep
>(-1), 1); }
796 struct numeric_limits<ranges::__detail::__max_diff_type>
798 using _Dp = ranges::__detail::__max_diff_type;
799 using _Sp = ranges::__detail::__max_size_type;
803 static constexpr
bool is_exact =
true;
806 =
static_cast<int>(
digits * numbers::ln2 / numbers::ln10);
810 {
return _Dp(_Sp(0, 1)); }
814 {
return _Dp(_Sp(
static_cast<_Sp::__rep
>(-1), 0)); }
821 _GLIBCXX_END_NAMESPACE_VERSION
constexpr duration< __common_rep_t< _Rep1, __disable_if_is_duration< _Rep2 > >, _Period > operator%(const duration< _Rep1, _Period > &__d, const _Rep2 &__s)
constexpr bool operator<=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator<(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
constexpr complex< _Tp > operator/(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x divided by y.
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
ISO C++ entities toplevel namespace is std.
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, bitset< _Nb > &__x)
Global I/O operators for bitsets.
constexpr bitset< _Nb > operator&(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
std::basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const bitset< _Nb > &__x)
Global I/O operators for bitsets.
constexpr bitset< _Nb > operator|(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
constexpr bitset< _Nb > operator^(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
__numeric_traits_integer< _Tp > __int_traits
Convenience alias for __numeric_traits<integer-type>.
static constexpr bool is_integer
static constexpr int digits
static constexpr bool is_exact
static constexpr bool is_specialized
static constexpr bool is_signed
static constexpr int digits10
Properties of fundamental types.
static constexpr _Tp max() noexcept
static constexpr _Tp lowest() noexcept
static constexpr _Tp min() noexcept