30#ifndef _GLIBCXX_MAX_SIZE_TYPE_H
31#define _GLIBCXX_MAX_SIZE_TYPE_H 1
34#pragma GCC system_header
37#if __cplusplus > 201703L && __cpp_lib_concepts
52namespace std _GLIBCXX_VISIBILITY(default)
54_GLIBCXX_BEGIN_NAMESPACE_VERSION
66 __max_size_type() =
default;
68 template<
typename _Tp>
requires integral<_Tp>
70 __max_size_type(_Tp __i) noexcept
71 : _M_val(__i), _M_msb(__i < 0)
75 __max_size_type(
const __max_diff_type& __d)
noexcept;
77 template<
typename _Tp>
requires integral<_Tp>
79 operator _Tp() const noexcept
83 operator bool() const noexcept
84 {
return _M_val != 0 || _M_msb != 0; }
86 constexpr __max_size_type
90 constexpr __max_size_type
91 operator~() const noexcept
92 {
return __max_size_type{~_M_val, !_M_msb}; }
94 constexpr __max_size_type
96 {
return operator~() + 1; }
98 constexpr __max_size_type&
100 {
return *
this += 1; }
102 constexpr __max_size_type
103 operator++(
int)
noexcept
110 constexpr __max_size_type&
111 operator--() noexcept
112 {
return *
this -= 1; }
114 constexpr __max_size_type
115 operator--(
int)
noexcept
122 constexpr __max_size_type&
123 operator+=(
const __max_size_type& __r)
noexcept
125 const auto __sum = _M_val + __r._M_val;
126 const bool __overflow = (__sum < _M_val);
127 _M_msb = _M_msb ^ __r._M_msb ^ __overflow;
132 constexpr __max_size_type&
133 operator-=(
const __max_size_type& __r)
noexcept
134 {
return *
this += -__r; }
136 constexpr __max_size_type&
137 operator*=(__max_size_type __r)
noexcept
139 constexpr __max_size_type __threshold
140 = __rep(1) << (_S_rep_bits / 2 - 1);
141 if (_M_val < __threshold && __r < __threshold)
144 _M_val = _M_val * __r._M_val;
150 const bool __lsb = _M_val & 1;
151 const bool __rlsb = __r._M_val & 1;
154 _M_val = (2 * _M_val * __r._M_val
155 + _M_val * __rlsb + __r._M_val * __lsb);
157 *
this += __rlsb * __lsb;
163 constexpr __max_size_type&
164 operator/=(
const __max_size_type& __r)
noexcept
166 __glibcxx_assert(__r != 0);
168 if (!_M_msb && !__r._M_msb) [[likely]]
169 _M_val /= __r._M_val;
170 else if (_M_msb && __r._M_msb)
172 _M_val = (_M_val >= __r._M_val);
175 else if (!_M_msb && __r._M_msb)
177 else if (_M_msb && !__r._M_msb)
183 const auto __orig = *
this;
185 _M_val /= __r._M_val;
187 if (__orig - *
this * __r >= __r)
193 constexpr __max_size_type&
194 operator%=(
const __max_size_type& __r)
noexcept
196 if (!_M_msb && !__r._M_msb) [[likely]]
197 _M_val %= __r._M_val;
199 *
this -= (*
this / __r) * __r;
203 constexpr __max_size_type&
204 operator<<=(
const __max_size_type& __r)
noexcept
206 __glibcxx_assert(__r <= _S_rep_bits);
209 _M_msb = (_M_val >> (_S_rep_bits - __r._M_val)) & 1;
211 if (__r._M_val == _S_rep_bits) [[unlikely]]
214 _M_val <<= __r._M_val;
219 constexpr __max_size_type&
220 operator>>=(
const __max_size_type& __r)
noexcept
222 __glibcxx_assert(__r <= _S_rep_bits);
225 if (__r._M_val == _S_rep_bits) [[unlikely]]
228 _M_val >>= __r._M_val;
230 if (_M_msb) [[unlikely]]
232 _M_val |= __rep(1) << (_S_rep_bits - __r._M_val);
239 constexpr __max_size_type&
240 operator&=(
const __max_size_type& __r)
noexcept
242 _M_val &= __r._M_val;
243 _M_msb &= __r._M_msb;
247 constexpr __max_size_type&
248 operator|=(
const __max_size_type& __r)
noexcept
250 _M_val |= __r._M_val;
251 _M_msb |= __r._M_msb;
255 constexpr __max_size_type&
256 operator^=(
const __max_size_type& __r)
noexcept
258 _M_val ^= __r._M_val;
259 _M_msb ^= __r._M_msb;
263 template<
typename _Tp>
requires integral<_Tp>
264 friend constexpr _Tp&
265 operator+=(_Tp& __a,
const __max_size_type& __b)
noexcept
266 {
return (__a =
static_cast<_Tp
>(__a + __b)); }
268 template<
typename _Tp>
requires integral<_Tp>
269 friend constexpr _Tp&
270 operator-=(_Tp& __a,
const __max_size_type& __b)
noexcept
271 {
return (__a =
static_cast<_Tp
>(__a - __b)); }
273 template<
typename _Tp>
requires integral<_Tp>
274 friend constexpr _Tp&
275 operator*=(_Tp& __a,
const __max_size_type& __b)
noexcept
276 {
return (__a =
static_cast<_Tp
>(__a * __b)); }
278 template<
typename _Tp>
requires integral<_Tp>
279 friend constexpr _Tp&
280 operator/=(_Tp& __a,
const __max_size_type& __b)
noexcept
281 {
return (__a =
static_cast<_Tp
>(__a / __b)); }
283 template<
typename _Tp>
requires integral<_Tp>
284 friend constexpr _Tp&
285 operator%=(_Tp& __a,
const __max_size_type& __b)
noexcept
286 {
return (__a =
static_cast<_Tp
>(__a % __b)); }
288 template<
typename _Tp>
requires integral<_Tp>
289 friend constexpr _Tp&
290 operator&=(_Tp& __a,
const __max_size_type& __b)
noexcept
291 {
return (__a =
static_cast<_Tp
>(__a & __b)); }
293 template<
typename _Tp>
requires integral<_Tp>
294 friend constexpr _Tp&
295 operator|=(_Tp& __a,
const __max_size_type& __b)
noexcept
296 {
return (__a =
static_cast<_Tp
>(__a | __b)); }
298 template<
typename _Tp>
requires integral<_Tp>
299 friend constexpr _Tp&
300 operator^=(_Tp& __a,
const __max_size_type& __b)
noexcept
301 {
return (__a =
static_cast<_Tp
>(__a ^ __b)); }
303 template<
typename _Tp>
requires integral<_Tp>
304 friend constexpr _Tp&
305 operator<<=(_Tp& __a,
const __max_size_type& __b)
noexcept
306 {
return (__a =
static_cast<_Tp
>(__a << __b)); }
308 template<
typename _Tp>
requires integral<_Tp>
309 friend constexpr _Tp&
310 operator>>=(_Tp& __a,
const __max_size_type& __b)
noexcept
311 {
return (__a =
static_cast<_Tp
>(__a >> __b)); }
313 friend constexpr __max_size_type
314 operator+(__max_size_type __l,
const __max_size_type& __r)
noexcept
320 friend constexpr __max_size_type
321 operator-(__max_size_type __l,
const __max_size_type& __r)
noexcept
327 friend constexpr __max_size_type
328 operator*(__max_size_type __l,
const __max_size_type& __r)
noexcept
334 friend constexpr __max_size_type
335 operator/(__max_size_type __l,
const __max_size_type& __r)
noexcept
341 friend constexpr __max_size_type
342 operator%(__max_size_type __l,
const __max_size_type& __r)
noexcept
348 friend constexpr __max_size_type
349 operator<<(__max_size_type __l,
const __max_size_type& __r)
noexcept
355 friend constexpr __max_size_type
356 operator>>(__max_size_type __l,
const __max_size_type& __r)
noexcept
362 friend constexpr __max_size_type
363 operator&(__max_size_type __l,
const __max_size_type& __r)
noexcept
369 friend constexpr __max_size_type
370 operator|(__max_size_type __l,
const __max_size_type& __r)
noexcept
376 friend constexpr __max_size_type
377 operator^(__max_size_type __l,
const __max_size_type& __r)
noexcept
383 friend constexpr bool
384 operator==(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
385 {
return __l._M_val == __r._M_val && __l._M_msb == __r._M_msb; }
387#if __cpp_lib_three_way_comparison
388 friend constexpr strong_ordering
389 operator<=>(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
391 if (__l._M_msb ^ __r._M_msb)
392 return __l._M_msb ? strong_ordering::greater : strong_ordering::less;
394 return __l._M_val <=> __r._M_val;
397 friend constexpr bool
398 operator!=(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
399 {
return !(__l == __r); }
401 friend constexpr bool
402 operator<(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
404 if (__l._M_msb == __r._M_msb)
405 return __l._M_val < __r._M_val;
410 friend constexpr bool
411 operator>(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
412 {
return __r < __l; }
414 friend constexpr bool
415 operator<=(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
416 {
return !(__l > __r); }
418 friend constexpr bool
419 operator>=(
const __max_size_type& __l,
const __max_size_type& __r)
noexcept
420 {
return __r <= __l; }
425 using __rep =
unsigned __int128;
427 using __rep =
unsigned long long;
429 static constexpr size_t _S_rep_bits =
sizeof(__rep) * __CHAR_BIT__;
432 unsigned _M_msb:1 = 0;
436 __max_size_type(__rep __val,
int __msb) noexcept
437 : _M_val(__val), _M_msb(__msb)
440 friend __max_diff_type;
441 friend std::numeric_limits<__max_size_type>;
442 friend std::numeric_limits<__max_diff_type>;
445 class __max_diff_type
448 __max_diff_type() =
default;
450 template<
typename _Tp>
requires integral<_Tp>
452 __max_diff_type(_Tp __i) noexcept
457 __max_diff_type(
const __max_size_type& __d) noexcept
461 template<
typename _Tp>
requires integral<_Tp>
463 operator _Tp() const noexcept
464 {
return static_cast<_Tp
>(_M_rep); }
467 operator bool() const noexcept
468 {
return _M_rep != 0; }
470 constexpr __max_diff_type
474 constexpr __max_diff_type
476 {
return __max_diff_type(-_M_rep); }
478 constexpr __max_diff_type
479 operator~() const noexcept
480 {
return __max_diff_type(~_M_rep); }
482 constexpr __max_diff_type&
483 operator++() noexcept
484 {
return *
this += 1; }
486 constexpr __max_diff_type
487 operator++(
int)
noexcept
494 constexpr __max_diff_type&
495 operator--() noexcept
496 {
return *
this -= 1; }
498 constexpr __max_diff_type
499 operator--(
int)
noexcept
506 constexpr __max_diff_type&
507 operator+=(
const __max_diff_type& __r)
noexcept
509 _M_rep += __r._M_rep;
513 constexpr __max_diff_type&
514 operator-=(
const __max_diff_type& __r)
noexcept
516 _M_rep -= __r._M_rep;
520 constexpr __max_diff_type&
521 operator*=(
const __max_diff_type& __r)
noexcept
523 _M_rep *= __r._M_rep;
527 constexpr __max_diff_type&
528 operator/=(
const __max_diff_type& __r)
noexcept
530 __glibcxx_assert (__r != 0);
531 const bool __neg = *
this < 0;
532 const bool __rneg = __r < 0;
533 if (!__neg && !__rneg)
534 _M_rep = _M_rep / __r._M_rep;
535 else if (__neg && __rneg)
536 _M_rep = -_M_rep / -__r._M_rep;
537 else if (__neg && !__rneg)
538 _M_rep = -(-_M_rep / __r._M_rep);
540 _M_rep = -(_M_rep / -__r._M_rep);
544 constexpr __max_diff_type&
545 operator%=(
const __max_diff_type& __r)
noexcept
547 __glibcxx_assert (__r != 0);
548 if (*
this >= 0 && __r > 0)
549 _M_rep %= __r._M_rep;
551 *
this -= (*
this / __r) * __r;
555 constexpr __max_diff_type&
556 operator<<=(
const __max_diff_type& __r)
noexcept
558 _M_rep.operator<<=(__r._M_rep);
562 constexpr __max_diff_type&
563 operator>>=(
const __max_diff_type& __r)
noexcept
566 const auto __msb = _M_rep._M_msb;
567 _M_rep >>= __r._M_rep;
569 _M_rep |= ~(__max_size_type(-1) >> __r._M_rep);
573 constexpr __max_diff_type&
574 operator&=(
const __max_diff_type& __r)
noexcept
576 _M_rep &= __r._M_rep;
580 constexpr __max_diff_type&
581 operator|=(
const __max_diff_type& __r)
noexcept
583 _M_rep |= __r._M_rep;
587 constexpr __max_diff_type&
588 operator^=(
const __max_diff_type& __r)
noexcept
590 _M_rep ^= __r._M_rep;
594 template<
typename _Tp>
requires integral<_Tp>
595 friend constexpr _Tp&
596 operator+=(_Tp& __a,
const __max_diff_type& __b)
noexcept
597 {
return (__a =
static_cast<_Tp
>(__a + __b)); }
599 template<
typename _Tp>
requires integral<_Tp>
600 friend constexpr _Tp&
601 operator-=(_Tp& __a,
const __max_diff_type& __b)
noexcept
602 {
return (__a =
static_cast<_Tp
>(__a - __b)); }
604 template<
typename _Tp>
requires integral<_Tp>
605 friend constexpr _Tp&
606 operator*=(_Tp& __a,
const __max_diff_type& __b)
noexcept
607 {
return (__a =
static_cast<_Tp
>(__a * __b)); }
609 template<
typename _Tp>
requires integral<_Tp>
610 friend constexpr _Tp&
611 operator/=(_Tp& __a,
const __max_diff_type& __b)
noexcept
612 {
return (__a =
static_cast<_Tp
>(__a / __b)); }
614 template<
typename _Tp>
requires integral<_Tp>
615 friend constexpr _Tp&
616 operator%=(_Tp& __a,
const __max_diff_type& __b)
noexcept
617 {
return (__a =
static_cast<_Tp
>(__a % __b)); }
619 template<
typename _Tp>
requires integral<_Tp>
620 friend constexpr _Tp&
621 operator&=(_Tp& __a,
const __max_diff_type& __b)
noexcept
622 {
return (__a =
static_cast<_Tp
>(__a & __b)); }
624 template<
typename _Tp>
requires integral<_Tp>
625 friend constexpr _Tp&
626 operator|=(_Tp& __a,
const __max_diff_type& __b)
noexcept
627 {
return (__a =
static_cast<_Tp
>(__a | __b)); }
629 template<
typename _Tp>
requires integral<_Tp>
630 friend constexpr _Tp&
631 operator^=(_Tp& __a,
const __max_diff_type& __b)
noexcept
632 {
return (__a =
static_cast<_Tp
>(__a ^ __b)); }
634 template<
typename _Tp>
requires integral<_Tp>
635 friend constexpr _Tp&
636 operator<<=(_Tp& __a,
const __max_diff_type& __b)
noexcept
637 {
return (__a =
static_cast<_Tp
>(__a << __b)); }
639 template<
typename _Tp>
requires integral<_Tp>
640 friend constexpr _Tp&
641 operator>>=(_Tp& __a,
const __max_diff_type& __b)
noexcept
642 {
return (__a =
static_cast<_Tp
>(__a >> __b)); }
644 friend constexpr __max_diff_type
645 operator+(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
651 friend constexpr __max_diff_type
652 operator-(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
658 friend constexpr __max_diff_type
659 operator*(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
665 friend constexpr __max_diff_type
666 operator/(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
672 friend constexpr __max_diff_type
673 operator%(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
679 friend constexpr __max_diff_type
680 operator<<(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
686 friend constexpr __max_diff_type
687 operator>>(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
693 friend constexpr __max_diff_type
694 operator&(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
700 friend constexpr __max_diff_type
701 operator|(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
707 friend constexpr __max_diff_type
708 operator^(__max_diff_type __l,
const __max_diff_type& __r)
noexcept
714 friend constexpr bool
715 operator==(
const __max_diff_type& __l,
const __max_diff_type& __r)
noexcept
716 {
return __l._M_rep == __r._M_rep; }
718#if __cpp_lib_three_way_comparison
719 constexpr strong_ordering
720 operator<=>(
const __max_diff_type& __r)
const noexcept
722 const auto __lsign = _M_rep._M_msb;
723 const auto __rsign = __r._M_rep._M_msb;
724 if (__lsign ^ __rsign)
725 return __lsign ? strong_ordering::less : strong_ordering::greater;
727 return _M_rep <=> __r._M_rep;
730 friend constexpr bool
731 operator!=(
const __max_diff_type& __l,
const __max_diff_type& __r)
noexcept
732 {
return !(__l == __r); }
735 operator<(
const __max_diff_type& __r)
const noexcept
737 const auto __lsign = _M_rep._M_msb;
738 const auto __rsign = __r._M_rep._M_msb;
739 if (__lsign ^ __rsign)
742 return _M_rep < __r._M_rep;
745 friend constexpr bool
746 operator>(
const __max_diff_type& __l,
const __max_diff_type& __r)
noexcept
747 {
return __r < __l; }
749 friend constexpr bool
750 operator<=(
const __max_diff_type& __l,
const __max_diff_type& __r)
noexcept
751 {
return !(__r < __l); }
753 friend constexpr bool
754 operator>=(
const __max_diff_type& __l,
const __max_diff_type& __r)
noexcept
755 {
return !(__l < __r); }
758 __max_size_type _M_rep = 0;
760 friend class __max_size_type;
764 __max_size_type::__max_size_type(
const __max_diff_type& __d) noexcept
765 : __max_size_type(__d._M_rep)
774 using _Sp = ranges::__detail::__max_size_type;
778 static constexpr bool is_exact =
true;
781 static constexpr bool traps = __glibcxx_integral_traps;
782 static constexpr int radix = 2;
783 static constexpr int digits
784 = __gnu_cxx::__int_traits<_Sp::__rep>::__digits + 1;
786 =
static_cast<int>(
digits * numbers::ln2 / numbers::ln10);
807 {
return _Sp(
static_cast<_Sp::__rep
>(-1), 1); }
841 using _Dp = ranges::__detail::__max_diff_type;
842 using _Sp = ranges::__detail::__max_size_type;
846 static constexpr bool is_exact =
true;
849 static constexpr bool traps = __glibcxx_integral_traps;
850 static constexpr int radix = 2;
853 =
static_cast<int>(
digits * numbers::ln2 / numbers::ln10);
870 {
return _Dp(_Sp(0, 1)); }
874 {
return _Dp(_Sp(
static_cast<_Sp::__rep
>(-1), 0)); }
907 __bit_width(ranges::__detail::__max_size_type __x)
noexcept
912 return std::__bit_width(__x._M_val);
915_GLIBCXX_END_NAMESPACE_VERSION
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 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 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 minus y.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
constexpr complex< _Tp > operator/(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x divided by y.
ISO C++ entities toplevel namespace is std.
float_round_style
Describes the rounding style for floating-point types.
@ round_toward_zero
To zero.
float_denorm_style
Describes the denormalization for floating-point types.
@ denorm_absent
The type does not allow denormalized values.
constexpr bitset< _Nb > operator^(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, bitset< _Nb > &__x)
Global I/O operators for 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.
static constexpr bool is_modulo
static constexpr bool has_quiet_NaN
static constexpr bool is_integer
static constexpr int max_digits10
static constexpr int min_exponent
static constexpr int digits
static constexpr bool is_bounded
static constexpr bool has_denorm_loss
static constexpr bool is_iec559
static constexpr bool is_exact
static constexpr bool traps
static constexpr bool has_signaling_NaN
static constexpr bool is_specialized
static constexpr int max_exponent
static constexpr bool is_signed
static constexpr int digits10
static constexpr int min_exponent10
static constexpr bool tinyness_before
static constexpr float_round_style round_style
static constexpr bool has_infinity
static constexpr int radix
static constexpr int max_exponent10
static constexpr float_denorm_style has_denorm
Properties of fundamental types.
static constexpr _Tp max() noexcept
static constexpr _Tp epsilon() noexcept
static constexpr _Tp quiet_NaN() noexcept
static constexpr _Tp lowest() noexcept
static constexpr _Tp min() noexcept
static constexpr _Tp denorm_min() noexcept
static constexpr _Tp infinity() noexcept
static constexpr _Tp round_error() noexcept
static constexpr _Tp signaling_NaN() noexcept