35 template <
typename RandomAccessIterator,
typename Distance,
typename T,
typename Compare,
typename ValueType>
36 DYN_FUNC
inline void promote_heap_impl(RandomAccessIterator first, Distance topPosition, Distance position,
T value, Compare compare)
38 for (Distance parentPosition = (position - 1) >> 1;
39 (position > topPosition) && compare(*(first + parentPosition), value);
40 parentPosition = (position - 1) >> 1)
43 position = parentPosition;
55 template <
typename RandomAccessIterator,
typename Distance,
typename T,
typename Compare>
56 DYN_FUNC
inline void promote_heap(RandomAccessIterator first, Distance topPosition, Distance position,
const T& value, Compare compare)
63 template <
typename RandomAccessIterator,
typename Distance,
typename T,
typename Compare>
64 DYN_FUNC
inline void promote_heap(RandomAccessIterator first, Distance topPosition, Distance position,
T&& value, Compare compare)
73 template <
typename RandomAccessIterator,
typename Distance,
typename T,
typename Compare,
typename ValueType>
74 DYN_FUNC
void adjust_heap_impl(RandomAccessIterator first, Distance topPosition, Distance heapSize, Distance position,
T value, Compare compare)
78 Distance childPosition = (2 * position) + 2;
80 for (; childPosition < heapSize; childPosition = (2 * childPosition) + 2)
82 if (compare(*(first + childPosition), *(first + (childPosition - 1))))
85 position = childPosition;
88 if (childPosition == heapSize)
91 position = childPosition - 1;
102 template <
typename RandomAccessIterator,
typename Distance,
typename T,
typename Compare>
103 DYN_FUNC
void adjust_heap(RandomAccessIterator first, Distance topPosition, Distance heapSize, Distance position,
const T& value, Compare compare)
109 template <
typename RandomAccessIterator,
typename Distance,
typename T,
typename Compare>
110 DYN_FUNC
void adjust_heap(RandomAccessIterator first, Distance topPosition, Distance heapSize, Distance position,
T&& value, Compare compare)
121 template <
typename RandomAccessIterator,
typename Compare>
122 DYN_FUNC
inline void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
127 const value_type tempBottom(*(last - 1));
130 (first, (difference_type)0, (difference_type)(last - first - 1), tempBottom, compare);
139 template <
typename RandomAccessIterator,
typename Compare>
140 DYN_FUNC
inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
159 template <
typename RandomAccessIterator,
typename Compare>
160 DYN_FUNC
void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
165 const difference_type heapSize = last - first;
169 difference_type parentPosition = ((heapSize - 2) >> 1) + 1;
176 }
while (parentPosition != 0);
189 template <
typename RandomAccessIterator,
typename Compare>
190 DYN_FUNC
inline void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
192 for (; (last - first) > 1; --last)
203 template <
typename RandomAccessIterator,
typename Distance,
typename Compare>
204 DYN_FUNC
inline void remove_heap(RandomAccessIterator first, Distance heapSize, Distance position, Compare compare)
209 const value_type tempBottom(*(first + heapSize - 1));
210 *(first + heapSize - 1) = *(first + position);
212 (first, (difference_type)0, (difference_type)(heapSize - 1), (difference_type)position, tempBottom, compare);
220 template <
typename RandomAccessIterator,
typename Distance,
typename Compare>
221 DYN_FUNC
inline void change_heap(RandomAccessIterator first, Distance heapSize, Distance position, Compare compare)
228 value_type tempBottom(*(first + heapSize - 1));
231 (first, (difference_type)0, (difference_type)(heapSize - 1), tempBottom, compare);
236 template <
typename RandomAccessIterator,
typename Compare>
237 DYN_FUNC
inline RandomAccessIterator
is_heap_until(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
241 for (RandomAccessIterator child = first + 1; child < last; ++child, counter ^= 1)
243 if (compare(*first, *child))
254 template <
typename RandomAccessIterator>
255 DYN_FUNC
inline bool is_heap(RandomAccessIterator first, RandomAccessIterator last)
This is an implementation of AdditiveCCD based on peridyno.
DYN_FUNC void pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
DYN_FUNC bool is_heap(RandomAccessIterator first, RandomAccessIterator last)
DYN_FUNC void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
DYN_FUNC constexpr T && forward(typename dyno::remove_reference< T >::type &x) noexcept
DYN_FUNC void change_heap(RandomAccessIterator first, Distance heapSize, Distance position, Compare compare)
DYN_FUNC void promote_heap_impl(RandomAccessIterator first, Distance topPosition, Distance position, T value, Compare compare)
promote_heap_implementation
DYN_FUNC RandomAccessIterator is_heap_until(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
is_heap_until
DYN_FUNC void promote_heap(RandomAccessIterator first, Distance topPosition, Distance position, const T &value, Compare compare)
DYN_FUNC void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
DYN_FUNC void adjust_heap(RandomAccessIterator first, Distance topPosition, Distance heapSize, Distance position, const T &value, Compare compare)
DYN_FUNC void adjust_heap_impl(RandomAccessIterator first, Distance topPosition, Distance heapSize, Distance position, T value, Compare compare)
adjust heap implementation
DYN_FUNC void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare compare)
DYN_FUNC void remove_heap(RandomAccessIterator first, Distance heapSize, Distance position, Compare compare)