@@ -40,7 +40,7 @@ struct min_heap_callbacks {
4040
4141/* Initialize a min-heap. */
4242static __always_inline
43- void __min_heap_init (min_heap_char * heap , void * data , int size )
43+ void __min_heap_init_inline (min_heap_char * heap , void * data , int size )
4444{
4545 heap -> nr = 0 ;
4646 heap -> size = size ;
@@ -50,33 +50,33 @@ void __min_heap_init(min_heap_char *heap, void *data, int size)
5050 heap -> data = heap -> preallocated ;
5151}
5252
53- #define min_heap_init (_heap , _data , _size ) \
54- __min_heap_init ((min_heap_char *)_heap, _data, _size)
53+ #define min_heap_init_inline (_heap , _data , _size ) \
54+ __min_heap_init_inline ((min_heap_char *)_heap, _data, _size)
5555
5656/* Get the minimum element from the heap. */
5757static __always_inline
58- void * __min_heap_peek (struct min_heap_char * heap )
58+ void * __min_heap_peek_inline (struct min_heap_char * heap )
5959{
6060 return heap -> nr ? heap -> data : NULL ;
6161}
6262
63- #define min_heap_peek (_heap ) \
64- (__minheap_cast(_heap) __min_heap_peek ((min_heap_char *)_heap))
63+ #define min_heap_peek_inline (_heap ) \
64+ (__minheap_cast(_heap) __min_heap_peek_inline ((min_heap_char *)_heap))
6565
6666/* Check if the heap is full. */
6767static __always_inline
68- bool __min_heap_full (min_heap_char * heap )
68+ bool __min_heap_full_inline (min_heap_char * heap )
6969{
7070 return heap -> nr == heap -> size ;
7171}
7272
73- #define min_heap_full (_heap ) \
74- __min_heap_full ((min_heap_char *)_heap)
73+ #define min_heap_full_inline (_heap ) \
74+ __min_heap_full_inline ((min_heap_char *)_heap)
7575
7676/* Sift the element at pos down the heap. */
7777static __always_inline
78- void __min_heap_sift_down (min_heap_char * heap , int pos , size_t elem_size ,
79- const struct min_heap_callbacks * func , void * args )
78+ void __min_heap_sift_down_inline (min_heap_char * heap , int pos , size_t elem_size ,
79+ const struct min_heap_callbacks * func , void * args )
8080{
8181 void * left , * right ;
8282 void * data = heap -> data ;
@@ -108,13 +108,14 @@ void __min_heap_sift_down(min_heap_char *heap, int pos, size_t elem_size,
108108 }
109109}
110110
111- #define min_heap_sift_down (_heap , _pos , _func , _args ) \
112- __min_heap_sift_down((min_heap_char *)_heap, _pos, __minheap_obj_size(_heap), _func, _args)
111+ #define min_heap_sift_down_inline (_heap , _pos , _func , _args ) \
112+ __min_heap_sift_down_inline((min_heap_char *)_heap, _pos, __minheap_obj_size(_heap), \
113+ _func, _args)
113114
114115/* Sift up ith element from the heap, O(log2(nr)). */
115116static __always_inline
116- void __min_heap_sift_up (min_heap_char * heap , size_t elem_size , size_t idx ,
117- const struct min_heap_callbacks * func , void * args )
117+ void __min_heap_sift_up_inline (min_heap_char * heap , size_t elem_size , size_t idx ,
118+ const struct min_heap_callbacks * func , void * args )
118119{
119120 void * data = heap -> data ;
120121 size_t parent ;
@@ -128,27 +129,28 @@ void __min_heap_sift_up(min_heap_char *heap, size_t elem_size, size_t idx,
128129 }
129130}
130131
131- #define min_heap_sift_up (_heap , _idx , _func , _args ) \
132- __min_heap_sift_up((min_heap_char *)_heap, __minheap_obj_size(_heap), _idx, _func, _args)
132+ #define min_heap_sift_up_inline (_heap , _idx , _func , _args ) \
133+ __min_heap_sift_up_inline((min_heap_char *)_heap, __minheap_obj_size(_heap), _idx, \
134+ _func, _args)
133135
134136/* Floyd's approach to heapification that is O(nr). */
135137static __always_inline
136- void __min_heapify_all (min_heap_char * heap , size_t elem_size ,
137- const struct min_heap_callbacks * func , void * args )
138+ void __min_heapify_all_inline (min_heap_char * heap , size_t elem_size ,
139+ const struct min_heap_callbacks * func , void * args )
138140{
139141 int i ;
140142
141143 for (i = heap -> nr / 2 - 1 ; i >= 0 ; i -- )
142- __min_heap_sift_down (heap , i , elem_size , func , args );
144+ __min_heap_sift_down_inline (heap , i , elem_size , func , args );
143145}
144146
145- #define min_heapify_all (_heap , _func , _args ) \
146- __min_heapify_all ((min_heap_char *)_heap, __minheap_obj_size(_heap), _func, _args)
147+ #define min_heapify_all_inline (_heap , _func , _args ) \
148+ __min_heapify_all_inline ((min_heap_char *)_heap, __minheap_obj_size(_heap), _func, _args)
147149
148150/* Remove minimum element from the heap, O(log2(nr)). */
149151static __always_inline
150- bool __min_heap_pop (min_heap_char * heap , size_t elem_size ,
151- const struct min_heap_callbacks * func , void * args )
152+ bool __min_heap_pop_inline (min_heap_char * heap , size_t elem_size ,
153+ const struct min_heap_callbacks * func , void * args )
152154{
153155 void * data = heap -> data ;
154156
@@ -158,36 +160,35 @@ bool __min_heap_pop(min_heap_char *heap, size_t elem_size,
158160 /* Place last element at the root (position 0) and then sift down. */
159161 heap -> nr -- ;
160162 memcpy (data , data + (heap -> nr * elem_size ), elem_size );
161- __min_heap_sift_down (heap , 0 , elem_size , func , args );
163+ __min_heap_sift_down_inline (heap , 0 , elem_size , func , args );
162164
163165 return true;
164166}
165167
166- #define min_heap_pop (_heap , _func , _args ) \
167- __min_heap_pop ((min_heap_char *)_heap, __minheap_obj_size(_heap), _func, _args)
168+ #define min_heap_pop_inline (_heap , _func , _args ) \
169+ __min_heap_pop_inline ((min_heap_char *)_heap, __minheap_obj_size(_heap), _func, _args)
168170
169171/*
170172 * Remove the minimum element and then push the given element. The
171173 * implementation performs 1 sift (O(log2(nr))) and is therefore more
172174 * efficient than a pop followed by a push that does 2.
173175 */
174176static __always_inline
175- void __min_heap_pop_push (min_heap_char * heap ,
176- const void * element , size_t elem_size ,
177- const struct min_heap_callbacks * func ,
178- void * args )
177+ void __min_heap_pop_push_inline (min_heap_char * heap , const void * element , size_t elem_size ,
178+ const struct min_heap_callbacks * func , void * args )
179179{
180180 memcpy (heap -> data , element , elem_size );
181- __min_heap_sift_down (heap , 0 , elem_size , func , args );
181+ __min_heap_sift_down_inline (heap , 0 , elem_size , func , args );
182182}
183183
184- #define min_heap_pop_push (_heap , _element , _func , _args ) \
185- __min_heap_pop_push((min_heap_char *)_heap, _element, __minheap_obj_size(_heap), _func, _args)
184+ #define min_heap_pop_push_inline (_heap , _element , _func , _args ) \
185+ __min_heap_pop_push_inline((min_heap_char *)_heap, _element, __minheap_obj_size(_heap), \
186+ _func, _args)
186187
187188/* Push an element on to the heap, O(log2(nr)). */
188189static __always_inline
189- bool __min_heap_push (min_heap_char * heap , const void * element , size_t elem_size ,
190- const struct min_heap_callbacks * func , void * args )
190+ bool __min_heap_push_inline (min_heap_char * heap , const void * element , size_t elem_size ,
191+ const struct min_heap_callbacks * func , void * args )
191192{
192193 void * data = heap -> data ;
193194 int pos ;
@@ -201,18 +202,19 @@ bool __min_heap_push(min_heap_char *heap, const void *element, size_t elem_size,
201202 heap -> nr ++ ;
202203
203204 /* Sift child at pos up. */
204- __min_heap_sift_up (heap , elem_size , pos , func , args );
205+ __min_heap_sift_up_inline (heap , elem_size , pos , func , args );
205206
206207 return true;
207208}
208209
209- #define min_heap_push (_heap , _element , _func , _args ) \
210- __min_heap_push((min_heap_char *)_heap, _element, __minheap_obj_size(_heap), _func, _args)
210+ #define min_heap_push_inline (_heap , _element , _func , _args ) \
211+ __min_heap_push_inline((min_heap_char *)_heap, _element, __minheap_obj_size(_heap), \
212+ _func, _args)
211213
212214/* Remove ith element from the heap, O(log2(nr)). */
213215static __always_inline
214- bool __min_heap_del (min_heap_char * heap , size_t elem_size , size_t idx ,
215- const struct min_heap_callbacks * func , void * args )
216+ bool __min_heap_del_inline (min_heap_char * heap , size_t elem_size , size_t idx ,
217+ const struct min_heap_callbacks * func , void * args )
216218{
217219 void * data = heap -> data ;
218220
@@ -224,12 +226,53 @@ bool __min_heap_del(min_heap_char *heap, size_t elem_size, size_t idx,
224226 if (idx == heap -> nr )
225227 return true;
226228 func -> swp (data + (idx * elem_size ), data + (heap -> nr * elem_size ), args );
227- __min_heap_sift_up (heap , elem_size , idx , func , args );
228- __min_heap_sift_down (heap , idx , elem_size , func , args );
229+ __min_heap_sift_up_inline (heap , elem_size , idx , func , args );
230+ __min_heap_sift_down_inline (heap , idx , elem_size , func , args );
229231
230232 return true;
231233}
232234
235+ #define min_heap_del_inline (_heap , _idx , _func , _args ) \
236+ __min_heap_del_inline((min_heap_char *)_heap, __minheap_obj_size(_heap), _idx, \
237+ _func, _args)
238+
239+ void __min_heap_init (min_heap_char * heap , void * data , int size );
240+ void * __min_heap_peek (struct min_heap_char * heap );
241+ bool __min_heap_full (min_heap_char * heap );
242+ void __min_heap_sift_down (min_heap_char * heap , int pos , size_t elem_size ,
243+ const struct min_heap_callbacks * func , void * args );
244+ void __min_heap_sift_up (min_heap_char * heap , size_t elem_size , size_t idx ,
245+ const struct min_heap_callbacks * func , void * args );
246+ void __min_heapify_all (min_heap_char * heap , size_t elem_size ,
247+ const struct min_heap_callbacks * func , void * args );
248+ bool __min_heap_pop (min_heap_char * heap , size_t elem_size ,
249+ const struct min_heap_callbacks * func , void * args );
250+ void __min_heap_pop_push (min_heap_char * heap , const void * element , size_t elem_size ,
251+ const struct min_heap_callbacks * func , void * args );
252+ bool __min_heap_push (min_heap_char * heap , const void * element , size_t elem_size ,
253+ const struct min_heap_callbacks * func , void * args );
254+ bool __min_heap_del (min_heap_char * heap , size_t elem_size , size_t idx ,
255+ const struct min_heap_callbacks * func , void * args );
256+
257+ #define min_heap_init (_heap , _data , _size ) \
258+ __min_heap_init((min_heap_char *)_heap, _data, _size)
259+ #define min_heap_peek (_heap ) \
260+ (__minheap_cast(_heap) __min_heap_peek((min_heap_char *)_heap))
261+ #define min_heap_full (_heap ) \
262+ __min_heap_full((min_heap_char *)_heap)
263+ #define min_heap_sift_down (_heap , _pos , _func , _args ) \
264+ __min_heap_sift_down((min_heap_char *)_heap, _pos, __minheap_obj_size(_heap), _func, _args)
265+ #define min_heap_sift_up (_heap , _idx , _func , _args ) \
266+ __min_heap_sift_up((min_heap_char *)_heap, __minheap_obj_size(_heap), _idx, _func, _args)
267+ #define min_heapify_all (_heap , _func , _args ) \
268+ __min_heapify_all((min_heap_char *)_heap, __minheap_obj_size(_heap), _func, _args)
269+ #define min_heap_pop (_heap , _func , _args ) \
270+ __min_heap_pop((min_heap_char *)_heap, __minheap_obj_size(_heap), _func, _args)
271+ #define min_heap_pop_push (_heap , _element , _func , _args ) \
272+ __min_heap_pop_push((min_heap_char *)_heap, _element, __minheap_obj_size(_heap), \
273+ _func, _args)
274+ #define min_heap_push (_heap , _element , _func , _args ) \
275+ __min_heap_push((min_heap_char *)_heap, _element, __minheap_obj_size(_heap), _func, _args)
233276#define min_heap_del (_heap , _idx , _func , _args ) \
234277 __min_heap_del((min_heap_char *)_heap, __minheap_obj_size(_heap), _idx, _func, _args)
235278
0 commit comments