21#ifndef Glucose_Heap2_h
22#define Glucose_Heap2_h
34template<
class Comp,
class Obj>
41 static inline int left (
int i) {
return i*2+1; }
42 static inline int right (
int i) {
return (i+1)*2; }
43 static inline int parent(
int i) {
return (i-1) >> 1; }
45 inline int data (
int i)
const {
return heap[i].data();}
47 void percolateUp(
int i)
52 while (i != 0 && lt(x, heap[
p])){
59 indices[x.data()] = i;
63 void percolateDown(
int i)
66 while (left(i) < heap.size()){
67 int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i);
68 if (!lt(heap[child], x))
break;
69 heap[i] = heap[child];
74 indices[x.data()] = i;
79 Heap2(
const Comp& c) : lt(c) { }
81 int size ()
const {
return heap.size(); }
82 bool empty ()
const {
return heap.size() == 0; }
83 bool inHeap (
int n)
const {
return n < indices.size() && indices[n] >= 0; }
84 int operator[](
int index)
const {
assert(index < heap.size());
return heap[index].data(); }
89 void prelocate (
int ext_cap){ indices.prelocate(ext_cap); }
90 int data_attr (
int n)
const {
return heap[indices[n]].attr(); }
98 heap[indices[x.data()]] = x;
99 percolateUp(indices[n]);
100 percolateDown(indices[n]); }
107 indices.growTo(n+1, -1);
110 indices[n] = heap.size();
112 percolateUp(indices[n]);
119 heap[0] = heap.last();
120 indices[heap[0].data()] = 0;
121 indices[x.data()]= -1;
123 if (heap.size() > 1) percolateDown(0);
148 for (i = 0; i < heap.size(); i++)
149 indices[heap[i].data()] = -1;
155 for (i = 0; i < heap.size(); i++)
156 indices[heap[i].data()] = -1;
158 if( ! dealloc ) heap.shrink_( heap.size() );
159 else heap.clear(
true);
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
void insert(const Obj &x)
void prelocate(int ext_cap)
void update(const Obj &x)
int removeMin(int &_attr)
int data_attr(int n) const
void clear(bool dealloc=false)
int operator[](int index) const
void clear_(bool dealloc=false)