Esempio n. 1
0
            internal void Put(Node newNode)
            {
                var dataSize = DataSize;

                Length++;
                if (Root == null)
                {
                    Root = newNode;
                    return;
                }

                var node  = Root;
                var stack = new Node[HeightLimit];

                var top = 0;
                int dir;

                // Find a spot and save the stack.
                for (; ;)
                {
                    stack[top++] = node;
                    dir          = UnsafeMemory.Compare(node.Data, newNode.Data, dataSize) < 0 ? 1 : 0;

                    var link = node.Link[dir];
                    if (link == null)
                    {
                        break;
                    }

                    node = link;
                }

                // Link and rebalance.
                node.Link[dir] = newNode;

                while (top > 0)
                {
                    // Which child?
                    node = stack[--top];

                    if (top != 0)
                    {
                        dir = stack[top - 1].Link[1] == node ? 1 : 0;
                    }

                    node = SkewNode(node);
                    node = SplitNode(node);

                    // Fix the parent.
                    if (top != 0)
                    {
                        stack[top - 1].Link[dir] = node;
                    }
                    else
                    {
                        Root = node;
                    }
                }
            }
Esempio n. 2
0
            internal Node Get(Pointer data)
            {
                var node     = Root;
                var dataSize = DataSize;

                while (node != null)
                {
                    var c = UnsafeMemory.Compare(node.Data, data, dataSize);
                    if (c == 0)
                    {
                        return(node);
                    }
                    node = node.Link[c < 0 ? 1 : 0];
                }

                return(null);
            }