Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: source/libvpx/vpx_mem/memory_manager/include/cavl_impl.h

Issue 11555023: libvpx: Add VP9 decoder. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 103
104 /* The maximum depth may be greater than the number of bits in a long, 104 /* The maximum depth may be greater than the number of bits in a long,
105 ** so multiple longs are needed to hold a bit array indexed by node 105 ** so multiple longs are needed to hold a bit array indexed by node
106 ** depth. */ 106 ** depth. */
107 107
108 #define L_BIT_ARR_LONGS (((AVL_MAX_DEPTH) + L_LONG_BIT - 1) / L_LONG_BIT) 108 #define L_BIT_ARR_LONGS (((AVL_MAX_DEPTH) + L_LONG_BIT - 1) / L_LONG_BIT)
109 109
110 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME[L_BIT_ARR_LONGS]; 110 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME[L_BIT_ARR_LONGS];
111 111
112 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) \ 112 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) \
113 ((BIT_ARR)[(BIT_NUM) / L_LONG_BIT] & (1L << ((BIT_NUM) % L_LONG_BIT))) 113 ((BIT_ARR)[(BIT_NUM) / L_LONG_BIT] & (1L << ((BIT_NUM) % L_LONG_BIT)))
114 114
115 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) \ 115 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) \
116 (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] &= ~(1L << ((BIT_NUM) % L_LONG_BIT)); 116 (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] &= ~(1L << ((BIT_NUM) % L_LONG_BIT));
117 117
118 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) \ 118 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) \
119 (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] |= 1L << ((BIT_NUM) % L_LONG_BIT); 119 (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] |= 1L << ((BIT_NUM) % L_LONG_BIT);
120 120
121 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) \ 121 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) \
122 { int i = L_BIT_ARR_LONGS; do (BIT_ARR)[--i] = 0L - (BIT_VAL); while(i); } 122 { int i = L_BIT_ARR_LONGS; do (BIT_ARR)[--i] = 0L - (BIT_VAL); while(i); }
123 123
124 #else /* The bit array can definitely fit in one long */ 124 #else /* The bit array can definitely fit in one long */
125 125
126 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME; 126 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME;
127 127
128 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) ((BIT_ARR) & (1L << (BIT_NUM))) 128 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) ((BIT_ARR) & (1L << (BIT_NUM)))
129 129
130 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) (BIT_ARR) &= ~(1L << (BIT_NUM)); 130 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) (BIT_ARR) &= ~(1L << (BIT_NUM));
131 131
132 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) (BIT_ARR) |= 1L << (BIT_NUM); 132 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) (BIT_ARR) |= 1L << (BIT_NUM);
133 133
134 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) (BIT_ARR) = 0L - (BIT_VAL); 134 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) (BIT_ARR) = 0L - (BIT_VAL);
135 135
136 #endif 136 #endif
137 137
138 #ifdef AVL_READ_ERRORS_HAPPEN 138 #ifdef AVL_READ_ERRORS_HAPPEN
139 139
140 #define L_CHECK_READ_ERROR(ERROR_RETURN) \ 140 #define L_CHECK_READ_ERROR(ERROR_RETURN) \
141 { if (AVL_READ_ERROR) return(ERROR_RETURN); } 141 { if (AVL_READ_ERROR) return(ERROR_RETURN); }
142 142
143 #else 143 #else
144 144
145 #define L_CHECK_READ_ERROR(ERROR_RETURN) 145 #define L_CHECK_READ_ERROR(ERROR_RETURN)
146 146
147 #endif 147 #endif
148 148
149 /* The presumed reason that an instantiation places additional fields 149 /* The presumed reason that an instantiation places additional fields
150 ** inside the AVL tree structure is that the SET_ and GET_ macros 150 ** inside the AVL tree structure is that the SET_ and GET_ macros
151 ** need these fields. The "balance" function does not explicitly use 151 ** need these fields. The "balance" function does not explicitly use
(...skipping 20 matching lines...) Expand all
172 172
173 #else 173 #else
174 174
175 /* Define all functions. */ 175 /* Define all functions. */
176 #define L_IMPL_MASK AVL_IMPL_ALL 176 #define L_IMPL_MASK AVL_IMPL_ALL
177 177
178 #endif 178 #endif
179 179
180 #if (L_IMPL_MASK & AVL_IMPL_INIT) 180 #if (L_IMPL_MASK & AVL_IMPL_INIT)
181 181
182 L_SC void L_(init)(L_(avl) *l_tree) 182 L_SC void L_(init)(L_(avl) *l_tree) {
183 { 183 l_tree->root = AVL_NULL;
184 l_tree->root = AVL_NULL;
185 } 184 }
186 185
187 #endif 186 #endif
188 187
189 #if (L_IMPL_MASK & AVL_IMPL_IS_EMPTY) 188 #if (L_IMPL_MASK & AVL_IMPL_IS_EMPTY)
190 189
191 L_SC int L_(is_empty)(L_(avl) *l_tree) 190 L_SC int L_(is_empty)(L_(avl) *l_tree) {
192 { 191 return(l_tree->root == AVL_NULL);
193 return(l_tree->root == AVL_NULL);
194 } 192 }
195 193
196 #endif 194 #endif
197 195
198 /* Put the private balance function in the same compilation module as 196 /* Put the private balance function in the same compilation module as
199 ** the insert function. */ 197 ** the insert function. */
200 #if (L_IMPL_MASK & AVL_IMPL_INSERT) 198 #if (L_IMPL_MASK & AVL_IMPL_INSERT)
201 199
202 /* Balances subtree, returns handle of root node of subtree after balancing. 200 /* Balances subtree, returns handle of root node of subtree after balancing.
203 */ 201 */
204 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h) 202 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h) {
205 { 203 AVL_HANDLE deep_h;
206 AVL_HANDLE deep_h; 204
207 205 /* Either the "greater than" or the "less than" subtree of
208 /* Either the "greater than" or the "less than" subtree of 206 ** this node has to be 2 levels deeper (or else it wouldn't
209 ** this node has to be 2 levels deeper (or else it wouldn't 207 ** need balancing).
210 ** need balancing). 208 */
211 */ 209 if (AVL_GET_BALANCE_FACTOR(bal_h) > 0) {
212 if (AVL_GET_BALANCE_FACTOR(bal_h) > 0) 210 /* "Greater than" subtree is deeper. */
213 { 211
214 /* "Greater than" subtree is deeper. */ 212 deep_h = AVL_GET_GREATER(bal_h, 1);
215 213
216 deep_h = AVL_GET_GREATER(bal_h, 1); 214 L_CHECK_READ_ERROR(AVL_NULL)
215
216 if (AVL_GET_BALANCE_FACTOR(deep_h) < 0) {
217 int bf;
218
219 AVL_HANDLE old_h = bal_h;
220 bal_h = AVL_GET_LESS(deep_h, 1);
221 L_CHECK_READ_ERROR(AVL_NULL)
222 AVL_SET_GREATER(old_h, AVL_GET_LESS(bal_h, 1))
223 AVL_SET_LESS(deep_h, AVL_GET_GREATER(bal_h, 1))
224 AVL_SET_LESS(bal_h, old_h)
225 AVL_SET_GREATER(bal_h, deep_h)
226
227 bf = AVL_GET_BALANCE_FACTOR(bal_h);
228
229 if (bf != 0) {
230 if (bf > 0) {
231 AVL_SET_BALANCE_FACTOR(old_h, -1)
232 AVL_SET_BALANCE_FACTOR(deep_h, 0)
233 } else {
234 AVL_SET_BALANCE_FACTOR(deep_h, 1)
235 AVL_SET_BALANCE_FACTOR(old_h, 0)
236 }
237
238 AVL_SET_BALANCE_FACTOR(bal_h, 0)
239 } else {
240 AVL_SET_BALANCE_FACTOR(old_h, 0)
241 AVL_SET_BALANCE_FACTOR(deep_h, 0)
242 }
243 } else {
244 AVL_SET_GREATER(bal_h, AVL_GET_LESS(deep_h, 0))
245 AVL_SET_LESS(deep_h, bal_h)
246
247 if (AVL_GET_BALANCE_FACTOR(deep_h) == 0) {
248 AVL_SET_BALANCE_FACTOR(deep_h, -1)
249 AVL_SET_BALANCE_FACTOR(bal_h, 1)
250 } else {
251 AVL_SET_BALANCE_FACTOR(deep_h, 0)
252 AVL_SET_BALANCE_FACTOR(bal_h, 0)
253 }
254
255 bal_h = deep_h;
256 }
257 } else {
258 /* "Less than" subtree is deeper. */
259
260 deep_h = AVL_GET_LESS(bal_h, 1);
261 L_CHECK_READ_ERROR(AVL_NULL)
262
263 if (AVL_GET_BALANCE_FACTOR(deep_h) > 0) {
264 int bf;
265 AVL_HANDLE old_h = bal_h;
266 bal_h = AVL_GET_GREATER(deep_h, 1);
267 L_CHECK_READ_ERROR(AVL_NULL)
268 AVL_SET_LESS(old_h, AVL_GET_GREATER(bal_h, 0))
269 AVL_SET_GREATER(deep_h, AVL_GET_LESS(bal_h, 0))
270 AVL_SET_GREATER(bal_h, old_h)
271 AVL_SET_LESS(bal_h, deep_h)
272
273 bf = AVL_GET_BALANCE_FACTOR(bal_h);
274
275 if (bf != 0) {
276 if (bf < 0) {
277 AVL_SET_BALANCE_FACTOR(old_h, 1)
278 AVL_SET_BALANCE_FACTOR(deep_h, 0)
279 } else {
280 AVL_SET_BALANCE_FACTOR(deep_h, -1)
281 AVL_SET_BALANCE_FACTOR(old_h, 0)
282 }
283
284 AVL_SET_BALANCE_FACTOR(bal_h, 0)
285 } else {
286 AVL_SET_BALANCE_FACTOR(old_h, 0)
287 AVL_SET_BALANCE_FACTOR(deep_h, 0)
288 }
289 } else {
290 AVL_SET_LESS(bal_h, AVL_GET_GREATER(deep_h, 0))
291 AVL_SET_GREATER(deep_h, bal_h)
292
293 if (AVL_GET_BALANCE_FACTOR(deep_h) == 0) {
294 AVL_SET_BALANCE_FACTOR(deep_h, 1)
295 AVL_SET_BALANCE_FACTOR(bal_h, -1)
296 } else {
297 AVL_SET_BALANCE_FACTOR(deep_h, 0)
298 AVL_SET_BALANCE_FACTOR(bal_h, 0)
299 }
300
301 bal_h = deep_h;
302 }
303 }
304
305 return(bal_h);
306 }
307
308 L_SC AVL_HANDLE L_(insert)(L_(avl) *l_tree, AVL_HANDLE h) {
309 AVL_SET_LESS(h, AVL_NULL)
310 AVL_SET_GREATER(h, AVL_NULL)
311 AVL_SET_BALANCE_FACTOR(h, 0)
312
313 if (l_tree->root == AVL_NULL)
314 l_tree->root = h;
315 else {
316 /* Last unbalanced node encountered in search for insertion point. */
317 AVL_HANDLE unbal = AVL_NULL;
318 /* Parent of last unbalanced node. */
319 AVL_HANDLE parent_unbal = AVL_NULL;
320 /* Balance factor of last unbalanced node. */
321 int unbal_bf;
322
323 /* Zero-based depth in tree. */
324 unsigned depth = 0, unbal_depth = 0;
325
326 /* Records a path into the tree. If bit n is true, indicates
327 ** take greater branch from the nth node in the path, otherwise
328 ** take the less branch. bit 0 gives branch from root, and
329 ** so on. */
330 L_BIT_ARR_DEFN(branch)
331
332 AVL_HANDLE hh = l_tree->root;
333 AVL_HANDLE parent = AVL_NULL;
334 int cmp;
335
336 do {
337 if (AVL_GET_BALANCE_FACTOR(hh) != 0) {
338 unbal = hh;
339 parent_unbal = parent;
340 unbal_depth = depth;
341 }
342
343 cmp = AVL_COMPARE_NODE_NODE(h, hh);
344
345 if (cmp == 0)
346 /* Duplicate key. */
347 return(hh);
348
349 parent = hh;
350
351 if (cmp > 0) {
352 hh = AVL_GET_GREATER(hh, 1);
353 L_BIT_ARR_1(branch, depth)
354 } else {
355 hh = AVL_GET_LESS(hh, 1);
356 L_BIT_ARR_0(branch, depth)
357 }
358
359 L_CHECK_READ_ERROR(AVL_NULL)
360 depth++;
361 } while (hh != AVL_NULL);
362
363 /* Add node to insert as leaf of tree. */
364 if (cmp < 0)
365 AVL_SET_LESS(parent, h)
366 else
367 AVL_SET_GREATER(parent, h)
368
369 depth = unbal_depth;
370
371 if (unbal == AVL_NULL)
372 hh = l_tree->root;
373 else {
374 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
375 depth++;
376 unbal_bf = AVL_GET_BALANCE_FACTOR(unbal);
377
378 if (cmp < 0)
379 unbal_bf--;
380 else /* cmp > 0 */
381 unbal_bf++;
382
383 hh = cmp < 0 ? AVL_GET_LESS(unbal, 1) : AVL_GET_GREATER(unbal, 1);
384 L_CHECK_READ_ERROR(AVL_NULL)
385
386 if ((unbal_bf != -2) && (unbal_bf != 2)) {
387 /* No rebalancing of tree is necessary. */
388 AVL_SET_BALANCE_FACTOR(unbal, unbal_bf)
389 unbal = AVL_NULL;
390 }
391 }
392
393 if (hh != AVL_NULL)
394 while (h != hh) {
395 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
396 depth++;
397
398 if (cmp < 0) {
399 AVL_SET_BALANCE_FACTOR(hh, -1)
400 hh = AVL_GET_LESS(hh, 1);
401 } else { /* cmp > 0 */
402 AVL_SET_BALANCE_FACTOR(hh, 1)
403 hh = AVL_GET_GREATER(hh, 1);
404 }
217 405
218 L_CHECK_READ_ERROR(AVL_NULL) 406 L_CHECK_READ_ERROR(AVL_NULL)
219 407 }
220 if (AVL_GET_BALANCE_FACTOR(deep_h) < 0) 408
221 { 409 if (unbal != AVL_NULL) {
222 int bf; 410 unbal = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX unbal);
223 411 L_CHECK_READ_ERROR(AVL_NULL)
224 AVL_HANDLE old_h = bal_h; 412
225 bal_h = AVL_GET_LESS(deep_h, 1); 413 if (parent_unbal == AVL_NULL)
226 L_CHECK_READ_ERROR(AVL_NULL) 414 l_tree->root = unbal;
227 AVL_SET_GREATER(old_h, AVL_GET_LESS(bal_h, 1)) 415 else {
228 AVL_SET_LESS(deep_h, AVL_GET_GREATER(bal_h, 1)) 416 depth = unbal_depth - 1;
229 AVL_SET_LESS(bal_h, old_h) 417 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
230 AVL_SET_GREATER(bal_h, deep_h) 418
231 419 if (cmp < 0)
232 bf = AVL_GET_BALANCE_FACTOR(bal_h); 420 AVL_SET_LESS(parent_unbal, unbal)
233 421 else /* cmp > 0 */
234 if (bf != 0) 422 AVL_SET_GREATER(parent_unbal, unbal)
235 { 423 }
236 if (bf > 0)
237 {
238 AVL_SET_BALANCE_FACTOR(old_h, -1)
239 AVL_SET_BALANCE_FACTOR(deep_h, 0)
240 }
241 else
242 {
243 AVL_SET_BALANCE_FACTOR(deep_h, 1)
244 AVL_SET_BALANCE_FACTOR(old_h, 0)
245 }
246
247 AVL_SET_BALANCE_FACTOR(bal_h, 0)
248 }
249 else
250 {
251 AVL_SET_BALANCE_FACTOR(old_h, 0)
252 AVL_SET_BALANCE_FACTOR(deep_h, 0)
253 }
254 }
255 else
256 {
257 AVL_SET_GREATER(bal_h, AVL_GET_LESS(deep_h, 0))
258 AVL_SET_LESS(deep_h, bal_h)
259
260 if (AVL_GET_BALANCE_FACTOR(deep_h) == 0)
261 {
262 AVL_SET_BALANCE_FACTOR(deep_h, -1)
263 AVL_SET_BALANCE_FACTOR(bal_h, 1)
264 }
265 else
266 {
267 AVL_SET_BALANCE_FACTOR(deep_h, 0)
268 AVL_SET_BALANCE_FACTOR(bal_h, 0)
269 }
270
271 bal_h = deep_h;
272 }
273 } 424 }
274 else 425
275 { 426 }
276 /* "Less than" subtree is deeper. */ 427
277 428 return(h);
278 deep_h = AVL_GET_LESS(bal_h, 1);
279 L_CHECK_READ_ERROR(AVL_NULL)
280
281 if (AVL_GET_BALANCE_FACTOR(deep_h) > 0)
282 {
283 int bf;
284 AVL_HANDLE old_h = bal_h;
285 bal_h = AVL_GET_GREATER(deep_h, 1);
286 L_CHECK_READ_ERROR(AVL_NULL)
287 AVL_SET_LESS(old_h, AVL_GET_GREATER(bal_h, 0))
288 AVL_SET_GREATER(deep_h, AVL_GET_LESS(bal_h, 0))
289 AVL_SET_GREATER(bal_h, old_h)
290 AVL_SET_LESS(bal_h, deep_h)
291
292 bf = AVL_GET_BALANCE_FACTOR(bal_h);
293
294 if (bf != 0)
295 {
296 if (bf < 0)
297 {
298 AVL_SET_BALANCE_FACTOR(old_h, 1)
299 AVL_SET_BALANCE_FACTOR(deep_h, 0)
300 }
301 else
302 {
303 AVL_SET_BALANCE_FACTOR(deep_h, -1)
304 AVL_SET_BALANCE_FACTOR(old_h, 0)
305 }
306
307 AVL_SET_BALANCE_FACTOR(bal_h, 0)
308 }
309 else
310 {
311 AVL_SET_BALANCE_FACTOR(old_h, 0)
312 AVL_SET_BALANCE_FACTOR(deep_h, 0)
313 }
314 }
315 else
316 {
317 AVL_SET_LESS(bal_h, AVL_GET_GREATER(deep_h, 0))
318 AVL_SET_GREATER(deep_h, bal_h)
319
320 if (AVL_GET_BALANCE_FACTOR(deep_h) == 0)
321 {
322 AVL_SET_BALANCE_FACTOR(deep_h, 1)
323 AVL_SET_BALANCE_FACTOR(bal_h, -1)
324 }
325 else
326 {
327 AVL_SET_BALANCE_FACTOR(deep_h, 0)
328 AVL_SET_BALANCE_FACTOR(bal_h, 0)
329 }
330
331 bal_h = deep_h;
332 }
333 }
334
335 return(bal_h);
336 }
337
338 L_SC AVL_HANDLE L_(insert)(L_(avl) *l_tree, AVL_HANDLE h)
339 {
340 AVL_SET_LESS(h, AVL_NULL)
341 AVL_SET_GREATER(h, AVL_NULL)
342 AVL_SET_BALANCE_FACTOR(h, 0)
343
344 if (l_tree->root == AVL_NULL)
345 l_tree->root = h;
346 else
347 {
348 /* Last unbalanced node encountered in search for insertion point. */
349 AVL_HANDLE unbal = AVL_NULL;
350 /* Parent of last unbalanced node. */
351 AVL_HANDLE parent_unbal = AVL_NULL;
352 /* Balance factor of last unbalanced node. */
353 int unbal_bf;
354
355 /* Zero-based depth in tree. */
356 unsigned depth = 0, unbal_depth = 0;
357
358 /* Records a path into the tree. If bit n is true, indicates
359 ** take greater branch from the nth node in the path, otherwise
360 ** take the less branch. bit 0 gives branch from root, and
361 ** so on. */
362 L_BIT_ARR_DEFN(branch)
363
364 AVL_HANDLE hh = l_tree->root;
365 AVL_HANDLE parent = AVL_NULL;
366 int cmp;
367
368 do
369 {
370 if (AVL_GET_BALANCE_FACTOR(hh) != 0)
371 {
372 unbal = hh;
373 parent_unbal = parent;
374 unbal_depth = depth;
375 }
376
377 cmp = AVL_COMPARE_NODE_NODE(h, hh);
378
379 if (cmp == 0)
380 /* Duplicate key. */
381 return(hh);
382
383 parent = hh;
384
385 if (cmp > 0)
386 {
387 hh = AVL_GET_GREATER(hh, 1);
388 L_BIT_ARR_1(branch, depth)
389 }
390 else
391 {
392 hh = AVL_GET_LESS(hh, 1);
393 L_BIT_ARR_0(branch, depth)
394 }
395
396 L_CHECK_READ_ERROR(AVL_NULL)
397 depth++;
398 }
399 while (hh != AVL_NULL);
400
401 /* Add node to insert as leaf of tree. */
402 if (cmp < 0)
403 AVL_SET_LESS(parent, h)
404 else
405 AVL_SET_GREATER(parent, h)
406
407 depth = unbal_depth;
408
409 if (unbal == AVL_NULL)
410 hh = l_tree->root;
411 else
412 {
413 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
414 depth++;
415 unbal_bf = AVL_GET_BALANCE_FACTOR(unbal);
416
417 if (cmp < 0)
418 unbal_bf--;
419 else /* cmp > 0 */
420 unbal_bf++;
421
422 hh = cmp < 0 ? AVL_GET_LESS(unbal, 1) : AVL_GET_GREATER(unbal, 1);
423 L_CHECK_READ_ERROR(AVL_NULL)
424
425 if ((unbal_bf != -2) && (unbal_bf != 2))
426 {
427 /* No rebalancing of tree is necessary. */
428 AVL_SET_BALANCE_FACTOR(unbal, unbal_bf)
429 unbal = AVL_NULL;
430 }
431 }
432
433 if (hh != AVL_NULL)
434 while (h != hh)
435 {
436 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
437 depth++;
438
439 if (cmp < 0)
440 {
441 AVL_SET_BALANCE_FACTOR(hh, -1)
442 hh = AVL_GET_LESS(hh, 1);
443 }
444 else /* cmp > 0 */
445 {
446 AVL_SET_BALANCE_FACTOR(hh, 1)
447 hh = AVL_GET_GREATER(hh, 1);
448 }
449
450 L_CHECK_READ_ERROR(AVL_NULL)
451 }
452
453 if (unbal != AVL_NULL)
454 {
455 unbal = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX unbal);
456 L_CHECK_READ_ERROR(AVL_NULL)
457
458 if (parent_unbal == AVL_NULL)
459 l_tree->root = unbal;
460 else
461 {
462 depth = unbal_depth - 1;
463 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
464
465 if (cmp < 0)
466 AVL_SET_LESS(parent_unbal, unbal)
467 else /* cmp > 0 */
468 AVL_SET_GREATER(parent_unbal, unbal)
469 }
470 }
471
472 }
473
474 return(h);
475 } 429 }
476 430
477 #endif 431 #endif
478 432
479 #if (L_IMPL_MASK & AVL_IMPL_SEARCH) 433 #if (L_IMPL_MASK & AVL_IMPL_SEARCH)
480 434
481 L_SC AVL_HANDLE L_(search)(L_(avl) *l_tree, AVL_KEY k, avl_search_type st) 435 L_SC AVL_HANDLE L_(search)(L_(avl) *l_tree, AVL_KEY k, avl_search_type st) {
482 { 436 int cmp, target_cmp;
483 int cmp, target_cmp; 437 AVL_HANDLE match_h = AVL_NULL;
484 AVL_HANDLE match_h = AVL_NULL; 438 AVL_HANDLE h = l_tree->root;
485 AVL_HANDLE h = l_tree->root; 439
486 440 if (st & AVL_LESS)
487 if (st & AVL_LESS) 441 target_cmp = 1;
488 target_cmp = 1; 442 else if (st & AVL_GREATER)
489 else if (st & AVL_GREATER) 443 target_cmp = -1;
490 target_cmp = -1; 444 else
491 else 445 target_cmp = 0;
492 target_cmp = 0; 446
493 447 while (h != AVL_NULL) {
494 while (h != AVL_NULL) 448 cmp = AVL_COMPARE_KEY_NODE(k, h);
495 { 449
496 cmp = AVL_COMPARE_KEY_NODE(k, h); 450 if (cmp == 0) {
497 451 if (st & AVL_EQUAL) {
498 if (cmp == 0) 452 match_h = h;
499 { 453 break;
500 if (st & AVL_EQUAL) 454 }
501 { 455
502 match_h = h; 456 cmp = -target_cmp;
503 break; 457 } else if (target_cmp != 0)
504 } 458 if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
505 459 /* cmp and target_cmp are both positive or both negative. */
506 cmp = -target_cmp; 460 match_h = h;
507 } 461
508 else if (target_cmp != 0) 462 h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
509 if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT)) 463 L_CHECK_READ_ERROR(AVL_NULL)
510 /* cmp and target_cmp are both positive or both negative. */ 464 }
511 match_h = h; 465
512 466 return(match_h);
513 h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
514 L_CHECK_READ_ERROR(AVL_NULL)
515 }
516
517 return(match_h);
518 } 467 }
519 468
520 #endif 469 #endif
521 470
522 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_LEAST) 471 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_LEAST)
523 472
524 L_SC AVL_HANDLE L_(search_least)(L_(avl) *l_tree) 473 L_SC AVL_HANDLE L_(search_least)(L_(avl) *l_tree) {
525 { 474 AVL_HANDLE h = l_tree->root;
526 AVL_HANDLE h = l_tree->root; 475 AVL_HANDLE parent = AVL_NULL;
527 AVL_HANDLE parent = AVL_NULL; 476
528 477 while (h != AVL_NULL) {
529 while (h != AVL_NULL) 478 parent = h;
530 { 479 h = AVL_GET_LESS(h, 1);
531 parent = h; 480 L_CHECK_READ_ERROR(AVL_NULL)
532 h = AVL_GET_LESS(h, 1); 481 }
533 L_CHECK_READ_ERROR(AVL_NULL) 482
534 } 483 return(parent);
535
536 return(parent);
537 } 484 }
538 485
539 #endif 486 #endif
540 487
541 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_GREATEST) 488 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_GREATEST)
542 489
543 L_SC AVL_HANDLE L_(search_greatest)(L_(avl) *l_tree) 490 L_SC AVL_HANDLE L_(search_greatest)(L_(avl) *l_tree) {
544 { 491 AVL_HANDLE h = l_tree->root;
545 AVL_HANDLE h = l_tree->root; 492 AVL_HANDLE parent = AVL_NULL;
546 AVL_HANDLE parent = AVL_NULL; 493
547 494 while (h != AVL_NULL) {
548 while (h != AVL_NULL) 495 parent = h;
549 { 496 h = AVL_GET_GREATER(h, 1);
550 parent = h; 497 L_CHECK_READ_ERROR(AVL_NULL)
551 h = AVL_GET_GREATER(h, 1); 498 }
552 L_CHECK_READ_ERROR(AVL_NULL) 499
553 } 500 return(parent);
554
555 return(parent);
556 } 501 }
557 502
558 #endif 503 #endif
559 504
560 #if (L_IMPL_MASK & AVL_IMPL_REMOVE) 505 #if (L_IMPL_MASK & AVL_IMPL_REMOVE)
561 506
562 /* Prototype of balance function (called by remove) in case not in 507 /* Prototype of balance function (called by remove) in case not in
563 ** same compilation unit. 508 ** same compilation unit.
564 */ 509 */
565 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h); 510 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h);
566 511
567 L_SC AVL_HANDLE L_(remove)(L_(avl) *l_tree, AVL_KEY k) 512 L_SC AVL_HANDLE L_(remove)(L_(avl) *l_tree, AVL_KEY k) {
568 { 513 /* Zero-based depth in tree. */
569 /* Zero-based depth in tree. */ 514 unsigned depth = 0, rm_depth;
570 unsigned depth = 0, rm_depth; 515
571 516 /* Records a path into the tree. If bit n is true, indicates
572 /* Records a path into the tree. If bit n is true, indicates 517 ** take greater branch from the nth node in the path, otherwise
573 ** take greater branch from the nth node in the path, otherwise 518 ** take the less branch. bit 0 gives branch from root, and
574 ** take the less branch. bit 0 gives branch from root, and 519 ** so on. */
575 ** so on. */ 520 L_BIT_ARR_DEFN(branch)
576 L_BIT_ARR_DEFN(branch) 521
577 522 AVL_HANDLE h = l_tree->root;
578 AVL_HANDLE h = l_tree->root; 523 AVL_HANDLE parent = AVL_NULL;
579 AVL_HANDLE parent = AVL_NULL; 524 AVL_HANDLE child;
580 AVL_HANDLE child; 525 AVL_HANDLE path;
581 AVL_HANDLE path; 526 int cmp, cmp_shortened_sub_with_path;
582 int cmp, cmp_shortened_sub_with_path; 527 int reduced_depth;
583 int reduced_depth; 528 int bf;
584 int bf; 529 AVL_HANDLE rm;
585 AVL_HANDLE rm; 530 AVL_HANDLE parent_rm;
586 AVL_HANDLE parent_rm; 531
587 532 for (;;) {
588 for (; ;) 533 if (h == AVL_NULL)
589 { 534 /* No node in tree with given key. */
590 if (h == AVL_NULL) 535 return(AVL_NULL);
591 /* No node in tree with given key. */ 536
592 return(AVL_NULL); 537 cmp = AVL_COMPARE_KEY_NODE(k, h);
593 538
594 cmp = AVL_COMPARE_KEY_NODE(k, h); 539 if (cmp == 0)
595 540 /* Found node to remove. */
596 if (cmp == 0) 541 break;
597 /* Found node to remove. */ 542
598 break; 543 parent = h;
599 544
600 parent = h; 545 if (cmp > 0) {
601 546 h = AVL_GET_GREATER(h, 1);
602 if (cmp > 0) 547 L_BIT_ARR_1(branch, depth)
603 { 548 } else {
604 h = AVL_GET_GREATER(h, 1); 549 h = AVL_GET_LESS(h, 1);
605 L_BIT_ARR_1(branch, depth) 550 L_BIT_ARR_0(branch, depth)
606 }
607 else
608 {
609 h = AVL_GET_LESS(h, 1);
610 L_BIT_ARR_0(branch, depth)
611 }
612
613 L_CHECK_READ_ERROR(AVL_NULL)
614 depth++;
615 cmp_shortened_sub_with_path = cmp;
616 } 551 }
617 552
618 rm = h; 553 L_CHECK_READ_ERROR(AVL_NULL)
619 parent_rm = parent; 554 depth++;
620 rm_depth = depth; 555 cmp_shortened_sub_with_path = cmp;
621 556 }
622 /* If the node to remove is not a leaf node, we need to get a 557
623 ** leaf node, or a node with a single leaf as its child, to put 558 rm = h;
624 ** in the place of the node to remove. We will get the greatest 559 parent_rm = parent;
625 ** node in the less subtree (of the node to remove), or the least 560 rm_depth = depth;
626 ** node in the greater subtree. We take the leaf node from the 561
627 ** deeper subtree, if there is one. */ 562 /* If the node to remove is not a leaf node, we need to get a
628 563 ** leaf node, or a node with a single leaf as its child, to put
629 if (AVL_GET_BALANCE_FACTOR(h) < 0) 564 ** in the place of the node to remove. We will get the greatest
630 { 565 ** node in the less subtree (of the node to remove), or the least
566 ** node in the greater subtree. We take the leaf node from the
567 ** deeper subtree, if there is one. */
568
569 if (AVL_GET_BALANCE_FACTOR(h) < 0) {
570 child = AVL_GET_LESS(h, 1);
571 L_BIT_ARR_0(branch, depth)
572 cmp = -1;
573 } else {
574 child = AVL_GET_GREATER(h, 1);
575 L_BIT_ARR_1(branch, depth)
576 cmp = 1;
577 }
578
579 L_CHECK_READ_ERROR(AVL_NULL)
580 depth++;
581
582 if (child != AVL_NULL) {
583 cmp = -cmp;
584
585 do {
586 parent = h;
587 h = child;
588
589 if (cmp < 0) {
631 child = AVL_GET_LESS(h, 1); 590 child = AVL_GET_LESS(h, 1);
632 L_BIT_ARR_0(branch, depth) 591 L_BIT_ARR_0(branch, depth)
633 cmp = -1; 592 } else {
634 }
635 else
636 {
637 child = AVL_GET_GREATER(h, 1); 593 child = AVL_GET_GREATER(h, 1);
638 L_BIT_ARR_1(branch, depth) 594 L_BIT_ARR_1(branch, depth)
639 cmp = 1; 595 }
596
597 L_CHECK_READ_ERROR(AVL_NULL)
598 depth++;
599 } while (child != AVL_NULL);
600
601 if (parent == rm)
602 /* Only went through do loop once. Deleted node will be replaced
603 ** in the tree structure by one of its immediate children. */
604 cmp_shortened_sub_with_path = -cmp;
605 else
606 cmp_shortened_sub_with_path = cmp;
607
608 /* Get the handle of the opposite child, which may not be null. */
609 child = cmp > 0 ? AVL_GET_LESS(h, 0) : AVL_GET_GREATER(h, 0);
610 }
611
612 if (parent == AVL_NULL)
613 /* There were only 1 or 2 nodes in this tree. */
614 l_tree->root = child;
615 else if (cmp_shortened_sub_with_path < 0)
616 AVL_SET_LESS(parent, child)
617 else
618 AVL_SET_GREATER(parent, child)
619
620 /* "path" is the parent of the subtree being eliminated or reduced
621 ** from a depth of 2 to 1. If "path" is the node to be removed, we
622 ** set path to the node we're about to poke into the position of the
623 ** node to be removed. */
624 path = parent == rm ? h : parent;
625
626 if (h != rm) {
627 /* Poke in the replacement for the node to be removed. */
628 AVL_SET_LESS(h, AVL_GET_LESS(rm, 0))
629 AVL_SET_GREATER(h, AVL_GET_GREATER(rm, 0))
630 AVL_SET_BALANCE_FACTOR(h, AVL_GET_BALANCE_FACTOR(rm))
631
632 if (parent_rm == AVL_NULL)
633 l_tree->root = h;
634 else {
635 depth = rm_depth - 1;
636
637 if (L_BIT_ARR_VAL(branch, depth))
638 AVL_SET_GREATER(parent_rm, h)
639 else
640 AVL_SET_LESS(parent_rm, h)
641 }
642 }
643
644 if (path != AVL_NULL) {
645 /* Create a temporary linked list from the parent of the path node
646 ** to the root node. */
647 h = l_tree->root;
648 parent = AVL_NULL;
649 depth = 0;
650
651 while (h != path) {
652 if (L_BIT_ARR_VAL(branch, depth)) {
653 child = AVL_GET_GREATER(h, 1);
654 AVL_SET_GREATER(h, parent)
655 } else {
656 child = AVL_GET_LESS(h, 1);
657 AVL_SET_LESS(h, parent)
658 }
659
660 L_CHECK_READ_ERROR(AVL_NULL)
661 depth++;
662 parent = h;
663 h = child;
640 } 664 }
641 665
666 /* Climb from the path node to the root node using the linked
667 ** list, restoring the tree structure and rebalancing as necessary.
668 */
669 reduced_depth = 1;
670 cmp = cmp_shortened_sub_with_path;
671
672 for (;;) {
673 if (reduced_depth) {
674 bf = AVL_GET_BALANCE_FACTOR(h);
675
676 if (cmp < 0)
677 bf++;
678 else /* cmp > 0 */
679 bf--;
680
681 if ((bf == -2) || (bf == 2)) {
682 h = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX h);
683 L_CHECK_READ_ERROR(AVL_NULL)
684 bf = AVL_GET_BALANCE_FACTOR(h);
685 } else
686 AVL_SET_BALANCE_FACTOR(h, bf)
687 reduced_depth = (bf == 0);
688 }
689
690 if (parent == AVL_NULL)
691 break;
692
693 child = h;
694 h = parent;
695 depth--;
696 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
697
698 if (cmp < 0) {
699 parent = AVL_GET_LESS(h, 1);
700 AVL_SET_LESS(h, child)
701 } else {
702 parent = AVL_GET_GREATER(h, 1);
703 AVL_SET_GREATER(h, child)
704 }
705
706 L_CHECK_READ_ERROR(AVL_NULL)
707 }
708
709 l_tree->root = h;
710 }
711
712 return(rm);
713 }
714
715 #endif
716
717 #if (L_IMPL_MASK & AVL_IMPL_SUBST)
718
719 L_SC AVL_HANDLE L_(subst)(L_(avl) *l_tree, AVL_HANDLE new_node) {
720 AVL_HANDLE h = l_tree->root;
721 AVL_HANDLE parent = AVL_NULL;
722 int cmp, last_cmp;
723
724 /* Search for node already in tree with same key. */
725 for (;;) {
726 if (h == AVL_NULL)
727 /* No node in tree with same key as new node. */
728 return(AVL_NULL);
729
730 cmp = AVL_COMPARE_NODE_NODE(new_node, h);
731
732 if (cmp == 0)
733 /* Found the node to substitute new one for. */
734 break;
735
736 last_cmp = cmp;
737 parent = h;
738 h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
642 L_CHECK_READ_ERROR(AVL_NULL) 739 L_CHECK_READ_ERROR(AVL_NULL)
643 depth++; 740 }
644 741
645 if (child != AVL_NULL) 742 /* Copy tree housekeeping fields from node in tree to new node. */
646 { 743 AVL_SET_LESS(new_node, AVL_GET_LESS(h, 0))
647 cmp = -cmp; 744 AVL_SET_GREATER(new_node, AVL_GET_GREATER(h, 0))
648 745 AVL_SET_BALANCE_FACTOR(new_node, AVL_GET_BALANCE_FACTOR(h))
649 do 746
650 { 747 if (parent == AVL_NULL)
651 parent = h; 748 /* New node is also new root. */
652 h = child; 749 l_tree->root = new_node;
653 750 else {
654 if (cmp < 0) 751 /* Make parent point to new node. */
655 { 752 if (last_cmp < 0)
656 child = AVL_GET_LESS(h, 1); 753 AVL_SET_LESS(parent, new_node)
657 L_BIT_ARR_0(branch, depth) 754 else
658 } 755 AVL_SET_GREATER(parent, new_node)
659 else 756 }
660 { 757
661 child = AVL_GET_GREATER(h, 1); 758 return(h);
662 L_BIT_ARR_1(branch, depth)
663 }
664
665 L_CHECK_READ_ERROR(AVL_NULL)
666 depth++;
667 }
668 while (child != AVL_NULL);
669
670 if (parent == rm)
671 /* Only went through do loop once. Deleted node will be replaced
672 ** in the tree structure by one of its immediate children. */
673 cmp_shortened_sub_with_path = -cmp;
674 else
675 cmp_shortened_sub_with_path = cmp;
676
677 /* Get the handle of the opposite child, which may not be null. */
678 child = cmp > 0 ? AVL_GET_LESS(h, 0) : AVL_GET_GREATER(h, 0);
679 }
680
681 if (parent == AVL_NULL)
682 /* There were only 1 or 2 nodes in this tree. */
683 l_tree->root = child;
684 else if (cmp_shortened_sub_with_path < 0)
685 AVL_SET_LESS(parent, child)
686 else
687 AVL_SET_GREATER(parent, child)
688
689 /* "path" is the parent of the subtree being eliminated or reduced
690 ** from a depth of 2 to 1. If "path" is the node to be removed, we
691 ** set path to the node we're about to poke into the position of the
692 ** node to be removed. */
693 path = parent == rm ? h : parent;
694
695 if (h != rm)
696 {
697 /* Poke in the replacement for the node to be removed. */
698 AVL_SET_LESS(h, AVL_GET_LESS(rm, 0))
699 AVL_SET_GREATER(h, AVL_GET_GREATER(rm, 0))
700 AVL_SET_BALANCE_FACTOR(h, AVL_GET_BALANCE_FACTOR(rm))
701
702 if (parent_rm == AVL_NULL)
703 l_tree->root = h;
704 else
705 {
706 depth = rm_depth - 1;
707
708 if (L_BIT_ARR_VAL(branch, depth))
709 AVL_SET_GREATER(parent_rm, h)
710 else
711 AVL_SET_LESS(parent_rm, h)
712 }
713 }
714
715 if (path != AVL_NULL)
716 {
717 /* Create a temporary linked list from the parent of the path node
718 ** to the root node. */
719 h = l_tree->root;
720 parent = AVL_NULL;
721 depth = 0;
722
723 while (h != path)
724 {
725 if (L_BIT_ARR_VAL(branch, depth))
726 {
727 child = AVL_GET_GREATER(h, 1);
728 AVL_SET_GREATER(h, parent)
729 }
730 else
731 {
732 child = AVL_GET_LESS(h, 1);
733 AVL_SET_LESS(h, parent)
734 }
735
736 L_CHECK_READ_ERROR(AVL_NULL)
737 depth++;
738 parent = h;
739 h = child;
740 }
741
742 /* Climb from the path node to the root node using the linked
743 ** list, restoring the tree structure and rebalancing as necessary.
744 */
745 reduced_depth = 1;
746 cmp = cmp_shortened_sub_with_path;
747
748 for (; ;)
749 {
750 if (reduced_depth)
751 {
752 bf = AVL_GET_BALANCE_FACTOR(h);
753
754 if (cmp < 0)
755 bf++;
756 else /* cmp > 0 */
757 bf--;
758
759 if ((bf == -2) || (bf == 2))
760 {
761 h = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX h);
762 L_CHECK_READ_ERROR(AVL_NULL)
763 bf = AVL_GET_BALANCE_FACTOR(h);
764 }
765 else
766 AVL_SET_BALANCE_FACTOR(h, bf)
767 reduced_depth = (bf == 0);
768 }
769
770 if (parent == AVL_NULL)
771 break;
772
773 child = h;
774 h = parent;
775 depth--;
776 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
777
778 if (cmp < 0)
779 {
780 parent = AVL_GET_LESS(h, 1);
781 AVL_SET_LESS(h, child)
782 }
783 else
784 {
785 parent = AVL_GET_GREATER(h, 1);
786 AVL_SET_GREATER(h, child)
787 }
788
789 L_CHECK_READ_ERROR(AVL_NULL)
790 }
791
792 l_tree->root = h;
793 }
794
795 return(rm);
796 } 759 }
797 760
798 #endif 761 #endif
799
800 #if (L_IMPL_MASK & AVL_IMPL_SUBST)
801
802 L_SC AVL_HANDLE L_(subst)(L_(avl) *l_tree, AVL_HANDLE new_node)
803 {
804 AVL_HANDLE h = l_tree->root;
805 AVL_HANDLE parent = AVL_NULL;
806 int cmp, last_cmp;
807
808 /* Search for node already in tree with same key. */
809 for (; ;)
810 {
811 if (h == AVL_NULL)
812 /* No node in tree with same key as new node. */
813 return(AVL_NULL);
814
815 cmp = AVL_COMPARE_NODE_NODE(new_node, h);
816
817 if (cmp == 0)
818 /* Found the node to substitute new one for. */
819 break;
820
821 last_cmp = cmp;
822 parent = h;
823 h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
824 L_CHECK_READ_ERROR(AVL_NULL)
825 }
826
827 /* Copy tree housekeeping fields from node in tree to new node. */
828 AVL_SET_LESS(new_node, AVL_GET_LESS(h, 0))
829 AVL_SET_GREATER(new_node, AVL_GET_GREATER(h, 0))
830 AVL_SET_BALANCE_FACTOR(new_node, AVL_GET_BALANCE_FACTOR(h))
831
832 if (parent == AVL_NULL)
833 /* New node is also new root. */
834 l_tree->root = new_node;
835 else
836 {
837 /* Make parent point to new node. */
838 if (last_cmp < 0)
839 AVL_SET_LESS(parent, new_node)
840 else
841 AVL_SET_GREATER(parent, new_node)
842 }
843
844 return(h);
845 }
846
847 #endif
848 762
849 #ifdef AVL_BUILD_ITER_TYPE 763 #ifdef AVL_BUILD_ITER_TYPE
850 764
851 #if (L_IMPL_MASK & AVL_IMPL_BUILD) 765 #if (L_IMPL_MASK & AVL_IMPL_BUILD)
852 766
853 L_SC int L_(build)( 767 L_SC int L_(build)(
854 L_(avl) *l_tree, AVL_BUILD_ITER_TYPE p, L_SIZE num_nodes) 768 L_(avl) *l_tree, AVL_BUILD_ITER_TYPE p, L_SIZE num_nodes) {
855 { 769 /* Gives path to subtree being built. If bit n is false, branch
856 /* Gives path to subtree being built. If bit n is false, branch 770 ** less from the node at depth n, if true branch greater. */
857 ** less from the node at depth n, if true branch greater. */ 771 L_BIT_ARR_DEFN(branch)
858 L_BIT_ARR_DEFN(branch)
859 772
860 /* If bit n is true, then for the current subtree at depth n, its 773 /* If bit n is true, then for the current subtree at depth n, its
861 ** greater subtree has one more node than its less subtree. */ 774 ** greater subtree has one more node than its less subtree. */
862 L_BIT_ARR_DEFN(rem) 775 L_BIT_ARR_DEFN(rem)
863 776
864 /* Depth of root node of current subtree. */ 777 /* Depth of root node of current subtree. */
865 unsigned depth = 0; 778 unsigned depth = 0;
866 779
867 /* Number of nodes in current subtree. */ 780 /* Number of nodes in current subtree. */
868 L_SIZE num_sub = num_nodes; 781 L_SIZE num_sub = num_nodes;
869 782
870 /* The algorithm relies on a stack of nodes whose less subtree has 783 /* The algorithm relies on a stack of nodes whose less subtree has
871 ** been built, but whose greater subtree has not yet been built. 784 ** been built, but whose greater subtree has not yet been built.
872 ** The stack is implemented as linked list. The nodes are linked 785 ** The stack is implemented as linked list. The nodes are linked
873 ** together by having the "greater" handle of a node set to the 786 ** together by having the "greater" handle of a node set to the
874 ** next node in the list. "less_parent" is the handle of the first 787 ** next node in the list. "less_parent" is the handle of the first
875 ** node in the list. */ 788 ** node in the list. */
876 AVL_HANDLE less_parent = AVL_NULL; 789 AVL_HANDLE less_parent = AVL_NULL;
877 790
878 /* h is root of current subtree, child is one of its children. */ 791 /* h is root of current subtree, child is one of its children. */
879 AVL_HANDLE h; 792 AVL_HANDLE h;
880 AVL_HANDLE child; 793 AVL_HANDLE child;
881 794
882 if (num_nodes == 0) 795 if (num_nodes == 0) {
883 { 796 l_tree->root = AVL_NULL;
884 l_tree->root = AVL_NULL; 797 return(1);
885 return(1); 798 }
799
800 for (;;) {
801 while (num_sub > 2) {
802 /* Subtract one for root of subtree. */
803 num_sub--;
804
805 if (num_sub & 1)
806 L_BIT_ARR_1(rem, depth)
807 else
808 L_BIT_ARR_0(rem, depth)
809 L_BIT_ARR_0(branch, depth)
810 depth++;
811
812 num_sub >>= 1;
886 } 813 }
887 814
888 for (; ;) 815 if (num_sub == 2) {
889 { 816 /* Build a subtree with two nodes, slanting to greater.
890 while (num_sub > 2) 817 ** I arbitrarily chose to always have the extra node in the
891 { 818 ** greater subtree when there is an odd number of nodes to
892 /* Subtract one for root of subtree. */ 819 ** split between the two subtrees. */
893 num_sub--;
894 820
895 if (num_sub & 1) 821 h = AVL_BUILD_ITER_VAL(p);
896 L_BIT_ARR_1(rem, depth) 822 L_CHECK_READ_ERROR(0)
897 else 823 AVL_BUILD_ITER_INCR(p)
898 L_BIT_ARR_0(rem, depth) 824 child = AVL_BUILD_ITER_VAL(p);
899 L_BIT_ARR_0(branch, depth) 825 L_CHECK_READ_ERROR(0)
900 depth++; 826 AVL_BUILD_ITER_INCR(p)
827 AVL_SET_LESS(child, AVL_NULL)
828 AVL_SET_GREATER(child, AVL_NULL)
829 AVL_SET_BALANCE_FACTOR(child, 0)
830 AVL_SET_GREATER(h, child)
831 AVL_SET_LESS(h, AVL_NULL)
832 AVL_SET_BALANCE_FACTOR(h, 1)
833 } else { /* num_sub == 1 */
834 /* Build a subtree with one node. */
901 835
902 num_sub >>= 1; 836 h = AVL_BUILD_ITER_VAL(p);
837 L_CHECK_READ_ERROR(0)
838 AVL_BUILD_ITER_INCR(p)
839 AVL_SET_LESS(h, AVL_NULL)
840 AVL_SET_GREATER(h, AVL_NULL)
841 AVL_SET_BALANCE_FACTOR(h, 0)
842 }
843
844 while (depth) {
845 depth--;
846
847 if (!L_BIT_ARR_VAL(branch, depth))
848 /* We've completed a less subtree. */
849 break;
850
851 /* We've completed a greater subtree, so attach it to
852 ** its parent (that is less than it). We pop the parent
853 ** off the stack of less parents. */
854 child = h;
855 h = less_parent;
856 less_parent = AVL_GET_GREATER(h, 1);
857 L_CHECK_READ_ERROR(0)
858 AVL_SET_GREATER(h, child)
859 /* num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1 */
860 num_sub <<= 1;
861 num_sub += L_BIT_ARR_VAL(rem, depth) ? 0 : 1;
862
863 if (num_sub & (num_sub - 1))
864 /* num_sub is not a power of 2. */
865 AVL_SET_BALANCE_FACTOR(h, 0)
866 else
867 /* num_sub is a power of 2. */
868 AVL_SET_BALANCE_FACTOR(h, 1)
903 } 869 }
904 870
905 if (num_sub == 2) 871 if (num_sub == num_nodes)
906 { 872 /* We've completed the full tree. */
907 /* Build a subtree with two nodes, slanting to greater. 873 break;
908 ** I arbitrarily chose to always have the extra node in the
909 ** greater subtree when there is an odd number of nodes to
910 ** split between the two subtrees. */
911 874
912 h = AVL_BUILD_ITER_VAL(p); 875 /* The subtree we've completed is the less subtree of the
913 L_CHECK_READ_ERROR(0) 876 ** next node in the sequence. */
914 AVL_BUILD_ITER_INCR(p)
915 child = AVL_BUILD_ITER_VAL(p);
916 L_CHECK_READ_ERROR(0)
917 AVL_BUILD_ITER_INCR(p)
918 AVL_SET_LESS(child, AVL_NULL)
919 AVL_SET_GREATER(child, AVL_NULL)
920 AVL_SET_BALANCE_FACTOR(child, 0)
921 AVL_SET_GREATER(h, child)
922 AVL_SET_LESS(h, AVL_NULL)
923 AVL_SET_BALANCE_FACTOR(h, 1)
924 }
925 else /* num_sub == 1 */
926 {
927 /* Build a subtree with one node. */
928 877
929 h = AVL_BUILD_ITER_VAL(p); 878 child = h;
930 L_CHECK_READ_ERROR(0) 879 h = AVL_BUILD_ITER_VAL(p);
931 AVL_BUILD_ITER_INCR(p) 880 L_CHECK_READ_ERROR(0)
932 AVL_SET_LESS(h, AVL_NULL) 881 AVL_BUILD_ITER_INCR(p)
933 AVL_SET_GREATER(h, AVL_NULL) 882 AVL_SET_LESS(h, child)
934 AVL_SET_BALANCE_FACTOR(h, 0)
935 }
936 883
937 while (depth) 884 /* Put h into stack of less parents. */
938 { 885 AVL_SET_GREATER(h, less_parent)
939 depth--; 886 less_parent = h;
940 887
941 if (!L_BIT_ARR_VAL(branch, depth)) 888 /* Proceed to creating greater than subtree of h. */
942 /* We've completed a less subtree. */ 889 L_BIT_ARR_1(branch, depth)
943 break; 890 num_sub += L_BIT_ARR_VAL(rem, depth) ? 1 : 0;
891 depth++;
944 892
945 /* We've completed a greater subtree, so attach it to 893 } /* end for (;; ) */
946 ** its parent (that is less than it). We pop the parent
947 ** off the stack of less parents. */
948 child = h;
949 h = less_parent;
950 less_parent = AVL_GET_GREATER(h, 1);
951 L_CHECK_READ_ERROR(0)
952 AVL_SET_GREATER(h, child)
953 /* num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1 */
954 num_sub <<= 1;
955 num_sub += L_BIT_ARR_VAL(rem, depth) ? 0 : 1;
956 894
957 if (num_sub & (num_sub - 1)) 895 l_tree->root = h;
958 /* num_sub is not a power of 2. */
959 AVL_SET_BALANCE_FACTOR(h, 0)
960 else
961 /* num_sub is a power of 2. */
962 AVL_SET_BALANCE_FACTOR(h, 1)
963 }
964 896
965 if (num_sub == num_nodes) 897 return(1);
966 /* We've completed the full tree. */
967 break;
968
969 /* The subtree we've completed is the less subtree of the
970 ** next node in the sequence. */
971
972 child = h;
973 h = AVL_BUILD_ITER_VAL(p);
974 L_CHECK_READ_ERROR(0)
975 AVL_BUILD_ITER_INCR(p)
976 AVL_SET_LESS(h, child)
977
978 /* Put h into stack of less parents. */
979 AVL_SET_GREATER(h, less_parent)
980 less_parent = h;
981
982 /* Proceed to creating greater than subtree of h. */
983 L_BIT_ARR_1(branch, depth)
984 num_sub += L_BIT_ARR_VAL(rem, depth) ? 1 : 0;
985 depth++;
986
987 } /* end for ( ; ; ) */
988
989 l_tree->root = h;
990
991 return(1);
992 } 898 }
993 899
994 #endif 900 #endif
995 901
996 #endif 902 #endif
997 903
998 #if (L_IMPL_MASK & AVL_IMPL_INIT_ITER) 904 #if (L_IMPL_MASK & AVL_IMPL_INIT_ITER)
999 905
1000 /* Initialize depth to invalid value, to indicate iterator is 906 /* Initialize depth to invalid value, to indicate iterator is
1001 ** invalid. (Depth is zero-base.) It's not necessary to initialize 907 ** invalid. (Depth is zero-base.) It's not necessary to initialize
1002 ** iterators prior to passing them to the "start" function. 908 ** iterators prior to passing them to the "start" function.
1003 */ 909 */
1004 L_SC void L_(init_iter)(L_(iter) *iter) 910 L_SC void L_(init_iter)(L_(iter) *iter) {
1005 { 911 iter->depth = ~0;
1006 iter->depth = ~0;
1007 } 912 }
1008 913
1009 #endif 914 #endif
1010 915
1011 #ifdef AVL_READ_ERRORS_HAPPEN 916 #ifdef AVL_READ_ERRORS_HAPPEN
1012 917
1013 #define L_CHECK_READ_ERROR_INV_DEPTH \ 918 #define L_CHECK_READ_ERROR_INV_DEPTH \
1014 { if (AVL_READ_ERROR) { iter->depth = ~0; return; } } 919 { if (AVL_READ_ERROR) { iter->depth = ~0; return; } }
1015 920
1016 #else 921 #else
1017 922
1018 #define L_CHECK_READ_ERROR_INV_DEPTH 923 #define L_CHECK_READ_ERROR_INV_DEPTH
1019 924
1020 #endif 925 #endif
1021 926
1022 #if (L_IMPL_MASK & AVL_IMPL_START_ITER) 927 #if (L_IMPL_MASK & AVL_IMPL_START_ITER)
1023 928
1024 L_SC void L_(start_iter)( 929 L_SC void L_(start_iter)(
1025 L_(avl) *l_tree, L_(iter) *iter, AVL_KEY k, avl_search_type st) 930 L_(avl) *l_tree, L_(iter) *iter, AVL_KEY k, avl_search_type st) {
1026 { 931 AVL_HANDLE h = l_tree->root;
1027 AVL_HANDLE h = l_tree->root; 932 unsigned d = 0;
1028 unsigned d = 0; 933 int cmp, target_cmp;
1029 int cmp, target_cmp;
1030 934
1031 /* Save the tree that we're going to iterate through in a 935 /* Save the tree that we're going to iterate through in a
1032 ** member variable. */ 936 ** member variable. */
1033 iter->tree_ = l_tree; 937 iter->tree_ = l_tree;
1034 938
1035 iter->depth = ~0; 939 iter->depth = ~0;
940
941 if (h == AVL_NULL)
942 /* Tree is empty. */
943 return;
944
945 if (st & AVL_LESS)
946 /* Key can be greater than key of starting node. */
947 target_cmp = 1;
948 else if (st & AVL_GREATER)
949 /* Key can be less than key of starting node. */
950 target_cmp = -1;
951 else
952 /* Key must be same as key of starting node. */
953 target_cmp = 0;
954
955 for (;;) {
956 cmp = AVL_COMPARE_KEY_NODE(k, h);
957
958 if (cmp == 0) {
959 if (st & AVL_EQUAL) {
960 /* Equal node was sought and found as starting node. */
961 iter->depth = d;
962 break;
963 }
964
965 cmp = -target_cmp;
966 } else if (target_cmp != 0)
967 if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
968 /* cmp and target_cmp are both negative or both positive. */
969 iter->depth = d;
970
971 h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
972 L_CHECK_READ_ERROR_INV_DEPTH
1036 973
1037 if (h == AVL_NULL) 974 if (h == AVL_NULL)
1038 /* Tree is empty. */ 975 break;
1039 return;
1040 976
1041 if (st & AVL_LESS) 977 if (cmp > 0)
1042 /* Key can be greater than key of starting node. */ 978 L_BIT_ARR_1(iter->branch, d)
1043 target_cmp = 1; 979 else
1044 else if (st & AVL_GREATER) 980 L_BIT_ARR_0(iter->branch, d)
1045 /* Key can be less than key of starting node. */ 981 iter->path_h[d++] = h;
1046 target_cmp = -1; 982 }
1047 else
1048 /* Key must be same as key of starting node. */
1049 target_cmp = 0;
1050
1051 for (; ;)
1052 {
1053 cmp = AVL_COMPARE_KEY_NODE(k, h);
1054
1055 if (cmp == 0)
1056 {
1057 if (st & AVL_EQUAL)
1058 {
1059 /* Equal node was sought and found as starting node. */
1060 iter->depth = d;
1061 break;
1062 }
1063
1064 cmp = -target_cmp;
1065 }
1066 else if (target_cmp != 0)
1067 if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
1068 /* cmp and target_cmp are both negative or both positive. */
1069 iter->depth = d;
1070
1071 h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
1072 L_CHECK_READ_ERROR_INV_DEPTH
1073
1074 if (h == AVL_NULL)
1075 break;
1076
1077 if (cmp > 0)
1078 L_BIT_ARR_1(iter->branch, d)
1079 else
1080 L_BIT_ARR_0(iter->branch, d)
1081 iter->path_h[d++] = h;
1082 }
1083 } 983 }
1084 984
1085 #endif 985 #endif
1086 986
1087 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_LEAST) 987 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_LEAST)
1088 988
1089 L_SC void L_(start_iter_least)(L_(avl) *l_tree, L_(iter) *iter) 989 L_SC void L_(start_iter_least)(L_(avl) *l_tree, L_(iter) *iter) {
1090 { 990 AVL_HANDLE h = l_tree->root;
1091 AVL_HANDLE h = l_tree->root;
1092 991
1093 iter->tree_ = l_tree; 992 iter->tree_ = l_tree;
1094 993
1095 iter->depth = ~0; 994 iter->depth = ~0;
1096 995
1097 L_BIT_ARR_ALL(iter->branch, 0) 996 L_BIT_ARR_ALL(iter->branch, 0)
1098 997
1099 while (h != AVL_NULL) 998 while (h != AVL_NULL) {
1100 { 999 if (iter->depth != ~0)
1101 if (iter->depth != ~0) 1000 iter->path_h[iter->depth] = h;
1102 iter->path_h[iter->depth] = h;
1103 1001
1104 iter->depth++; 1002 iter->depth++;
1105 h = AVL_GET_LESS(h, 1); 1003 h = AVL_GET_LESS(h, 1);
1106 L_CHECK_READ_ERROR_INV_DEPTH 1004 L_CHECK_READ_ERROR_INV_DEPTH
1107 } 1005 }
1108 } 1006 }
1109 1007
1110 #endif 1008 #endif
1111 1009
1112 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_GREATEST) 1010 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_GREATEST)
1113 1011
1114 L_SC void L_(start_iter_greatest)(L_(avl) *l_tree, L_(iter) *iter) 1012 L_SC void L_(start_iter_greatest)(L_(avl) *l_tree, L_(iter) *iter) {
1115 { 1013 AVL_HANDLE h = l_tree->root;
1116 AVL_HANDLE h = l_tree->root;
1117 1014
1118 iter->tree_ = l_tree; 1015 iter->tree_ = l_tree;
1119 1016
1120 iter->depth = ~0; 1017 iter->depth = ~0;
1121 1018
1122 L_BIT_ARR_ALL(iter->branch, 1) 1019 L_BIT_ARR_ALL(iter->branch, 1)
1123 1020
1124 while (h != AVL_NULL) 1021 while (h != AVL_NULL) {
1125 { 1022 if (iter->depth != ~0)
1126 if (iter->depth != ~0) 1023 iter->path_h[iter->depth] = h;
1127 iter->path_h[iter->depth] = h;
1128 1024
1129 iter->depth++; 1025 iter->depth++;
1130 h = AVL_GET_GREATER(h, 1); 1026 h = AVL_GET_GREATER(h, 1);
1131 L_CHECK_READ_ERROR_INV_DEPTH 1027 L_CHECK_READ_ERROR_INV_DEPTH
1132 } 1028 }
1133 } 1029 }
1134 1030
1135 #endif 1031 #endif
1136 1032
1137 #if (L_IMPL_MASK & AVL_IMPL_GET_ITER) 1033 #if (L_IMPL_MASK & AVL_IMPL_GET_ITER)
1138 1034
1139 L_SC AVL_HANDLE L_(get_iter)(L_(iter) *iter) 1035 L_SC AVL_HANDLE L_(get_iter)(L_(iter) *iter) {
1140 { 1036 if (iter->depth == ~0)
1141 if (iter->depth == ~0) 1037 return(AVL_NULL);
1142 return(AVL_NULL);
1143 1038
1144 return(iter->depth == 0 ? 1039 return(iter->depth == 0 ?
1145 iter->tree_->root : iter->path_h[iter->depth - 1]); 1040 iter->tree_->root : iter->path_h[iter->depth - 1]);
1146 } 1041 }
1147 1042
1148 #endif 1043 #endif
1149 1044
1150 #if (L_IMPL_MASK & AVL_IMPL_INCR_ITER) 1045 #if (L_IMPL_MASK & AVL_IMPL_INCR_ITER)
1151 1046
1152 L_SC void L_(incr_iter)(L_(iter) *iter) 1047 L_SC void L_(incr_iter)(L_(iter) *iter) {
1153 {
1154 #define l_tree (iter->tree_) 1048 #define l_tree (iter->tree_)
1155 1049
1156 if (iter->depth != ~0) 1050 if (iter->depth != ~0) {
1157 { 1051 AVL_HANDLE h =
1158 AVL_HANDLE h = 1052 AVL_GET_GREATER((iter->depth == 0 ?
1159 AVL_GET_GREATER((iter->depth == 0 ? 1053 iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
1160 iter->tree_->root : iter->path_h[iter->depth - 1]), 1); 1054 L_CHECK_READ_ERROR_INV_DEPTH
1055
1056 if (h == AVL_NULL)
1057 do {
1058 if (iter->depth == 0) {
1059 iter->depth = ~0;
1060 break;
1061 }
1062
1063 iter->depth--;
1064 } while (L_BIT_ARR_VAL(iter->branch, iter->depth));
1065 else {
1066 L_BIT_ARR_1(iter->branch, iter->depth)
1067 iter->path_h[iter->depth++] = h;
1068
1069 for (;;) {
1070 h = AVL_GET_LESS(h, 1);
1161 L_CHECK_READ_ERROR_INV_DEPTH 1071 L_CHECK_READ_ERROR_INV_DEPTH
1162 1072
1163 if (h == AVL_NULL) 1073 if (h == AVL_NULL)
1164 do 1074 break;
1165 {
1166 if (iter->depth == 0)
1167 {
1168 iter->depth = ~0;
1169 break;
1170 }
1171 1075
1172 iter->depth--; 1076 L_BIT_ARR_0(iter->branch, iter->depth)
1173 } 1077 iter->path_h[iter->depth++] = h;
1174 while (L_BIT_ARR_VAL(iter->branch, iter->depth)); 1078 }
1175 else
1176 {
1177 L_BIT_ARR_1(iter->branch, iter->depth)
1178 iter->path_h[iter->depth++] = h;
1179
1180 for (; ;)
1181 {
1182 h = AVL_GET_LESS(h, 1);
1183 L_CHECK_READ_ERROR_INV_DEPTH
1184
1185 if (h == AVL_NULL)
1186 break;
1187
1188 L_BIT_ARR_0(iter->branch, iter->depth)
1189 iter->path_h[iter->depth++] = h;
1190 }
1191 }
1192 } 1079 }
1080 }
1193 1081
1194 #undef l_tree 1082 #undef l_tree
1195 } 1083 }
1196 1084
1197 #endif 1085 #endif
1198 1086
1199 #if (L_IMPL_MASK & AVL_IMPL_DECR_ITER) 1087 #if (L_IMPL_MASK & AVL_IMPL_DECR_ITER)
1200 1088
1201 L_SC void L_(decr_iter)(L_(iter) *iter) 1089 L_SC void L_(decr_iter)(L_(iter) *iter) {
1202 {
1203 #define l_tree (iter->tree_) 1090 #define l_tree (iter->tree_)
1204 1091
1205 if (iter->depth != ~0) 1092 if (iter->depth != ~0) {
1206 { 1093 AVL_HANDLE h =
1207 AVL_HANDLE h = 1094 AVL_GET_LESS((iter->depth == 0 ?
1208 AVL_GET_LESS((iter->depth == 0 ? 1095 iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
1209 iter->tree_->root : iter->path_h[iter->depth - 1]), 1) ; 1096 L_CHECK_READ_ERROR_INV_DEPTH
1097
1098 if (h == AVL_NULL)
1099 do {
1100 if (iter->depth == 0) {
1101 iter->depth = ~0;
1102 break;
1103 }
1104
1105 iter->depth--;
1106 } while (!L_BIT_ARR_VAL(iter->branch, iter->depth));
1107 else {
1108 L_BIT_ARR_0(iter->branch, iter->depth)
1109 iter->path_h[iter->depth++] = h;
1110
1111 for (;;) {
1112 h = AVL_GET_GREATER(h, 1);
1210 L_CHECK_READ_ERROR_INV_DEPTH 1113 L_CHECK_READ_ERROR_INV_DEPTH
1211 1114
1212 if (h == AVL_NULL) 1115 if (h == AVL_NULL)
1213 do 1116 break;
1214 {
1215 if (iter->depth == 0)
1216 {
1217 iter->depth = ~0;
1218 break;
1219 }
1220 1117
1221 iter->depth--; 1118 L_BIT_ARR_1(iter->branch, iter->depth)
1222 } 1119 iter->path_h[iter->depth++] = h;
1223 while (!L_BIT_ARR_VAL(iter->branch, iter->depth)); 1120 }
1224 else
1225 {
1226 L_BIT_ARR_0(iter->branch, iter->depth)
1227 iter->path_h[iter->depth++] = h;
1228
1229 for (; ;)
1230 {
1231 h = AVL_GET_GREATER(h, 1);
1232 L_CHECK_READ_ERROR_INV_DEPTH
1233
1234 if (h == AVL_NULL)
1235 break;
1236
1237 L_BIT_ARR_1(iter->branch, iter->depth)
1238 iter->path_h[iter->depth++] = h;
1239 }
1240 }
1241 } 1121 }
1122 }
1242 1123
1243 #undef l_tree 1124 #undef l_tree
1244 } 1125 }
1245 1126
1246 #endif 1127 #endif
1247 1128
1248 /* Tidy up the preprocessor symbol name space. */ 1129 /* Tidy up the preprocessor symbol name space. */
1249 #undef L_ 1130 #undef L_
1250 #undef L_EST_LONG_BIT 1131 #undef L_EST_LONG_BIT
1251 #undef L_SIZE 1132 #undef L_SIZE
1252 #undef L_MASK_HIGH_BIT 1133 #undef L_MASK_HIGH_BIT
1253 #undef L_LONG_BIT 1134 #undef L_LONG_BIT
1254 #undef L_BIT_ARR_DEFN 1135 #undef L_BIT_ARR_DEFN
1255 #undef L_BIT_ARR_VAL 1136 #undef L_BIT_ARR_VAL
1256 #undef L_BIT_ARR_0 1137 #undef L_BIT_ARR_0
1257 #undef L_BIT_ARR_1 1138 #undef L_BIT_ARR_1
1258 #undef L_BIT_ARR_ALL 1139 #undef L_BIT_ARR_ALL
1259 #undef L_CHECK_READ_ERROR 1140 #undef L_CHECK_READ_ERROR
1260 #undef L_CHECK_READ_ERROR_INV_DEPTH 1141 #undef L_CHECK_READ_ERROR_INV_DEPTH
1261 #undef L_BIT_ARR_LONGS 1142 #undef L_BIT_ARR_LONGS
1262 #undef L_IMPL_MASK 1143 #undef L_IMPL_MASK
1263 #undef L_CHECK_READ_ERROR 1144 #undef L_CHECK_READ_ERROR
1264 #undef L_CHECK_READ_ERROR_INV_DEPTH 1145 #undef L_CHECK_READ_ERROR_INV_DEPTH
1265 #undef L_SC 1146 #undef L_SC
1266 #undef L_BALANCE_PARAM_CALL_PREFIX 1147 #undef L_BALANCE_PARAM_CALL_PREFIX
1267 #undef L_BALANCE_PARAM_DECL_PREFIX 1148 #undef L_BALANCE_PARAM_DECL_PREFIX
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698