179 _LoserTree(
unsigned int __k, _Compare __comp)
184 __init_winner(
unsigned int __root)
190 unsigned int __left = __init_winner(2 * __root);
191 unsigned int __right = __init_winner(2 * __root + 1);
192 if (_M_losers[__right]._M_sup
193 || (!_M_losers[__left]._M_sup
194 && !_M_comp(_M_losers[__right]._M_key,
195 _M_losers[__left]._M_key)))
198 _M_losers[__root] = _M_losers[__right];
204 _M_losers[__root] = _M_losers[__left];
211 { _M_losers[0] = _M_losers[__init_winner(1)]; }
225#if _GLIBCXX_PARALLEL_ASSERTIONS
227 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
230 int __source = _M_losers[0]._M_source;
231 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
235 if ((__sup && (!_M_losers[__pos]._M_sup
236 || _M_losers[__pos]._M_source < __source))
237 || (!__sup && !_M_losers[__pos]._M_sup
238 && ((_M_comp(_M_losers[__pos]._M_key, __key))
239 || (!_M_comp(__key, _M_losers[__pos]._M_key)
240 && _M_losers[__pos]._M_source < __source))))
243 std::swap(_M_losers[__pos]._M_sup, __sup);
244 std::swap(_M_losers[__pos]._M_source, __source);
245 swap(_M_losers[__pos]._M_key, __key);
249 _M_losers[0]._M_sup = __sup;
250 _M_losers[0]._M_source = __source;
251 _M_losers[0]._M_key = __key;
357 class _LoserTreePointerBase
368 unsigned int _M_ik, _M_k, _M_offset;
373 _LoserTreePointerBase(
unsigned int __k,
382 _M_losers =
new _Loser[_M_k * 2];
383 for (
unsigned int __i = _M_ik - 1; __i < _M_k; __i++)
384 _M_losers[__i + _M_k]._M_sup =
true;
388 {
delete[] _M_losers; }
390 int __get_min_source()
391 {
return _M_losers[0]._M_source; }
393 void __insert_start(
const _Tp& __key,
int __source,
bool __sup)
395 unsigned int __pos = _M_k + __source;
397 _M_losers[__pos]._M_sup = __sup;
398 _M_losers[__pos]._M_source = __source;
399 _M_losers[__pos]._M_keyp = &__key;
409 class _LoserTreePointer
410 :
public _LoserTreePointerBase<_Tp, _Compare>
412 typedef _LoserTreePointerBase<_Tp, _Compare> _Base;
414 using _Base::_M_comp;
415 using _Base::_M_losers;
418 _LoserTreePointer(
unsigned int __k, _Compare __comp =
std::less<_Tp>())
419 : _Base::_LoserTreePointerBase(__k, __comp)
423 __init_winner(
unsigned int __root)
429 unsigned int __left = __init_winner(2 * __root);
430 unsigned int __right = __init_winner(2 * __root + 1);
431 if (_M_losers[__right]._M_sup
432 || (!_M_losers[__left]._M_sup
433 && !_M_comp(*_M_losers[__right]._M_keyp,
434 *_M_losers[__left]._M_keyp)))
437 _M_losers[__root] = _M_losers[__right];
443 _M_losers[__root] = _M_losers[__left];
450 { _M_losers[0] = _M_losers[__init_winner(1)]; }
452 void __delete_min_insert(
const _Tp& __key,
bool __sup)
454#if _GLIBCXX_PARALLEL_ASSERTIONS
456 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
459 const _Tp* __keyp = &__key;
460 int __source = _M_losers[0]._M_source;
461 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
465 if ((__sup && (!_M_losers[__pos]._M_sup
466 || _M_losers[__pos]._M_source < __source))
467 || (!__sup && !_M_losers[__pos]._M_sup &&
468 ((_M_comp(*_M_losers[__pos]._M_keyp, *__keyp))
469 || (!_M_comp(*__keyp, *_M_losers[__pos]._M_keyp)
470 && _M_losers[__pos]._M_source < __source))))
473 std::swap(_M_losers[__pos]._M_sup, __sup);
474 std::swap(_M_losers[__pos]._M_source, __source);
475 std::swap(_M_losers[__pos]._M_keyp, __keyp);
479 _M_losers[0]._M_sup = __sup;
480 _M_losers[0]._M_source = __source;
481 _M_losers[0]._M_keyp = __keyp;
491 class _LoserTreePointer<false, _Tp, _Compare>
492 :
public _LoserTreePointerBase<_Tp, _Compare>
494 typedef _LoserTreePointerBase<_Tp, _Compare> _Base;
496 using _Base::_M_comp;
497 using _Base::_M_losers;
500 _LoserTreePointer(
unsigned int __k, _Compare __comp =
std::less<_Tp>())
501 : _Base::_LoserTreePointerBase(__k, __comp)
505 __init_winner(
unsigned int __root)
511 unsigned int __left = __init_winner(2 * __root);
512 unsigned int __right = __init_winner(2 * __root + 1);
513 if (_M_losers[__right]._M_sup
514 || (!_M_losers[__left]._M_sup
515 && !_M_comp(*_M_losers[__right]._M_keyp,
516 *_M_losers[__left]._M_keyp)))
519 _M_losers[__root] = _M_losers[__right];
525 _M_losers[__root] = _M_losers[__left];
532 { _M_losers[0] = _M_losers[__init_winner(1)]; }
534 void __delete_min_insert(
const _Tp& __key,
bool __sup)
536#if _GLIBCXX_PARALLEL_ASSERTIONS
538 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
541 const _Tp* __keyp = &__key;
542 int __source = _M_losers[0]._M_source;
543 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
547 if (__sup || (!_M_losers[__pos]._M_sup
548 && _M_comp(*_M_losers[__pos]._M_keyp, *__keyp)))
551 std::swap(_M_losers[__pos]._M_sup, __sup);
552 std::swap(_M_losers[__pos]._M_source, __source);
553 std::swap(_M_losers[__pos]._M_keyp, __keyp);
557 _M_losers[0]._M_sup = __sup;
558 _M_losers[0]._M_source = __source;
559 _M_losers[0]._M_keyp = __keyp;
574 class _LoserTreeUnguardedBase
583 unsigned int _M_ik, _M_k, _M_offset;
588 _LoserTreeUnguardedBase(
unsigned int __k,
const _Tp& __sentinel,
598 _M_losers =
static_cast<_Loser*
>(::operator
new(2 * _M_k
601 for (
unsigned int __i = 0; __i < _M_k; ++__i)
603 ::new(&(_M_losers[__i]._M_key)) _Tp(__sentinel);
604 _M_losers[__i]._M_source = -1;
606 for (
unsigned int __i = _M_k + _M_ik - 1; __i < (2 * _M_k); ++__i)
608 ::new(&(_M_losers[__i]._M_key)) _Tp(__sentinel);
609 _M_losers[__i]._M_source = -1;
613 ~_LoserTreeUnguardedBase()
615 for (
unsigned int __i = 0; __i < (2 * _M_k); ++__i)
616 _M_losers[__i].~_Loser();
617 ::operator
delete(_M_losers);
623#if _GLIBCXX_PARALLEL_ASSERTIONS
625 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
627 return _M_losers[0]._M_source;
631 __insert_start(
const _Tp& __key,
int __source,
bool)
633 unsigned int __pos = _M_k + __source;
635 ::new(&(_M_losers[__pos]._M_key)) _Tp(__key);
636 _M_losers[__pos]._M_source = __source;
646 class _LoserTreeUnguarded
647 :
public _LoserTreeUnguardedBase<_Tp, _Compare>
649 typedef _LoserTreeUnguardedBase<_Tp, _Compare> _Base;
651 using _Base::_M_comp;
652 using _Base::_M_losers;
655 _LoserTreeUnguarded(
unsigned int __k,
const _Tp& __sentinel,
657 : _Base::_LoserTreeUnguardedBase(__k, __sentinel, __comp)
661 __init_winner(
unsigned int __root)
667 unsigned int __left = __init_winner(2 * __root);
668 unsigned int __right = __init_winner(2 * __root + 1);
669 if (!_M_comp(_M_losers[__right]._M_key,
670 _M_losers[__left]._M_key))
673 _M_losers[__root] = _M_losers[__right];
679 _M_losers[__root] = _M_losers[__left];
688 _M_losers[0] = _M_losers[__init_winner(1)];
690#if _GLIBCXX_PARALLEL_ASSERTIONS
693 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
700 __delete_min_insert(_Tp __key,
bool)
703#if _GLIBCXX_PARALLEL_ASSERTIONS
705 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
708 int __source = _M_losers[0]._M_source;
709 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
713 if (_M_comp(_M_losers[__pos]._M_key, __key)
714 || (!_M_comp(__key, _M_losers[__pos]._M_key)
715 && _M_losers[__pos]._M_source < __source))
718 std::swap(_M_losers[__pos]._M_source, __source);
719 swap(_M_losers[__pos]._M_key, __key);
723 _M_losers[0]._M_source = __source;
724 _M_losers[0]._M_key = __key;
734 class _LoserTreeUnguarded<false, _Tp, _Compare>
735 :
public _LoserTreeUnguardedBase<_Tp, _Compare>
737 typedef _LoserTreeUnguardedBase<_Tp, _Compare> _Base;
739 using _Base::_M_comp;
740 using _Base::_M_losers;
743 _LoserTreeUnguarded(
unsigned int __k,
const _Tp& __sentinel,
745 : _Base::_LoserTreeUnguardedBase(__k, __sentinel, __comp)
749 __init_winner(
unsigned int __root)
755 unsigned int __left = __init_winner(2 * __root);
756 unsigned int __right = __init_winner(2 * __root + 1);
758#if _GLIBCXX_PARALLEL_ASSERTIONS
760 if (_M_losers[__left]._M_source == -1)
761 _GLIBCXX_PARALLEL_ASSERT(_M_losers[__right]._M_source == -1);
764 if (!_M_comp(_M_losers[__right]._M_key,
765 _M_losers[__left]._M_key))
768 _M_losers[__root] = _M_losers[__right];
774 _M_losers[__root] = _M_losers[__left];
783 _M_losers[0] = _M_losers[__init_winner(1)];
785#if _GLIBCXX_PARALLEL_ASSERTIONS
788 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
795 __delete_min_insert(_Tp __key,
bool)
798#if _GLIBCXX_PARALLEL_ASSERTIONS
800 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
803 int __source = _M_losers[0]._M_source;
804 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
808 if (_M_comp(_M_losers[__pos]._M_key, __key))
811 std::swap(_M_losers[__pos]._M_source, __source);
812 swap(_M_losers[__pos]._M_key, __key);
816 _M_losers[0]._M_source = __source;
817 _M_losers[0]._M_key = __key;
828 class _LoserTreePointerUnguardedBase
837 unsigned int _M_ik, _M_k, _M_offset;
843 _LoserTreePointerUnguardedBase(
unsigned int __k,
const _Tp& __sentinel,
853 _M_losers =
new _Loser[2 * _M_k];
855 for (
unsigned int __i = _M_k + _M_ik - 1; __i < (2 * _M_k); ++__i)
857 _M_losers[__i]._M_keyp = &__sentinel;
858 _M_losers[__i]._M_source = -1;
862 ~_LoserTreePointerUnguardedBase()
863 {
delete[] _M_losers; }
868#if _GLIBCXX_PARALLEL_ASSERTIONS
870 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
872 return _M_losers[0]._M_source;
876 __insert_start(
const _Tp& __key,
int __source,
bool)
878 unsigned int __pos = _M_k + __source;
880 _M_losers[__pos]._M_keyp = &__key;
881 _M_losers[__pos]._M_source = __source;
891 class _LoserTreePointerUnguarded
892 :
public _LoserTreePointerUnguardedBase<_Tp, _Compare>
894 typedef _LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
896 using _Base::_M_comp;
897 using _Base::_M_losers;
900 _LoserTreePointerUnguarded(
unsigned int __k,
const _Tp& __sentinel,
902 : _Base::_LoserTreePointerUnguardedBase(__k, __sentinel, __comp)
906 __init_winner(
unsigned int __root)
912 unsigned int __left = __init_winner(2 * __root);
913 unsigned int __right = __init_winner(2 * __root + 1);
914 if (!_M_comp(*_M_losers[__right]._M_keyp,
915 *_M_losers[__left]._M_keyp))
918 _M_losers[__root] = _M_losers[__right];
924 _M_losers[__root] = _M_losers[__left];
933 _M_losers[0] = _M_losers[__init_winner(1)];
935#if _GLIBCXX_PARALLEL_ASSERTIONS
938 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
943 __delete_min_insert(
const _Tp& __key,
bool __sup)
945#if _GLIBCXX_PARALLEL_ASSERTIONS
947 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
950 const _Tp* __keyp = &__key;
951 int __source = _M_losers[0]._M_source;
952 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
956 if (_M_comp(*_M_losers[__pos]._M_keyp, *__keyp)
957 || (!_M_comp(*__keyp, *_M_losers[__pos]._M_keyp)
958 && _M_losers[__pos]._M_source < __source))
961 std::swap(_M_losers[__pos]._M_source, __source);
962 std::swap(_M_losers[__pos]._M_keyp, __keyp);
966 _M_losers[0]._M_source = __source;
967 _M_losers[0]._M_keyp = __keyp;
977 class _LoserTreePointerUnguarded<false, _Tp, _Compare>
978 :
public _LoserTreePointerUnguardedBase<_Tp, _Compare>
980 typedef _LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
982 using _Base::_M_comp;
983 using _Base::_M_losers;
986 _LoserTreePointerUnguarded(
unsigned int __k,
const _Tp& __sentinel,
988 : _Base::_LoserTreePointerUnguardedBase(__k, __sentinel, __comp)
992 __init_winner(
unsigned int __root)
998 unsigned int __left = __init_winner(2 * __root);
999 unsigned int __right = __init_winner(2 * __root + 1);
1001#if _GLIBCXX_PARALLEL_ASSERTIONS
1003 if (_M_losers[__left]._M_source == -1)
1004 _GLIBCXX_PARALLEL_ASSERT(_M_losers[__right]._M_source == -1);
1007 if (!_M_comp(*_M_losers[__right]._M_keyp,
1008 *_M_losers[__left]._M_keyp))
1011 _M_losers[__root] = _M_losers[__right];
1017 _M_losers[__root] = _M_losers[__left];
1026 _M_losers[0] = _M_losers[__init_winner(1)];
1028#if _GLIBCXX_PARALLEL_ASSERTIONS
1031 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
1036 __delete_min_insert(
const _Tp& __key,
bool __sup)
1038#if _GLIBCXX_PARALLEL_ASSERTIONS
1040 _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
1043 const _Tp* __keyp = &__key;
1044 int __source = _M_losers[0]._M_source;
1045 for (
unsigned int __pos = (_M_k + __source) / 2; __pos > 0;
1049 if (_M_comp(*(_M_losers[__pos]._M_keyp), *__keyp))
1052 std::swap(_M_losers[__pos]._M_source, __source);
1053 std::swap(_M_losers[__pos]._M_keyp, __keyp);
1057 _M_losers[0]._M_source = __source;
1058 _M_losers[0]._M_keyp = __keyp;