73 #ifndef OPENMESH_UTILS_HEAPT_HH
74 #define OPENMESH_UTILS_HEAPT_HH
82 #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
102 template <
class HeapEntry>
106 bool less(
const HeapEntry& _e1,
const HeapEntry& _e2);
109 bool greater(
const HeapEntry& _e1,
const HeapEntry& _e2);
142 template <
class HeapEntry,
class HeapInterface=HeapEntry>
143 class HeapT :
private std::vector<HeapEntry>
146 typedef std::vector<HeapEntry> Base;
153 #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
154 HeapT(HeapInterface _interface)
156 : HeapVector(),
interface_(std::move(_interface))
159 HeapT(
const HeapInterface &_interface)
168 HeapInterface &getInterface() {
172 const HeapInterface &getInterface()
const {
177 void clear() { HeapVector::clear(); }
180 bool empty()
const {
return HeapVector::empty(); }
183 size_t size()
const {
return HeapVector::size(); }
186 void reserve(
size_t _n) { HeapVector::reserve(_n); }
194 {
return interface_.get_heap_position(_h) != -1; }
207 return HeapVector::front();
217 entry(0, entry(
size()-1));
234 assert((
unsigned int) pos <
size());
237 if ((
unsigned int) pos ==
size()-1)
243 entry(pos, entry(
size()-1));
257 assert((
unsigned int)pos <
size());
267 for (i=0; i<
size(); ++i)
269 if (((j=left(i))<
size()) &&
interface_.greater(entry(i), entry(j)))
271 omerr() <<
"Heap condition violated\n";
274 if (((j=right(i))<
size()) &&
interface_.greater(entry(i), entry(j)))
276 omerr() <<
"Heap condition violated\n";
289 typedef std::vector<HeapEntry> HeapVector;
293 void upheap(
size_t _idx);
297 void downheap(
size_t _idx);
301 inline HeapEntry entry(
size_t _idx)
const
303 assert(_idx <
size());
304 return (Base::operator[](_idx));
309 inline void entry(
size_t _idx, HeapEntry _h)
311 assert(_idx <
size());
312 Base::operator[](_idx) = _h;
318 inline size_t parent(
size_t _i) {
return (_i-1)>>1; }
320 inline size_t left(
size_t _i) {
return (_i<<1)+1; }
322 inline size_t right(
size_t _i) {
return (_i<<1)+2; }
332 template <
class HeapEntry,
class HeapInterface>
334 HeapT<HeapEntry, HeapInterface>::
337 HeapEntry h = entry(_idx);
340 while ((_idx>0) && interface_.less(h, entry(parentIdx=parent(_idx))))
342 entry(_idx, entry(parentIdx));
353 template <
class HeapEntry,
class HeapInterface>
355 HeapT<HeapEntry, HeapInterface>::
356 downheap(
size_t _idx)
358 const HeapEntry h = entry(_idx);
360 const size_t s = size();
364 childIdx = left(_idx);
365 if (childIdx >= s)
break;
367 if ((childIdx + 1 < s) && (interface_.less(entry(childIdx + 1), entry(childIdx))))
370 if (interface_.less(h, entry(childIdx)))
break;
372 entry(_idx, entry(childIdx));
384 #endif // OSG_HEAP_HH defined