示例#1
0
            ////////////////////////////////////////////////////////////////////////////

            public Node Merge(Node aNode)
            {
                if (aNode is StdNode)
                {
                    StdNode node    = (StdNode)aNode;
                    Node    newLeft = node.left != null?Merge(node.left) : this;

                    return(new StdNode(node.elt, node.hashcode, newLeft, node.right));
                }
                else
                {
                    ArraysNode node = (ArraysNode)aNode;
                    if (count > node.count) // count > node.count >= 2  =>  count >= 3
                    {
                        Node left = NewNode(elts, hashcodes, first, count - 1);
                        int  idx  = first + count - 1;
                        return(new StdNode(elts[idx], hashcodes[idx], left, node));
                    }
                    else // node.count >= count >= 2  =>  count >= 2
                    {
                        Node right = NewNode(node.elts, node.hashcodes, node.first + 1, node.count - 1);
                        return(new StdNode(node.elts[node.first], node.hashcodes[node.first], this, right));
                    }
                }
            }
示例#2
0
            internal StdNode(Obj key, Obj value, uint hashcode, Node left, Node right)
            {
                this.key      = key;
                this.value    = value;
                this.hashcode = hashcode;
                this.size     = 1 + (left != null ? left.Size() : 0) + (right != null ? right.Size() : 0);
                this.left     = left;
                this.right    = right;

                if (left != null)
                {
                    if (left is StdNode)
                    {
                        StdNode node = (StdNode)left;
                        Debug.Assert(
                            node.hashcode < hashcode || (node.hashcode == hashcode && node.key.QuickOrder(key) < 0)
                            );
                    }
                    else
                    {
                        ArraysNode node = (ArraysNode)left;
                        int        last = node.first + node.count - 1;
                        Debug.Assert(
                            node.hashcodes[last] < hashcode ||
                            (node.hashcodes[last] == hashcode && node.keys[last].QuickOrder(key) < 0)
                            );
                    }
                }

                if (right != null)
                {
                    if (right is StdNode)
                    {
                        StdNode node = (StdNode)right;
                        Debug.Assert(
                            hashcode < node.hashcode || (node.hashcode == hashcode && key.QuickOrder(node.key) < 0)
                            );
                    }
                    else
                    {
                        ArraysNode node  = (ArraysNode)right;
                        int        first = node.first;
                        Debug.Assert(
                            hashcode < node.hashcodes[first] ||
                            (node.hashcodes[first] == hashcode && key.QuickOrder(node.keys[first]) < 0)
                            );
                    }
                }
            }