1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12 /* Abstract AVL Tree Generic C Package.
13 ** Implementation generation header file.
14 **
15 ** This code is in the public domain. See cavl_tree.html for interface
16 ** documentation.
17 **
18 ** Version: 1.5 Author: Walt Karas
19 */
20
21 #undef L_
22 #undef L_EST_LONG_BIT
23 #undef L_SIZE
24 #undef l_tree
25 #undef L_MASK_HIGH_BIT
26 #undef L_LONG_BIT
27 #undef L_BIT_ARR_DEFN
28 #undef L_BIT_ARR_VAL
29 #undef L_BIT_ARR_0
30 #undef L_BIT_ARR_1
31 #undef L_BIT_ARR_ALL
32 #undef L_BIT_ARR_LONGS
33 #undef L_IMPL_MASK
34 #undef L_CHECK_READ_ERROR
35 #undef L_CHECK_READ_ERROR_INV_DEPTH
36 #undef L_SC
37 #undef L_BALANCE_PARAM_PREFIX
38
39 #ifdef AVL_UNIQUE
40
41 #define L_ AVL_UNIQUE
42
43 #else
44
45 #define L_(X) X
46
47 #endif
48
49 /* Determine correct storage class for functions */
50 #ifdef AVL_PRIVATE
51
52 #define L_SC static
53
54 #else
55
56 #define L_SC
57
58 #endif
59
60 #ifdef AVL_SIZE
61
62 #define L_SIZE AVL_SIZE
63
64 #else
65
66 #define L_SIZE unsigned long
67
68 #endif
69
70 #define L_MASK_HIGH_BIT ((int) ~ ((~ (unsigned) 0) >> 1))
71
72 /* ANSI C/ISO C++ require that a long have at least 32 bits. Set
73 ** L_EST_LONG_BIT to be the greatest multiple of 8 in the range
74 ** 32 - 64 (inclusive) that is less than or equal to the number of
75 ** bits in a long.
76 */
77
78 #if (((LONG_MAX >> 31) >> 7) == 0)
79
80 #define L_EST_LONG_BIT 32
81
82 #elif (((LONG_MAX >> 31) >> 15) == 0)
83
84 #define L_EST_LONG_BIT 40
85
86 #elif (((LONG_MAX >> 31) >> 23) == 0)
87
88 #define L_EST_LONG_BIT 48
89
90 #elif (((LONG_MAX >> 31) >> 31) == 0)
91
92 #define L_EST_LONG_BIT 56
93
94 #else
95
96 #define L_EST_LONG_BIT 64
97
98 #endif
99
100 #define L_LONG_BIT (sizeof(long) * CHAR_BIT)
101
102 #if ((AVL_MAX_DEPTH) > L_EST_LONG_BIT)
103
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
106 ** depth. */
107
108 #define L_BIT_ARR_LONGS (((AVL_MAX_DEPTH) + L_LONG_BIT - 1) / L_LONG_BIT)
109
110 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME[L_BIT_ARR_LONGS];
111
112 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) \
113 ((BIT_ARR)[(BIT_NUM) / L_LONG_BIT] & (1L << ((BIT_NUM) % L_LONG_BIT)))
114
115 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) \
116 (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] &= ~(1L << ((BIT_NUM) % L_LONG_BIT));
117
118 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) \
119 (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] |= 1L << ((BIT_NUM) % L_LONG_BIT);
120
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); }
123
124 #else /* The bit array can definitely fit in one long */
125
126 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME;
127
128 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) ((BIT_ARR) & (1L << (BIT_NUM)))
129
130 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) (BIT_ARR) &= ~(1L << (BIT_NUM));
131
132 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) (BIT_ARR) |= 1L << (BIT_NUM);
133
134 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) (BIT_ARR) = 0L - (BIT_VAL);
135
136 #endif
137
138 #ifdef AVL_READ_ERRORS_HAPPEN
139
140 #define L_CHECK_READ_ERROR(ERROR_RETURN) \
141 { if (AVL_READ_ERROR) return(ERROR_RETURN); }
142
143 #else
144
145 #define L_CHECK_READ_ERROR(ERROR_RETURN)
146
147 #endif
148
149 /* The presumed reason that an instantiation places additional fields
150 ** inside the AVL tree structure is that the SET_ and GET_ macros
151 ** need these fields. The "balance" function does not explicitly use
152 ** any fields in the AVL tree structure, so only pass an AVL tree
153 ** structure pointer to "balance" if it has instantiation-specific
154 ** fields that are (presumably) needed by the SET_/GET_ calls within
155 ** "balance".
156 */
157 #ifdef AVL_INSIDE_STRUCT
158
159 #define L_BALANCE_PARAM_CALL_PREFIX l_tree,
160 #define L_BALANCE_PARAM_DECL_PREFIX L_(avl) *l_tree,
161
162 #else
163
164 #define L_BALANCE_PARAM_CALL_PREFIX
165 #define L_BALANCE_PARAM_DECL_PREFIX
166
167 #endif
168
169 #ifdef AVL_IMPL_MASK
170
171 #define L_IMPL_MASK (AVL_IMPL_MASK)
172
173 #else
174
175 /* Define all functions. */
176 #define L_IMPL_MASK AVL_IMPL_ALL
177
178 #endif
179
180 #if (L_IMPL_MASK & AVL_IMPL_INIT)
181
L_(init)182 L_SC void L_(init)(L_(avl) *l_tree)
183 {
184 l_tree->root = AVL_NULL;
185 }
186
187 #endif
188
189 #if (L_IMPL_MASK & AVL_IMPL_IS_EMPTY)
190
L_(is_empty)191 L_SC int L_(is_empty)(L_(avl) *l_tree)
192 {
193 return(l_tree->root == AVL_NULL);
194 }
195
196 #endif
197
198 /* Put the private balance function in the same compilation module as
199 ** the insert function. */
200 #if (L_IMPL_MASK & AVL_IMPL_INSERT)
201
202 /* Balances subtree, returns handle of root node of subtree after balancing.
203 */
L_(balance)204 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h)
205 {
206 AVL_HANDLE deep_h;
207
208 /* Either the "greater than" or the "less than" subtree of
209 ** this node has to be 2 levels deeper (or else it wouldn't
210 ** need balancing).
211 */
212 if (AVL_GET_BALANCE_FACTOR(bal_h) > 0)
213 {
214 /* "Greater than" subtree is deeper. */
215
216 deep_h = AVL_GET_GREATER(bal_h, 1);
217
218 L_CHECK_READ_ERROR(AVL_NULL)
219
220 if (AVL_GET_BALANCE_FACTOR(deep_h) < 0)
221 {
222 int bf;
223
224 AVL_HANDLE old_h = bal_h;
225 bal_h = AVL_GET_LESS(deep_h, 1);
226 L_CHECK_READ_ERROR(AVL_NULL)
227 AVL_SET_GREATER(old_h, AVL_GET_LESS(bal_h, 1))
228 AVL_SET_LESS(deep_h, AVL_GET_GREATER(bal_h, 1))
229 AVL_SET_LESS(bal_h, old_h)
230 AVL_SET_GREATER(bal_h, deep_h)
231
232 bf = AVL_GET_BALANCE_FACTOR(bal_h);
233
234 if (bf != 0)
235 {
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 }
274 else
275 {
276 /* "Less than" subtree is deeper. */
277
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
L_(insert)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 }
476
477 #endif
478
479 #if (L_IMPL_MASK & AVL_IMPL_SEARCH)
480
L_(search)481 L_SC AVL_HANDLE L_(search)(L_(avl) *l_tree, AVL_KEY k, avl_search_type st)
482 {
483 int cmp, target_cmp;
484 AVL_HANDLE match_h = AVL_NULL;
485 AVL_HANDLE h = l_tree->root;
486
487 if (st & AVL_LESS)
488 target_cmp = 1;
489 else if (st & AVL_GREATER)
490 target_cmp = -1;
491 else
492 target_cmp = 0;
493
494 while (h != AVL_NULL)
495 {
496 cmp = AVL_COMPARE_KEY_NODE(k, h);
497
498 if (cmp == 0)
499 {
500 if (st & AVL_EQUAL)
501 {
502 match_h = h;
503 break;
504 }
505
506 cmp = -target_cmp;
507 }
508 else if (target_cmp != 0)
509 if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
510 /* cmp and target_cmp are both positive or both negative. */
511 match_h = h;
512
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 }
519
520 #endif
521
522 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_LEAST)
523
L_(search_least)524 L_SC AVL_HANDLE L_(search_least)(L_(avl) *l_tree)
525 {
526 AVL_HANDLE h = l_tree->root;
527 AVL_HANDLE parent = AVL_NULL;
528
529 while (h != AVL_NULL)
530 {
531 parent = h;
532 h = AVL_GET_LESS(h, 1);
533 L_CHECK_READ_ERROR(AVL_NULL)
534 }
535
536 return(parent);
537 }
538
539 #endif
540
541 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_GREATEST)
542
L_(search_greatest)543 L_SC AVL_HANDLE L_(search_greatest)(L_(avl) *l_tree)
544 {
545 AVL_HANDLE h = l_tree->root;
546 AVL_HANDLE parent = AVL_NULL;
547
548 while (h != AVL_NULL)
549 {
550 parent = h;
551 h = AVL_GET_GREATER(h, 1);
552 L_CHECK_READ_ERROR(AVL_NULL)
553 }
554
555 return(parent);
556 }
557
558 #endif
559
560 #if (L_IMPL_MASK & AVL_IMPL_REMOVE)
561
562 /* Prototype of balance function (called by remove) in case not in
563 ** same compilation unit.
564 */
565 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h);
566
L_(remove)567 L_SC AVL_HANDLE L_(remove)(L_(avl) *l_tree, AVL_KEY k)
568 {
569 /* Zero-based depth in tree. */
570 unsigned depth = 0, rm_depth;
571
572 /* Records a path into the tree. If bit n is true, indicates
573 ** take greater branch from the nth node in the path, otherwise
574 ** take the less branch. bit 0 gives branch from root, and
575 ** so on. */
576 L_BIT_ARR_DEFN(branch)
577
578 AVL_HANDLE h = l_tree->root;
579 AVL_HANDLE parent = AVL_NULL;
580 AVL_HANDLE child;
581 AVL_HANDLE path;
582 int cmp, cmp_shortened_sub_with_path;
583 int reduced_depth;
584 int bf;
585 AVL_HANDLE rm;
586 AVL_HANDLE parent_rm;
587
588 for (; ;)
589 {
590 if (h == AVL_NULL)
591 /* No node in tree with given key. */
592 return(AVL_NULL);
593
594 cmp = AVL_COMPARE_KEY_NODE(k, h);
595
596 if (cmp == 0)
597 /* Found node to remove. */
598 break;
599
600 parent = h;
601
602 if (cmp > 0)
603 {
604 h = AVL_GET_GREATER(h, 1);
605 L_BIT_ARR_1(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 }
617
618 rm = h;
619 parent_rm = parent;
620 rm_depth = depth;
621
622 /* If the node to remove is not a leaf node, we need to get a
623 ** leaf node, or a node with a single leaf as its child, to put
624 ** in the place of the node to remove. We will get the greatest
625 ** node in the less subtree (of the node to remove), or the least
626 ** node in the greater subtree. We take the leaf node from the
627 ** deeper subtree, if there is one. */
628
629 if (AVL_GET_BALANCE_FACTOR(h) < 0)
630 {
631 child = AVL_GET_LESS(h, 1);
632 L_BIT_ARR_0(branch, depth)
633 cmp = -1;
634 }
635 else
636 {
637 child = AVL_GET_GREATER(h, 1);
638 L_BIT_ARR_1(branch, depth)
639 cmp = 1;
640 }
641
642 L_CHECK_READ_ERROR(AVL_NULL)
643 depth++;
644
645 if (child != AVL_NULL)
646 {
647 cmp = -cmp;
648
649 do
650 {
651 parent = h;
652 h = child;
653
654 if (cmp < 0)
655 {
656 child = AVL_GET_LESS(h, 1);
657 L_BIT_ARR_0(branch, depth)
658 }
659 else
660 {
661 child = AVL_GET_GREATER(h, 1);
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 }
797
798 #endif
799
800 #if (L_IMPL_MASK & AVL_IMPL_SUBST)
801
L_(subst)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
849 #ifdef AVL_BUILD_ITER_TYPE
850
851 #if (L_IMPL_MASK & AVL_IMPL_BUILD)
852
L_(build)853 L_SC int L_(build)(
854 L_(avl) *l_tree, AVL_BUILD_ITER_TYPE p, L_SIZE num_nodes)
855 {
856 /* Gives path to subtree being built. If bit n is false, branch
857 ** less from the node at depth n, if true branch greater. */
858 L_BIT_ARR_DEFN(branch)
859
860 /* 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. */
862 L_BIT_ARR_DEFN(rem)
863
864 /* Depth of root node of current subtree. */
865 unsigned depth = 0;
866
867 /* Number of nodes in current subtree. */
868 L_SIZE num_sub = num_nodes;
869
870 /* The algorithm relies on a stack of nodes whose less subtree has
871 ** been built, but whose greater subtree has not yet been built.
872 ** The stack is implemented as linked list. The nodes are linked
873 ** 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
875 ** node in the list. */
876 AVL_HANDLE less_parent = AVL_NULL;
877
878 /* h is root of current subtree, child is one of its children. */
879 AVL_HANDLE h;
880 AVL_HANDLE child;
881
882 if (num_nodes == 0)
883 {
884 l_tree->root = AVL_NULL;
885 return(1);
886 }
887
888 for (; ;)
889 {
890 while (num_sub > 2)
891 {
892 /* Subtract one for root of subtree. */
893 num_sub--;
894
895 if (num_sub & 1)
896 L_BIT_ARR_1(rem, depth)
897 else
898 L_BIT_ARR_0(rem, depth)
899 L_BIT_ARR_0(branch, depth)
900 depth++;
901
902 num_sub >>= 1;
903 }
904
905 if (num_sub == 2)
906 {
907 /* Build a subtree with two nodes, slanting to greater.
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
912 h = AVL_BUILD_ITER_VAL(p);
913 L_CHECK_READ_ERROR(0)
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
929 h = AVL_BUILD_ITER_VAL(p);
930 L_CHECK_READ_ERROR(0)
931 AVL_BUILD_ITER_INCR(p)
932 AVL_SET_LESS(h, AVL_NULL)
933 AVL_SET_GREATER(h, AVL_NULL)
934 AVL_SET_BALANCE_FACTOR(h, 0)
935 }
936
937 while (depth)
938 {
939 depth--;
940
941 if (!L_BIT_ARR_VAL(branch, depth))
942 /* We've completed a less subtree. */
943 break;
944
945 /* We've completed a greater subtree, so attach it to
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
957 if (num_sub & (num_sub - 1))
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
965 if (num_sub == num_nodes)
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 }
993
994 #endif
995
996 #endif
997
998 #if (L_IMPL_MASK & AVL_IMPL_INIT_ITER)
999
1000 /* Initialize depth to invalid value, to indicate iterator is
1001 ** invalid. (Depth is zero-base.) It's not necessary to initialize
1002 ** iterators prior to passing them to the "start" function.
1003 */
L_(init_iter)1004 L_SC void L_(init_iter)(L_(iter) *iter)
1005 {
1006 iter->depth = ~0;
1007 }
1008
1009 #endif
1010
1011 #ifdef AVL_READ_ERRORS_HAPPEN
1012
1013 #define L_CHECK_READ_ERROR_INV_DEPTH \
1014 { if (AVL_READ_ERROR) { iter->depth = ~0; return; } }
1015
1016 #else
1017
1018 #define L_CHECK_READ_ERROR_INV_DEPTH
1019
1020 #endif
1021
1022 #if (L_IMPL_MASK & AVL_IMPL_START_ITER)
1023
L_(start_iter)1024 L_SC void L_(start_iter)(
1025 L_(avl) *l_tree, L_(iter) *iter, AVL_KEY k, avl_search_type st)
1026 {
1027 AVL_HANDLE h = l_tree->root;
1028 unsigned d = 0;
1029 int cmp, target_cmp;
1030
1031 /* Save the tree that we're going to iterate through in a
1032 ** member variable. */
1033 iter->tree_ = l_tree;
1034
1035 iter->depth = ~0;
1036
1037 if (h == AVL_NULL)
1038 /* Tree is empty. */
1039 return;
1040
1041 if (st & AVL_LESS)
1042 /* Key can be greater than key of starting node. */
1043 target_cmp = 1;
1044 else if (st & AVL_GREATER)
1045 /* Key can be less than key of starting node. */
1046 target_cmp = -1;
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 }
1084
1085 #endif
1086
1087 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_LEAST)
1088
L_(start_iter_least)1089 L_SC void L_(start_iter_least)(L_(avl) *l_tree, L_(iter) *iter)
1090 {
1091 AVL_HANDLE h = l_tree->root;
1092
1093 iter->tree_ = l_tree;
1094
1095 iter->depth = ~0;
1096
1097 L_BIT_ARR_ALL(iter->branch, 0)
1098
1099 while (h != AVL_NULL)
1100 {
1101 if (iter->depth != ~0)
1102 iter->path_h[iter->depth] = h;
1103
1104 iter->depth++;
1105 h = AVL_GET_LESS(h, 1);
1106 L_CHECK_READ_ERROR_INV_DEPTH
1107 }
1108 }
1109
1110 #endif
1111
1112 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_GREATEST)
1113
L_(start_iter_greatest)1114 L_SC void L_(start_iter_greatest)(L_(avl) *l_tree, L_(iter) *iter)
1115 {
1116 AVL_HANDLE h = l_tree->root;
1117
1118 iter->tree_ = l_tree;
1119
1120 iter->depth = ~0;
1121
1122 L_BIT_ARR_ALL(iter->branch, 1)
1123
1124 while (h != AVL_NULL)
1125 {
1126 if (iter->depth != ~0)
1127 iter->path_h[iter->depth] = h;
1128
1129 iter->depth++;
1130 h = AVL_GET_GREATER(h, 1);
1131 L_CHECK_READ_ERROR_INV_DEPTH
1132 }
1133 }
1134
1135 #endif
1136
1137 #if (L_IMPL_MASK & AVL_IMPL_GET_ITER)
1138
L_(get_iter)1139 L_SC AVL_HANDLE L_(get_iter)(L_(iter) *iter)
1140 {
1141 if (iter->depth == ~0)
1142 return(AVL_NULL);
1143
1144 return(iter->depth == 0 ?
1145 iter->tree_->root : iter->path_h[iter->depth - 1]);
1146 }
1147
1148 #endif
1149
1150 #if (L_IMPL_MASK & AVL_IMPL_INCR_ITER)
1151
L_(incr_iter)1152 L_SC void L_(incr_iter)(L_(iter) *iter)
1153 {
1154 #define l_tree (iter->tree_)
1155
1156 if (iter->depth != ~0)
1157 {
1158 AVL_HANDLE h =
1159 AVL_GET_GREATER((iter->depth == 0 ?
1160 iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
1161 L_CHECK_READ_ERROR_INV_DEPTH
1162
1163 if (h == AVL_NULL)
1164 do
1165 {
1166 if (iter->depth == 0)
1167 {
1168 iter->depth = ~0;
1169 break;
1170 }
1171
1172 iter->depth--;
1173 }
1174 while (L_BIT_ARR_VAL(iter->branch, iter->depth));
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 }
1193
1194 #undef l_tree
1195 }
1196
1197 #endif
1198
1199 #if (L_IMPL_MASK & AVL_IMPL_DECR_ITER)
1200
L_(decr_iter)1201 L_SC void L_(decr_iter)(L_(iter) *iter)
1202 {
1203 #define l_tree (iter->tree_)
1204
1205 if (iter->depth != ~0)
1206 {
1207 AVL_HANDLE h =
1208 AVL_GET_LESS((iter->depth == 0 ?
1209 iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
1210 L_CHECK_READ_ERROR_INV_DEPTH
1211
1212 if (h == AVL_NULL)
1213 do
1214 {
1215 if (iter->depth == 0)
1216 {
1217 iter->depth = ~0;
1218 break;
1219 }
1220
1221 iter->depth--;
1222 }
1223 while (!L_BIT_ARR_VAL(iter->branch, iter->depth));
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 }
1242
1243 #undef l_tree
1244 }
1245
1246 #endif
1247
1248 /* Tidy up the preprocessor symbol name space. */
1249 #undef L_
1250 #undef L_EST_LONG_BIT
1251 #undef L_SIZE
1252 #undef L_MASK_HIGH_BIT
1253 #undef L_LONG_BIT
1254 #undef L_BIT_ARR_DEFN
1255 #undef L_BIT_ARR_VAL
1256 #undef L_BIT_ARR_0
1257 #undef L_BIT_ARR_1
1258 #undef L_BIT_ARR_ALL
1259 #undef L_CHECK_READ_ERROR
1260 #undef L_CHECK_READ_ERROR_INV_DEPTH
1261 #undef L_BIT_ARR_LONGS
1262 #undef L_IMPL_MASK
1263 #undef L_CHECK_READ_ERROR
1264 #undef L_CHECK_READ_ERROR_INV_DEPTH
1265 #undef L_SC
1266 #undef L_BALANCE_PARAM_CALL_PREFIX
1267 #undef L_BALANCE_PARAM_DECL_PREFIX
1268