72 template<
typename _RandomAccessIterator,
typename _Distance,
79#if __cplusplus >= 201103L
81 static_assert(
is_same<
typename _IterTraits::difference_type,
83 "Argument 'n' must be the iterator's difference type");
85 _Distance __parent = 0;
86 for (_Distance __child = 1; __child < __n; ++__child)
88 if (__comp(*(__first + __parent), *(__first + __child)))
90 if ((__child & 1) == 0)
98 template<
typename _RandomAccessIterator,
typename _Distance>
108 template<
typename _RandomAccessIterator,
typename _Compare,
118 template<
typename _RandomAccessIterator>
121 __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
124 template<
typename _RandomAccessIterator,
typename _Compare>
127 __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
137 template<
typename _RandomAccessIterator,
typename _Distance,
typename _Tp,
142 _Distance __holeIndex, _Distance __topIndex, _Tp __value,
145 _Distance __parent = (__holeIndex - 1) / 2;
146 while (__holeIndex > __topIndex && __comp(*(__first + __parent), __value))
148 *(__first + __holeIndex) =
_GLIBCXX_MOVE(*(__first + __parent));
149 __holeIndex = __parent;
150 __parent = (__holeIndex - 1) / 2;
165 template<
typename _RandomAccessIterator>
168 push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
177 _RandomAccessIterator>)
184 _ValueType __value =
_GLIBCXX_MOVE(*(__last - _DistanceType(1)));
201 template<
typename _RandomAccessIterator,
typename _Compare>
204 push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
214 _RandomAccessIterator>)
219 _ValueType __value =
_GLIBCXX_MOVE(*(__last - _DistanceType(1)));
224 template<
typename _RandomAccessIterator,
typename _Distance,
229 _Distance __len, _Tp __value,
_Compare __comp)
231 const _Distance __topIndex = __holeIndex;
232 _Distance __secondChild = __holeIndex;
233 while (__secondChild < (__len - 1) / 2)
235 __secondChild = 2 * (__secondChild + 1);
236 if (__comp(*(__first + __secondChild),
237 *(__first + _Distance(__secondChild - 1))))
239 *(__first + __holeIndex) =
_GLIBCXX_MOVE(*(__first + __secondChild));
240 __holeIndex = __secondChild;
242 if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
244 __secondChild = 2 * (__secondChild + 1);
246 + (__secondChild - 1)));
247 __holeIndex = __secondChild - 1;
253 template<
typename _RandomAccessIterator,
typename _Compare>
256 __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
257 _RandomAccessIterator __result,
_Compare& __comp)
267 _DistanceType(__last - __first),
282 template<
typename _RandomAccessIterator>
285 pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
289 _RandomAccessIterator>)
297 if (__last - __first > 1)
316 template<
typename _RandomAccessIterator,
typename _Compare>
320 _RandomAccessIterator __last,
_Compare __comp)
324 _RandomAccessIterator>)
330 if (__last - __first > 1)
337 template<
typename _RandomAccessIterator,
typename _Compare>
340 __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
348 if (__last - __first < 2)
351 const _DistanceType __len = __last - __first;
352 _DistanceType __parent = (__len - 2) / 2;
372 template<
typename _RandomAccessIterator>
375 make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
379 _RandomAccessIterator>)
399 template<
typename _RandomAccessIterator,
typename _Compare>
402 make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
407 _RandomAccessIterator>)
414 template<
typename _RandomAccessIterator,
typename _Compare>
417 __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
420 while (__last - __first > 1)
435 template<
typename _RandomAccessIterator>
438 sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
442 _RandomAccessIterator>)
463 template<
typename _RandomAccessIterator,
typename _Compare>
466 sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
471 _RandomAccessIterator>)
479#if __cplusplus >= 201103L
490 template<
typename _RandomAccessIterator>
492 inline _RandomAccessIterator
497 _RandomAccessIterator>)
519 template<
typename _RandomAccessIterator,
typename _Compare>
521 inline _RandomAccessIterator
527 _RandomAccessIterator>)
543 template<
typename _RandomAccessIterator>
546 is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
557 template<
typename _RandomAccessIterator,
typename _Compare>
560 is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
565 _RandomAccessIterator>)
#define __glibcxx_function_requires(...)
#define _GLIBCXX_MOVE(__val)
#define _GLIBCXX_VISIBILITY(V)
#define _GLIBCXX_NODISCARD
#define _GLIBCXX_END_NAMESPACE_VERSION
#define _GLIBCXX_BEGIN_NAMESPACE_VERSION
#define __glibcxx_requires_non_empty_range(_First, _Last)
#define __glibcxx_requires_heap(_First, _Last)
#define __glibcxx_requires_heap_pred(_First, _Last, _Pred)
#define __glibcxx_requires_valid_range(_First, _Last)
#define __glibcxx_requires_irreflexive_pred(_First, _Last, _Pred)
#define __glibcxx_requires_irreflexive(_First, _Last)
constexpr void __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex, _Distance __len, _Tp __value, _Compare __comp)
constexpr _Distance __is_heap_until(_RandomAccessIterator __first, _Distance __n, _Compare &__comp)
constexpr bool is_heap(_RAIter, _RAIter)
constexpr void __push_heap(_RandomAccessIterator __first, _Distance __holeIndex, _Distance __topIndex, _Tp __value, _Compare &__comp)
constexpr void __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _RandomAccessIterator __result, _Compare &__comp)
constexpr void __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare &__comp)
constexpr void __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare &__comp)
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr bool __is_heap(_RandomAccessIterator __first, _Distance __n)
constexpr void sort_heap(_RAIter, _RAIter)
constexpr void pop_heap(_RAIter, _RAIter)
constexpr void make_heap(_RAIter, _RAIter)
constexpr _RAIter is_heap_until(_RAIter, _RAIter)
constexpr void push_heap(_RAIter, _RAIter)
ISO C++ entities toplevel namespace is std.
Traits class for iterators.