1/*
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 *
4 * Based on Abstract AVL Tree Template v1.5 by Walt Karas
5 * <http://geocities.com/wkaras/gen_cpp/avl_tree.html>.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1.  Redistributions of source code must retain the above copyright
12 *     notice, this list of conditions and the following disclaimer.
13 * 2.  Redistributions in binary form must reproduce the above copyright
14 *     notice, this list of conditions and the following disclaimer in the
15 *     documentation and/or other materials provided with the distribution.
16 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
17 *     its contributors may be used to endorse or promote products derived
18 *     from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
24 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef AVL_TREE_H_
33#define AVL_TREE_H_
34
35#include "Assertions.h"
36#include <wtf/FixedArray.h>
37
38namespace WTF {
39
40// Here is the reference class for BSet.
41//
42// class BSet
43//   {
44//   public:
45//
46//     class ANY_bitref
47//       {
48//       public:
49//         operator bool ();
50//         void operator = (bool b);
51//       };
52//
53//     // Does not have to initialize bits.
54//     BSet();
55//
56//     // Must return a valid value for index when 0 <= index < maxDepth
57//     ANY_bitref operator [] (unsigned index);
58//
59//     // Set all bits to 1.
60//     void set();
61//
62//     // Set all bits to 0.
63//     void reset();
64//   };
65
66template<unsigned maxDepth>
67class AVLTreeDefaultBSet {
68public:
69    bool& operator[](unsigned i) { ASSERT(i < maxDepth); return m_data[i]; }
70    void set() { for (unsigned i = 0; i < maxDepth; ++i) m_data[i] = true; }
71    void reset() { for (unsigned i = 0; i < maxDepth; ++i) m_data[i] = false; }
72
73private:
74    FixedArray<bool, maxDepth> m_data;
75};
76
77// How to determine maxDepth:
78// d  Minimum number of nodes
79// 2  2
80// 3  4
81// 4  7
82// 5  12
83// 6  20
84// 7  33
85// 8  54
86// 9  88
87// 10 143
88// 11 232
89// 12 376
90// 13 609
91// 14 986
92// 15 1,596
93// 16 2,583
94// 17 4,180
95// 18 6,764
96// 19 10,945
97// 20 17,710
98// 21 28,656
99// 22 46,367
100// 23 75,024
101// 24 121,392
102// 25 196,417
103// 26 317,810
104// 27 514,228
105// 28 832,039
106// 29 1,346,268
107// 30 2,178,308
108// 31 3,524,577
109// 32 5,702,886
110// 33 9,227,464
111// 34 14,930,351
112// 35 24,157,816
113// 36 39,088,168
114// 37 63,245,985
115// 38 102,334,154
116// 39 165,580,140
117// 40 267,914,295
118// 41 433,494,436
119// 42 701,408,732
120// 43 1,134,903,169
121// 44 1,836,311,902
122// 45 2,971,215,072
123//
124// E.g., if, in a particular instantiation, the maximum number of nodes in a tree instance is 1,000,000, the maximum depth should be 28.
125// You pick 28 because MN(28) is 832,039, which is less than or equal to 1,000,000, and MN(29) is 1,346,268, which is strictly greater than 1,000,000.
126
127template <class Abstractor, unsigned maxDepth = 32, class BSet = AVLTreeDefaultBSet<maxDepth> >
128class AVLTree {
129public:
130
131    typedef typename Abstractor::key key;
132    typedef typename Abstractor::handle handle;
133    typedef typename Abstractor::size size;
134
135    enum SearchType {
136        EQUAL = 1,
137        LESS = 2,
138        GREATER = 4,
139        LESS_EQUAL = EQUAL | LESS,
140        GREATER_EQUAL = EQUAL | GREATER
141    };
142
143
144    Abstractor& abstractor() { return abs; }
145
146    inline handle insert(handle h);
147
148    inline handle search(key k, SearchType st = EQUAL);
149    inline handle search_least();
150    inline handle search_greatest();
151
152    inline handle remove(key k);
153
154    inline handle subst(handle new_node);
155
156    void purge() { abs.root = null(); }
157
158    bool is_empty() { return abs.root == null(); }
159
160    AVLTree() { abs.root = null(); }
161
162    class Iterator {
163    public:
164
165        // Initialize depth to invalid value, to indicate iterator is
166        // invalid.   (Depth is zero-base.)
167        Iterator() { depth = ~0U; }
168
169        void start_iter(AVLTree &tree, key k, SearchType st = EQUAL)
170        {
171            // Mask of high bit in an int.
172            const int MASK_HIGH_BIT = (int) ~ ((~ (unsigned) 0) >> 1);
173
174            // Save the tree that we're going to iterate through in a
175            // member variable.
176            tree_ = &tree;
177
178            int cmp, target_cmp;
179            handle h = tree_->abs.root;
180            unsigned d = 0;
181
182            depth = ~0U;
183
184            if (h == null())
185              // Tree is empty.
186              return;
187
188            if (st & LESS)
189              // Key can be greater than key of starting node.
190              target_cmp = 1;
191            else if (st & GREATER)
192              // Key can be less than key of starting node.
193              target_cmp = -1;
194            else
195              // Key must be same as key of starting node.
196              target_cmp = 0;
197
198            for (;;) {
199                cmp = cmp_k_n(k, h);
200                if (cmp == 0) {
201                    if (st & EQUAL) {
202                        // Equal node was sought and found as starting node.
203                        depth = d;
204                        break;
205                    }
206                    cmp = -target_cmp;
207                } else if (target_cmp != 0) {
208                    if (!((cmp ^ target_cmp) & MASK_HIGH_BIT)) {
209                        // cmp and target_cmp are both negative or both positive.
210                        depth = d;
211                    }
212                }
213                h = cmp < 0 ? get_lt(h) : get_gt(h);
214                if (h == null())
215                    break;
216                branch[d] = cmp > 0;
217                path_h[d++] = h;
218            }
219        }
220
221        void start_iter_least(AVLTree &tree)
222        {
223            tree_ = &tree;
224
225            handle h = tree_->abs.root;
226
227            depth = ~0U;
228
229            branch.reset();
230
231            while (h != null()) {
232                if (depth != ~0U)
233                    path_h[depth] = h;
234                depth++;
235                h = get_lt(h);
236            }
237        }
238
239        void start_iter_greatest(AVLTree &tree)
240        {
241            tree_ = &tree;
242
243            handle h = tree_->abs.root;
244
245            depth = ~0U;
246
247            branch.set();
248
249            while (h != null()) {
250                if (depth != ~0U)
251                    path_h[depth] = h;
252                depth++;
253                h = get_gt(h);
254            }
255        }
256
257        handle operator*()
258        {
259            if (depth == ~0U)
260                return null();
261
262            return depth == 0 ? tree_->abs.root : path_h[depth - 1];
263        }
264
265        void operator++()
266        {
267            if (depth != ~0U) {
268                handle h = get_gt(**this);
269                if (h == null()) {
270                    do {
271                        if (depth == 0) {
272                            depth = ~0U;
273                            break;
274                        }
275                        depth--;
276                    } while (branch[depth]);
277                } else {
278                    branch[depth] = true;
279                    path_h[depth++] = h;
280                    for (;;) {
281                        h = get_lt(h);
282                        if (h == null())
283                            break;
284                        branch[depth] = false;
285                        path_h[depth++] = h;
286                    }
287                }
288            }
289        }
290
291        void operator--()
292        {
293            if (depth != ~0U) {
294                handle h = get_lt(**this);
295                if (h == null())
296                    do {
297                        if (depth == 0) {
298                            depth = ~0U;
299                            break;
300                        }
301                        depth--;
302                    } while (!branch[depth]);
303                else {
304                    branch[depth] = false;
305                    path_h[depth++] = h;
306                    for (;;) {
307                        h = get_gt(h);
308                        if (h == null())
309                            break;
310                        branch[depth] = true;
311                        path_h[depth++] = h;
312                    }
313                }
314            }
315        }
316
317        void operator++(int) { ++(*this); }
318        void operator--(int) { --(*this); }
319
320    protected:
321
322        // Tree being iterated over.
323        AVLTree *tree_;
324
325        // Records a path into the tree.  If branch[n] is true, indicates
326        // take greater branch from the nth node in the path, otherwise
327        // take the less branch.  branch[0] gives branch from root, and
328        // so on.
329        BSet branch;
330
331        // Zero-based depth of path into tree.
332        unsigned depth;
333
334        // Handles of nodes in path from root to current node (returned by *).
335        handle path_h[maxDepth - 1];
336
337        int cmp_k_n(key k, handle h) { return tree_->abs.compare_key_node(k, h); }
338        int cmp_n_n(handle h1, handle h2) { return tree_->abs.compare_node_node(h1, h2); }
339        handle get_lt(handle h) { return tree_->abs.get_less(h); }
340        handle get_gt(handle h) { return tree_->abs.get_greater(h); }
341        handle null() { return tree_->abs.null(); }
342    };
343
344    template<typename fwd_iter>
345    bool build(fwd_iter p, size num_nodes)
346    {
347        if (num_nodes == 0) {
348            abs.root = null();
349            return true;
350        }
351
352        // Gives path to subtree being built.  If branch[N] is false, branch
353        // less from the node at depth N, if true branch greater.
354        BSet branch;
355
356        // If rem[N] is true, then for the current subtree at depth N, it's
357        // greater subtree has one more node than it's less subtree.
358        BSet rem;
359
360            // Depth of root node of current subtree.
361        unsigned depth = 0;
362
363            // Number of nodes in current subtree.
364        size num_sub = num_nodes;
365
366        // The algorithm relies on a stack of nodes whose less subtree has
367        // been built, but whose right subtree has not yet been built.  The
368        // stack is implemented as linked list.  The nodes are linked
369        // together by having the "greater" handle of a node set to the
370        // next node in the list.  "less_parent" is the handle of the first
371        // node in the list.
372        handle less_parent = null();
373
374        // h is root of current subtree, child is one of its children.
375        handle h, child;
376
377        for (;;) {
378            while (num_sub > 2) {
379                // Subtract one for root of subtree.
380                num_sub--;
381                rem[depth] = !!(num_sub & 1);
382                branch[depth++] = false;
383                num_sub >>= 1;
384            }
385
386            if (num_sub == 2) {
387                // Build a subtree with two nodes, slanting to greater.
388                // I arbitrarily chose to always have the extra node in the
389                // greater subtree when there is an odd number of nodes to
390                // split between the two subtrees.
391
392                h = *p;
393                p++;
394                child = *p;
395                p++;
396                set_lt(child, null());
397                set_gt(child, null());
398                set_bf(child, 0);
399                set_gt(h, child);
400                set_lt(h, null());
401                set_bf(h, 1);
402            } else { // num_sub == 1
403                // Build a subtree with one node.
404
405                h = *p;
406                p++;
407                set_lt(h, null());
408                set_gt(h, null());
409                set_bf(h, 0);
410            }
411
412            while (depth) {
413                depth--;
414                if (!branch[depth])
415                    // We've completed a less subtree.
416                    break;
417
418                // We've completed a greater subtree, so attach it to
419                // its parent (that is less than it).  We pop the parent
420                // off the stack of less parents.
421                child = h;
422                h = less_parent;
423                less_parent = get_gt(h);
424                set_gt(h, child);
425                // num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1
426                num_sub <<= 1;
427                num_sub += 1 - rem[depth];
428                if (num_sub & (num_sub - 1))
429                    // num_sub is not a power of 2
430                    set_bf(h, 0);
431                else
432                    // num_sub is a power of 2
433                    set_bf(h, 1);
434            }
435
436            if (num_sub == num_nodes)
437                // We've completed the full tree.
438                break;
439
440            // The subtree we've completed is the less subtree of the
441            // next node in the sequence.
442
443            child = h;
444            h = *p;
445            p++;
446            set_lt(h, child);
447
448            // Put h into stack of less parents.
449            set_gt(h, less_parent);
450            less_parent = h;
451
452            // Proceed to creating greater than subtree of h.
453            branch[depth] = true;
454            num_sub += rem[depth++];
455
456        } // end for (;;)
457
458        abs.root = h;
459
460        return true;
461    }
462
463protected:
464
465    friend class Iterator;
466
467    // Create a class whose sole purpose is to take advantage of
468    // the "empty member" optimization.
469    struct abs_plus_root : public Abstractor {
470        // The handle of the root element in the AVL tree.
471        handle root;
472    };
473
474    abs_plus_root abs;
475
476
477    handle get_lt(handle h) { return abs.get_less(h); }
478    void set_lt(handle h, handle lh) { abs.set_less(h, lh); }
479
480    handle get_gt(handle h) { return abs.get_greater(h); }
481    void set_gt(handle h, handle gh) { abs.set_greater(h, gh); }
482
483    int get_bf(handle h) { return abs.get_balance_factor(h); }
484    void set_bf(handle h, int bf) { abs.set_balance_factor(h, bf); }
485
486    int cmp_k_n(key k, handle h) { return abs.compare_key_node(k, h); }
487    int cmp_n_n(handle h1, handle h2) { return abs.compare_node_node(h1, h2); }
488
489    handle null() { return abs.null(); }
490
491private:
492
493    // Balances subtree, returns handle of root node of subtree
494    // after balancing.
495    handle balance(handle bal_h)
496    {
497        handle deep_h;
498
499        // Either the "greater than" or the "less than" subtree of
500        // this node has to be 2 levels deeper (or else it wouldn't
501        // need balancing).
502
503        if (get_bf(bal_h) > 0) {
504            // "Greater than" subtree is deeper.
505
506            deep_h = get_gt(bal_h);
507
508            if (get_bf(deep_h) < 0) {
509                handle old_h = bal_h;
510                bal_h = get_lt(deep_h);
511
512                set_gt(old_h, get_lt(bal_h));
513                set_lt(deep_h, get_gt(bal_h));
514                set_lt(bal_h, old_h);
515                set_gt(bal_h, deep_h);
516
517                int bf = get_bf(bal_h);
518                if (bf != 0) {
519                    if (bf > 0) {
520                        set_bf(old_h, -1);
521                        set_bf(deep_h, 0);
522                    } else {
523                        set_bf(deep_h, 1);
524                        set_bf(old_h, 0);
525                    }
526                    set_bf(bal_h, 0);
527                } else {
528                    set_bf(old_h, 0);
529                    set_bf(deep_h, 0);
530                }
531            } else {
532                set_gt(bal_h, get_lt(deep_h));
533                set_lt(deep_h, bal_h);
534                if (get_bf(deep_h) == 0) {
535                    set_bf(deep_h, -1);
536                    set_bf(bal_h, 1);
537                } else {
538                    set_bf(deep_h, 0);
539                    set_bf(bal_h, 0);
540                }
541                bal_h = deep_h;
542            }
543        } else {
544            // "Less than" subtree is deeper.
545
546            deep_h = get_lt(bal_h);
547
548            if (get_bf(deep_h) > 0) {
549                handle old_h = bal_h;
550                bal_h = get_gt(deep_h);
551                set_lt(old_h, get_gt(bal_h));
552                set_gt(deep_h, get_lt(bal_h));
553                set_gt(bal_h, old_h);
554                set_lt(bal_h, deep_h);
555
556                int bf = get_bf(bal_h);
557                if (bf != 0) {
558                    if (bf < 0) {
559                        set_bf(old_h, 1);
560                        set_bf(deep_h, 0);
561                    } else {
562                        set_bf(deep_h, -1);
563                        set_bf(old_h, 0);
564                    }
565                    set_bf(bal_h, 0);
566                } else {
567                    set_bf(old_h, 0);
568                    set_bf(deep_h, 0);
569                }
570            } else {
571                set_lt(bal_h, get_gt(deep_h));
572                set_gt(deep_h, bal_h);
573                if (get_bf(deep_h) == 0) {
574                    set_bf(deep_h, 1);
575                    set_bf(bal_h, -1);
576                } else {
577                    set_bf(deep_h, 0);
578                    set_bf(bal_h, 0);
579                }
580                bal_h = deep_h;
581            }
582        }
583
584        return bal_h;
585    }
586
587};
588
589template <class Abstractor, unsigned maxDepth, class BSet>
590inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
591AVLTree<Abstractor, maxDepth, BSet>::insert(handle h)
592{
593    set_lt(h, null());
594    set_gt(h, null());
595    set_bf(h, 0);
596
597    if (abs.root == null())
598        abs.root = h;
599    else {
600        // Last unbalanced node encountered in search for insertion point.
601        handle unbal = null();
602        // Parent of last unbalanced node.
603        handle parent_unbal = null();
604        // Balance factor of last unbalanced node.
605        int unbal_bf;
606
607        // Zero-based depth in tree.
608        unsigned depth = 0, unbal_depth = 0;
609
610        // Records a path into the tree.  If branch[n] is true, indicates
611        // take greater branch from the nth node in the path, otherwise
612        // take the less branch.  branch[0] gives branch from root, and
613        // so on.
614        BSet branch;
615
616        handle hh = abs.root;
617        handle parent = null();
618        int cmp;
619
620        do {
621            if (get_bf(hh) != 0) {
622                unbal = hh;
623                parent_unbal = parent;
624                unbal_depth = depth;
625            }
626            cmp = cmp_n_n(h, hh);
627            if (cmp == 0)
628                // Duplicate key.
629                return hh;
630            parent = hh;
631            hh = cmp < 0 ? get_lt(hh) : get_gt(hh);
632            branch[depth++] = cmp > 0;
633        } while (hh != null());
634
635        //  Add node to insert as leaf of tree.
636        if (cmp < 0)
637            set_lt(parent, h);
638        else
639            set_gt(parent, h);
640
641        depth = unbal_depth;
642
643        if (unbal == null())
644            hh = abs.root;
645        else {
646            cmp = branch[depth++] ? 1 : -1;
647            unbal_bf = get_bf(unbal);
648            if (cmp < 0)
649                unbal_bf--;
650            else  // cmp > 0
651                unbal_bf++;
652            hh = cmp < 0 ? get_lt(unbal) : get_gt(unbal);
653            if ((unbal_bf != -2) && (unbal_bf != 2)) {
654                // No rebalancing of tree is necessary.
655                set_bf(unbal, unbal_bf);
656                unbal = null();
657            }
658        }
659
660        if (hh != null())
661            while (h != hh) {
662                cmp = branch[depth++] ? 1 : -1;
663                if (cmp < 0) {
664                    set_bf(hh, -1);
665                    hh = get_lt(hh);
666                } else { // cmp > 0
667                    set_bf(hh, 1);
668                    hh = get_gt(hh);
669                }
670            }
671
672        if (unbal != null()) {
673            unbal = balance(unbal);
674            if (parent_unbal == null())
675                abs.root = unbal;
676            else {
677                depth = unbal_depth - 1;
678                cmp = branch[depth] ? 1 : -1;
679                if (cmp < 0)
680                    set_lt(parent_unbal, unbal);
681                else  // cmp > 0
682                    set_gt(parent_unbal, unbal);
683            }
684        }
685    }
686
687    return h;
688}
689
690template <class Abstractor, unsigned maxDepth, class BSet>
691inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
692AVLTree<Abstractor, maxDepth, BSet>::search(key k, typename AVLTree<Abstractor, maxDepth, BSet>::SearchType st)
693{
694    const int MASK_HIGH_BIT = (int) ~ ((~ (unsigned) 0) >> 1);
695
696    int cmp, target_cmp;
697    handle match_h = null();
698    handle h = abs.root;
699
700    if (st & LESS)
701        target_cmp = 1;
702    else if (st & GREATER)
703        target_cmp = -1;
704    else
705        target_cmp = 0;
706
707    while (h != null()) {
708        cmp = cmp_k_n(k, h);
709        if (cmp == 0) {
710            if (st & EQUAL) {
711                match_h = h;
712                break;
713            }
714            cmp = -target_cmp;
715        } else if (target_cmp != 0)
716            if (!((cmp ^ target_cmp) & MASK_HIGH_BIT))
717                // cmp and target_cmp are both positive or both negative.
718                match_h = h;
719        h = cmp < 0 ? get_lt(h) : get_gt(h);
720    }
721
722    return match_h;
723}
724
725template <class Abstractor, unsigned maxDepth, class BSet>
726inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
727AVLTree<Abstractor, maxDepth, BSet>::search_least()
728{
729    handle h = abs.root, parent = null();
730
731    while (h != null()) {
732        parent = h;
733        h = get_lt(h);
734    }
735
736    return parent;
737}
738
739template <class Abstractor, unsigned maxDepth, class BSet>
740inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
741AVLTree<Abstractor, maxDepth, BSet>::search_greatest()
742{
743    handle h = abs.root, parent = null();
744
745    while (h != null()) {
746        parent = h;
747        h = get_gt(h);
748    }
749
750    return parent;
751}
752
753template <class Abstractor, unsigned maxDepth, class BSet>
754inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
755AVLTree<Abstractor, maxDepth, BSet>::remove(key k)
756{
757    // Zero-based depth in tree.
758    unsigned depth = 0, rm_depth;
759
760    // Records a path into the tree.  If branch[n] is true, indicates
761    // take greater branch from the nth node in the path, otherwise
762    // take the less branch.  branch[0] gives branch from root, and
763    // so on.
764    BSet branch;
765
766    handle h = abs.root;
767    handle parent = null(), child;
768    int cmp, cmp_shortened_sub_with_path = 0;
769
770    for (;;) {
771        if (h == null())
772            // No node in tree with given key.
773            return null();
774        cmp = cmp_k_n(k, h);
775        if (cmp == 0)
776            // Found node to remove.
777            break;
778        parent = h;
779        h = cmp < 0 ? get_lt(h) : get_gt(h);
780        branch[depth++] = cmp > 0;
781        cmp_shortened_sub_with_path = cmp;
782    }
783    handle rm = h;
784    handle parent_rm = parent;
785    rm_depth = depth;
786
787    // If the node to remove is not a leaf node, we need to get a
788    // leaf node, or a node with a single leaf as its child, to put
789    // in the place of the node to remove.  We will get the greatest
790    // node in the less subtree (of the node to remove), or the least
791    // node in the greater subtree.  We take the leaf node from the
792    // deeper subtree, if there is one.
793
794    if (get_bf(h) < 0) {
795        child = get_lt(h);
796        branch[depth] = false;
797        cmp = -1;
798    } else {
799        child = get_gt(h);
800        branch[depth] = true;
801        cmp = 1;
802    }
803    depth++;
804
805    if (child != null()) {
806        cmp = -cmp;
807        do {
808            parent = h;
809            h = child;
810            if (cmp < 0) {
811                child = get_lt(h);
812                branch[depth] = false;
813            } else {
814                child = get_gt(h);
815                branch[depth] = true;
816            }
817            depth++;
818        } while (child != null());
819
820        if (parent == rm)
821            // Only went through do loop once.  Deleted node will be replaced
822            // in the tree structure by one of its immediate children.
823            cmp_shortened_sub_with_path = -cmp;
824        else
825            cmp_shortened_sub_with_path = cmp;
826
827        // Get the handle of the opposite child, which may not be null.
828        child = cmp > 0 ? get_lt(h) : get_gt(h);
829    }
830
831    if (parent == null())
832        // There were only 1 or 2 nodes in this tree.
833        abs.root = child;
834    else if (cmp_shortened_sub_with_path < 0)
835        set_lt(parent, child);
836    else
837        set_gt(parent, child);
838
839    // "path" is the parent of the subtree being eliminated or reduced
840    // from a depth of 2 to 1.  If "path" is the node to be removed, we
841    // set path to the node we're about to poke into the position of the
842    // node to be removed.
843    handle path = parent == rm ? h : parent;
844
845    if (h != rm) {
846        // Poke in the replacement for the node to be removed.
847        set_lt(h, get_lt(rm));
848        set_gt(h, get_gt(rm));
849        set_bf(h, get_bf(rm));
850        if (parent_rm == null())
851            abs.root = h;
852        else {
853            depth = rm_depth - 1;
854            if (branch[depth])
855                set_gt(parent_rm, h);
856            else
857                set_lt(parent_rm, h);
858        }
859    }
860
861    if (path != null()) {
862        // Create a temporary linked list from the parent of the path node
863        // to the root node.
864        h = abs.root;
865        parent = null();
866        depth = 0;
867        while (h != path) {
868            if (branch[depth++]) {
869                child = get_gt(h);
870                set_gt(h, parent);
871            } else {
872                child = get_lt(h);
873                set_lt(h, parent);
874            }
875            parent = h;
876            h = child;
877        }
878
879        // Climb from the path node to the root node using the linked
880        // list, restoring the tree structure and rebalancing as necessary.
881        bool reduced_depth = true;
882        int bf;
883        cmp = cmp_shortened_sub_with_path;
884        for (;;) {
885            if (reduced_depth) {
886                bf = get_bf(h);
887                if (cmp < 0)
888                    bf++;
889                else  // cmp > 0
890                    bf--;
891                if ((bf == -2) || (bf == 2)) {
892                    h = balance(h);
893                    bf = get_bf(h);
894                } else
895                    set_bf(h, bf);
896                reduced_depth = (bf == 0);
897            }
898            if (parent == null())
899                break;
900            child = h;
901            h = parent;
902            cmp = branch[--depth] ? 1 : -1;
903            if (cmp < 0)    {
904                parent = get_lt(h);
905                set_lt(h, child);
906            } else {
907                parent = get_gt(h);
908                set_gt(h, child);
909            }
910        }
911        abs.root = h;
912    }
913
914    return rm;
915}
916
917template <class Abstractor, unsigned maxDepth, class BSet>
918inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
919AVLTree<Abstractor, maxDepth, BSet>::subst(handle new_node)
920{
921    handle h = abs.root;
922    handle parent = null();
923    int cmp, last_cmp;
924
925    /* Search for node already in tree with same key. */
926    for (;;) {
927        if (h == null())
928            /* No node in tree with same key as new node. */
929            return null();
930        cmp = cmp_n_n(new_node, h);
931        if (cmp == 0)
932            /* Found the node to substitute new one for. */
933            break;
934        last_cmp = cmp;
935        parent = h;
936        h = cmp < 0 ? get_lt(h) : get_gt(h);
937    }
938
939    /* Copy tree housekeeping fields from node in tree to new node. */
940    set_lt(new_node, get_lt(h));
941    set_gt(new_node, get_gt(h));
942    set_bf(new_node, get_bf(h));
943
944    if (parent == null())
945        /* New node is also new root. */
946        abs.root = new_node;
947    else {
948        /* Make parent point to new node. */
949        if (last_cmp < 0)
950            set_lt(parent, new_node);
951        else
952            set_gt(parent, new_node);
953    }
954
955    return h;
956}
957
958}
959
960#endif
961