cavl_impl.h revision 1b362b15af34006e6a11974088a46d42b903418e
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
182L_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
191L_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*/
204L_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
338L_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
481L_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
524L_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
543L_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*/
565L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h);
566
567L_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
802L_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
853L_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*/
1004L_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
1024L_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
1089L_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
1114L_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
1139L_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
1152L_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
1201L_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