Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
priorityq-heap.c File Reference
#include <stddef.h>
#include <assert.h>
#include "priorityq-heap.h"
#include "memalloc.h"
#include "geom.h"
+ Include dependency graph for priorityq-heap.c:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define INIT_SIZE   32
 
#define TRUE   1
 
#define FALSE   0
 
#define LEQ(x, y)   VertLeq((GLUvertex *)x, (GLUvertex *)y)
 

Functions

PriorityQpqNewPriorityQ (int(*leq)(PQkey key1, PQkey key2))
 
void pqDeletePriorityQ (PriorityQ *pq)
 
static void FloatDown (PriorityQ *pq, long curr)
 
static void FloatUp (PriorityQ *pq, long curr)
 
void pqInit (PriorityQ *pq)
 
PQhandle pqInsert (PriorityQ *pq, PQkey keyNew)
 
PQkey pqExtractMin (PriorityQ *pq)
 
void pqDelete (PriorityQ *pq, PQhandle hCurr)
 

Macro Definition Documentation

◆ FALSE

#define FALSE   0

◆ INIT_SIZE

#define INIT_SIZE   32

◆ LEQ

#define LEQ (   x,
 
)    VertLeq((GLUvertex *)x, (GLUvertex *)y)

◆ TRUE

#define TRUE   1

Function Documentation

◆ FloatDown()

static void FloatDown ( PriorityQ pq,
long  curr 
)
static
97{
98 PQnode *n = pq->nodes;
99 PQhandleElem *h = pq->handles;
100 PQhandle hCurr, hChild;
101 long child;
102
103 hCurr = n[curr].handle;
104 for( ;; ) {
105 child = curr << 1;
106 if( child < pq->size && LEQ( h[n[child+1].handle].key,
107 h[n[child].handle].key )) {
108 ++child;
109 }
110
111 assert(child <= pq->max);
112
113 hChild = n[child].handle;
114 if( child > pq->size || LEQ( h[hCurr].key, h[hChild].key )) {
115 n[curr].handle = hCurr;
116 h[hCurr].node = curr;
117 break;
118 }
119 n[curr].handle = hChild;
120 h[hChild].node = curr;
121 curr = child;
122 }
123}
#define LEQ(x, y)
Definition priorityq-heap.c:54
PQhandle handle
Definition priorityq-heap.h:83
long PQhandle
Definition priorityq-heap.h:80
PQhandle node
Definition priorityq-heap.h:84
Definition priorityq-heap.h:84
Definition priorityq-heap.h:83
PQnode * nodes
Definition priorityq-heap.h:87
PQhandleElem * handles
Definition priorityq-heap.h:88
long size
Definition priorityq-heap.h:89

References PQnode::handle, PriorityQ::handles, LEQ, PQhandleElem::node, PriorityQ::nodes, and PriorityQ::size.

Referenced by pqDelete(), pqExtractMin(), and pqInit().

+ Here is the caller graph for this function:

◆ FloatUp()

static void FloatUp ( PriorityQ pq,
long  curr 
)
static
127{
128 PQnode *n = pq->nodes;
129 PQhandleElem *h = pq->handles;
130 PQhandle hCurr, hParent;
131 long parent;
132
133 hCurr = n[curr].handle;
134 for( ;; ) {
135 parent = curr >> 1;
136 hParent = n[parent].handle;
137 if( parent == 0 || LEQ( h[hParent].key, h[hCurr].key )) {
138 n[curr].handle = hCurr;
139 h[hCurr].node = curr;
140 break;
141 }
142 n[curr].handle = hParent;
143 h[hParent].node = curr;
144 curr = parent;
145 }
146}

References PQnode::handle, PriorityQ::handles, LEQ, PQhandleElem::node, and PriorityQ::nodes.

Referenced by pqDelete(), and pqInsert().

+ Here is the caller graph for this function:

◆ pqDelete()

void pqDelete ( PriorityQ pq,
PQhandle  hCurr 
)
235{
236 PQnode *n = pq->nodes;
237 PQhandleElem *h = pq->handles;
238 long curr;
239
240 assert( hCurr >= 1 && hCurr <= pq->max && h[hCurr].key != NULL );
241
242 curr = h[hCurr].node;
243 n[curr].handle = n[pq->size].handle;
244 h[n[curr].handle].node = curr;
245
246 if( curr <= -- pq->size ) {
247 if( curr <= 1 || LEQ( h[n[curr>>1].handle].key, h[n[curr].handle].key )) {
248 FloatDown( pq, curr );
249 } else {
250 FloatUp( pq, curr );
251 }
252 }
253 h[hCurr].key = NULL;
254 h[hCurr].node = pq->freeList;
255 pq->freeList = hCurr;
256}
static void FloatDown(PriorityQ *pq, long curr)
Definition priorityq-heap.c:96
static void FloatUp(PriorityQ *pq, long curr)
Definition priorityq-heap.c:126
PQkey key
Definition priorityq-heap.h:84
PQhandle freeList
Definition priorityq-heap.h:90

References FloatDown(), FloatUp(), PriorityQ::freeList, PQnode::handle, PriorityQ::handles, PQhandleElem::key, LEQ, PQhandleElem::node, PriorityQ::nodes, and PriorityQ::size.

+ Here is the call graph for this function:

◆ pqDeletePriorityQ()

void pqDeletePriorityQ ( PriorityQ pq)
89{
90 memFree( pq->handles );
91 memFree( pq->nodes );
92 memFree( pq );
93}
#define memFree
Definition memalloc.h:41

References PriorityQ::handles, memFree, and PriorityQ::nodes.

◆ pqExtractMin()

PQkey pqExtractMin ( PriorityQ pq)
212{
213 PQnode *n = pq->nodes;
214 PQhandleElem *h = pq->handles;
215 PQhandle hMin = n[1].handle;
216 PQkey min = h[hMin].key;
217
218 if( pq->size > 0 ) {
219 n[1].handle = n[pq->size].handle;
220 h[n[1].handle].node = 1;
221
222 h[hMin].key = NULL;
223 h[hMin].node = pq->freeList;
224 pq->freeList = hMin;
225
226 if( -- pq->size > 0 ) {
227 FloatDown( pq, 1 );
228 }
229 }
230 return min;
231}
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half() min(const half &a, const half &b)
Definition Half.h:507
void * PQkey
Definition priorityq-heap.h:79

References FloatDown(), PriorityQ::freeList, PQnode::handle, PriorityQ::handles, PQhandleElem::key, PQhandleElem::node, PriorityQ::nodes, and PriorityQ::size.

+ Here is the call graph for this function:

◆ pqInit()

void pqInit ( PriorityQ pq)
150{
151 long i;
152
153 /* This method of building a heap is O(n), rather than O(n lg n). */
154
155 for( i = pq->size; i >= 1; --i ) {
156 FloatDown( pq, i );
157 }
158 pq->initialized = TRUE;
159}
#define TRUE
Definition priorityq-heap.c:43
int initialized
Definition priorityq-heap.h:91

References FloatDown(), PriorityQ::initialized, PriorityQ::size, and TRUE.

+ Here is the call graph for this function:

◆ pqInsert()

PQhandle pqInsert ( PriorityQ pq,
PQkey  keyNew 
)
164{
165 long curr;
166 PQhandle free_handle;
167
168 curr = ++ pq->size;
169 if( (curr*2) > pq->max ) {
170 PQnode *saveNodes= pq->nodes;
171 PQhandleElem *saveHandles= pq->handles;
172
173 /* If the heap overflows, double its size. */
174 pq->max <<= 1;
175 pq->nodes = (PQnode *)memRealloc( pq->nodes,
176 (size_t)
177 ((pq->max + 1) * sizeof( pq->nodes[0] )));
178 if (pq->nodes == NULL) {
179 pq->nodes = saveNodes; /* restore ptr to free upon return */
180 return LONG_MAX;
181 }
183 (size_t)
184 ((pq->max + 1) *
185 sizeof( pq->handles[0] )));
186 if (pq->handles == NULL) {
187 pq->handles = saveHandles; /* restore ptr to free upon return */
188 return LONG_MAX;
189 }
190 }
191
192 if( pq->freeList == 0 ) {
193 free_handle = curr;
194 } else {
195 free_handle = pq->freeList;
196 pq->freeList = pq->handles[free_handle].node;
197 }
198
199 pq->nodes[curr].handle = free_handle;
200 pq->handles[free_handle].node = curr;
201 pq->handles[free_handle].key = keyNew;
202
203 if( pq->initialized ) {
204 FloatUp( pq, curr );
205 }
206 assert(free_handle != LONG_MAX);
207 return free_handle;
208}
#define memRealloc
Definition memalloc.h:40
long max
Definition priorityq-heap.h:89

References FloatUp(), PriorityQ::freeList, PQnode::handle, PriorityQ::handles, PriorityQ::initialized, PQhandleElem::key, PriorityQ::max, memRealloc, PQhandleElem::node, PriorityQ::nodes, and PriorityQ::size.

+ Here is the call graph for this function:

◆ pqNewPriorityQ()

PriorityQ * pqNewPriorityQ ( int(*)(PQkey key1, PQkey key2)  leq)
59{
60 PriorityQ *pq = (PriorityQ *)memAlloc( sizeof( PriorityQ ));
61 if (pq == NULL) return NULL;
62
63 pq->size = 0;
64 pq->max = INIT_SIZE;
65 pq->nodes = (PQnode *)memAlloc( (INIT_SIZE + 1) * sizeof(pq->nodes[0]) );
66 if (pq->nodes == NULL) {
67 memFree(pq);
68 return NULL;
69 }
70
71 pq->handles = (PQhandleElem *)memAlloc( (INIT_SIZE + 1) * sizeof(pq->handles[0]) );
72 if (pq->handles == NULL) {
73 memFree(pq->nodes);
74 memFree(pq);
75 return NULL;
76 }
77
78 pq->initialized = FALSE;
79 pq->freeList = 0;
80 pq->leq = leq;
81
82 pq->nodes[1].handle = 1; /* so that Minimum() returns NULL */
83 pq->handles[1].key = NULL;
84 return pq;
85}
#define memAlloc
Definition memalloc.h:48
#define INIT_SIZE
Definition priorityq-heap.c:40
#define FALSE
Definition priorityq-heap.c:46
Definition priorityq-heap.h:86
int(* leq)(PQkey key1, PQkey key2)
Definition priorityq-heap.h:92

References FALSE, PriorityQ::freeList, PQnode::handle, PriorityQ::handles, INIT_SIZE, PriorityQ::initialized, PQhandleElem::key, PriorityQ::leq, PriorityQ::max, memAlloc, memFree, PriorityQ::nodes, and PriorityQ::size.