3#include <click/algorithm.hh>
30template <
typename iterator_type,
typename compare_type,
typename place_type>
31inline void push_heap(iterator_type begin, iterator_type end,
32 compare_type comp, place_type place)
35 size_t i = end - begin - 1, npos;
37 while (i > 0 && (npos = (i-1)/2, comp(begin[i], begin[npos]))) {
38 click_swap(begin[i], begin[npos]);
39 place(begin, begin + i);
43 place(begin, begin + i);
47template <
typename iterator_type,
typename compare_type>
48inline void push_heap(iterator_type begin, iterator_type end,
78template <
typename iterator_type,
typename compare_type,
typename place_type>
79iterator_type change_heap(iterator_type begin, iterator_type end,
80 iterator_type element,
81 compare_type comp, place_type place)
83 assert(begin <= element && element < end);
84 size_t i = element - begin, size = end - begin, npos;
86 while (i > 0 && (npos = (i-1)/2, comp(begin[i], begin[npos]))) {
87 click_swap(begin[i], begin[npos]);
88 place(begin, begin + i);
93 size_t smallest = i, trial = i*2 + 1;
94 if (trial < size && comp(begin[trial], begin[smallest]))
96 if (trial + 1 < size && comp(begin[trial + 1], begin[smallest]))
100 click_swap(begin[i], begin[smallest]);
101 place(begin, begin + i);
105 if (begin + i != element)
106 place(begin, begin + i);
111template <
typename iterator_type,
typename compare_type>
112inline iterator_type change_heap(iterator_type begin, iterator_type end,
113 iterator_type element, compare_type comp)
144template <
typename iterator_type,
typename compare_type,
typename place_type>
145inline void remove_heap(iterator_type begin, iterator_type end,
146 iterator_type element,
147 compare_type comp, place_type place)
149 assert(begin <= element && element < end);
150 if (element + 1 != end) {
151 click_swap(element[0], end[-1]);
152 place(begin, element);
153 change_heap(begin, end - 1, element, comp, place);
158template <
typename iterator_type,
typename compare_type>
159inline void remove_heap(iterator_type begin, iterator_type end,
160 iterator_type element,
191template <
typename iterator_type,
typename compare_type,
typename place_type>
192inline void pop_heap(iterator_type begin, iterator_type end,
193 compare_type comp, place_type place)
195 remove_heap(begin, end, begin, comp, place);
199template <
typename iterator_type,
typename compare_type>
200inline void pop_heap(iterator_type begin, iterator_type end,
235 typename iterator_type,
typename compare_type,
typename place_type>
236inline void push_heap(iterator_type begin, iterator_type end,
237 compare_type comp, place_type place)
239 static_assert(arity > 2,
"For arity == 2, use push_heap(...), not push_heap<2>(...).");
241 size_t i = end - begin - 1, npos;
243 while (i > 0 && (npos = i/arity, comp(begin[i], begin[npos]))) {
244 click_swap(begin[i], begin[npos]);
245 place(begin, begin + i);
249 place(begin, begin + i);
253template <
int arity,
typename iterator_type,
typename compare_type>
254inline void push_heap(iterator_type begin, iterator_type end,
287 typename iterator_type,
typename compare_type,
typename place_type>
288iterator_type change_heap(iterator_type begin, iterator_type end,
289 iterator_type element,
290 compare_type comp, place_type place)
292 static_assert(arity > 2,
"For arity == 2, use change_heap(...), not change_heap<2>(...).");
293 assert(begin <= element && element < end);
294 size_t i = element - begin, size = end - begin, npos;
296 while (i > 0 && (npos = i/arity, comp(begin[i], begin[npos]))) {
297 click_swap(begin[i], begin[npos]);
298 place(begin, begin + i);
304 trial = i ? i * arity : 1,
305 end_trial = i ? trial + arity : arity;
306 end_trial = end_trial < size ? end_trial : size;
307 for (; trial < end_trial; ++trial)
308 if (comp(begin[trial], begin[smallest]))
312 click_swap(begin[i], begin[smallest]);
313 place(begin, begin + i);
317 if (begin + i != element)
318 place(begin, begin + i);
324 typename iterator_type,
typename compare_type>
325inline iterator_type change_heap(iterator_type begin, iterator_type end,
326 iterator_type element, compare_type comp)
358 typename iterator_type,
typename compare_type,
typename place_type>
359inline void remove_heap(iterator_type begin, iterator_type end,
360 iterator_type element,
361 compare_type comp, place_type place)
363 assert(begin <= element && element < end);
364 if (element + 1 != end) {
365 click_swap(element[0], end[-1]);
366 place(begin, element);
367 change_heap<arity>(begin, end - 1, element, comp, place);
373 typename iterator_type,
typename compare_type>
374inline void remove_heap(iterator_type begin, iterator_type end,
375 iterator_type element,
408 typename iterator_type,
typename compare_type,
typename place_type>
409inline void pop_heap(iterator_type begin, iterator_type end,
410 compare_type comp, place_type place)
412 remove_heap<arity>(begin, end, begin, comp, place);
417 typename iterator_type,
typename compare_type>
418inline void pop_heap(iterator_type begin, iterator_type end,
Binary function object that does nothing when called.
Definition algorithm.hh:88