@@ -100,15 +100,28 @@ typedef struct
100
100
char * hi ;
101
101
} stack_node ;
102
102
103
- /* The next 4 #defines implement a very fast in-line stack abstraction. */
104
103
/* The stack needs log (total_elements) entries (we could even subtract
105
104
log(MAX_THRESH)). Since total_elements has type size_t, we get as
106
105
upper bound for log (total_elements):
107
106
bits per byte (CHAR_BIT) * sizeof(size_t). */
108
- #define STACK_SIZE (CHAR_BIT * sizeof (size_t))
109
- #define PUSH (low , high ) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
110
- #define POP (low , high ) ((void) (--top, (low = top->lo), (high = top->hi)))
111
- #define STACK_NOT_EMPTY (stack < top)
107
+ enum { STACK_SIZE = CHAR_BIT * sizeof (size_t ) };
108
+
109
+ static inline stack_node *
110
+ push (stack_node * top , char * lo , char * hi )
111
+ {
112
+ top -> lo = lo ;
113
+ top -> hi = hi ;
114
+ return ++ top ;
115
+ }
116
+
117
+ static inline stack_node *
118
+ pop (stack_node * top , char * * lo , char * * hi )
119
+ {
120
+ -- top ;
121
+ * lo = top -> lo ;
122
+ * hi = top -> hi ;
123
+ return top ;
124
+ }
112
125
113
126
114
127
static inline void
@@ -212,11 +225,9 @@ _quicksort (void *const pbase, size_t total_elems, size_t size,
212
225
char * lo = base_ptr ;
213
226
char * hi = & lo [size * (total_elems - 1 )];
214
227
stack_node stack [STACK_SIZE ];
215
- stack_node * top = stack ;
216
-
217
- PUSH (NULL , NULL );
228
+ stack_node * top = stack + 1 ;
218
229
219
- while (STACK_NOT_EMPTY )
230
+ while (stack < top )
220
231
{
221
232
char * left_ptr ;
222
233
char * right_ptr ;
@@ -281,7 +292,7 @@ _quicksort (void *const pbase, size_t total_elems, size_t size,
281
292
{
282
293
if ((size_t ) (hi - left_ptr ) <= max_thresh )
283
294
/* Ignore both small partitions. */
284
- POP ( lo , hi );
295
+ top = pop ( top , & lo , & hi );
285
296
else
286
297
/* Ignore small left partition. */
287
298
lo = left_ptr ;
@@ -292,13 +303,13 @@ _quicksort (void *const pbase, size_t total_elems, size_t size,
292
303
else if ((right_ptr - lo ) > (hi - left_ptr ))
293
304
{
294
305
/* Push larger left partition indices. */
295
- PUSH ( lo , right_ptr );
306
+ top = push ( top , lo , right_ptr );
296
307
lo = left_ptr ;
297
308
}
298
309
else
299
310
{
300
311
/* Push larger right partition indices. */
301
- PUSH ( left_ptr , hi );
312
+ top = push ( top , left_ptr , hi );
302
313
hi = right_ptr ;
303
314
}
304
315
}
0 commit comments