98 #ifndef XAPIAN_INCLUDED_HEAP_H
99 #define XAPIAN_INCLUDED_HEAP_H
105 template <
class _Compare,
class _RandomAccessIterator>
107 sift_up_(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp,
108 typename std::iterator_traits<_RandomAccessIterator>::difference_type len)
110 typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type;
114 _RandomAccessIterator ptr = first + len;
115 if (comp(*ptr, *--last))
117 value_type t(std::move(*last));
120 *last = std::move(*ptr);
126 }
while (comp(*ptr, t));
127 *last = std::move(t);
132 template <
class _RandomAccessIterator,
class _Compare>
135 push(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
137 sift_up_(first, last, comp, last - first);
142 template <
class _Compare,
class _RandomAccessIterator>
145 typename std::iterator_traits<_RandomAccessIterator>::difference_type len,
146 _RandomAccessIterator start)
148 typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
149 typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type;
152 difference_type child = start - first;
154 if (len < 2 || (len - 2) / 2 < child)
157 child = 2 * child + 1;
158 _RandomAccessIterator child_i = first + child;
160 if ((child + 1) < len && comp(*child_i, *(child_i + 1))) {
167 if (comp(*child_i, *start))
171 value_type top(std::move(*start));
175 *start = std::move(*child_i);
178 if ((len - 2) / 2 < child)
182 child = 2 * child + 1;
183 child_i = first + child;
185 if ((child + 1) < len && comp(*child_i, *(child_i + 1))) {
192 }
while (!comp(*child_i, top));
193 *start = std::move(top);
196 template <
class _Compare,
class _RandomAccessIterator>
199 pop_heap_(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp,
200 typename std::iterator_traits<_RandomAccessIterator>::difference_type len)
205 swap(*first, *--last);
210 template <
class _RandomAccessIterator,
class _Compare>
213 pop(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
215 pop_heap_(first, last, comp, last - first);
218 template <
class _Compare,
class _RandomAccessIterator>
222 typename std::iterator_traits<_RandomAccessIterator>::difference_type len)
228 template <
class _RandomAccessIterator,
class _Compare>
230 replace(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
235 template <
class _Compare,
class _RandomAccessIterator>
238 _RandomAccessIterator elt, _Compare comp,
239 typename std::iterator_traits<_RandomAccessIterator>::difference_type len)
246 template <
class _RandomAccessIterator,
class _Compare>
249 siftdown(_RandomAccessIterator first, _RandomAccessIterator last,
250 _RandomAccessIterator elt, _Compare comp)
257 template <
class _RandomAccessIterator,
class _Compare>
259 make(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
261 typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
262 difference_type n = last - first;
266 for (difference_type start = (n - 2) / 2; start >= 0; --start)
275 template <
class _Compare,
class _RandomAccessIterator>
277 sort(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
279 typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
280 for (difference_type n = last - first; n > 1; --last, --n)
281 pop_heap_<_Compare>(first, last, comp, n);
void pop(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
void replace(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
void siftdown(_RandomAccessIterator first, _RandomAccessIterator last, _RandomAccessIterator elt, _Compare comp)
void push(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
void make(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
void sift_down_(_RandomAccessIterator first, _Compare comp, typename std::iterator_traits< _RandomAccessIterator >::difference_type len, _RandomAccessIterator start)
void replace_heap_(_RandomAccessIterator first, _Compare comp, typename std::iterator_traits< _RandomAccessIterator >::difference_type len)
void sort(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
void pop_heap_(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp, typename std::iterator_traits< _RandomAccessIterator >::difference_type len)
void sift_up_(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp, typename std::iterator_traits< _RandomAccessIterator >::difference_type len)
void siftdown_heap_(_RandomAccessIterator first, _RandomAccessIterator elt, _Compare comp, typename std::iterator_traits< _RandomAccessIterator >::difference_type len)