Ejemplo n.º 1
0
        // Find the new position of the item under the given finger.  Used in InsertionSort.
        protected RBFinger <T> LocateItem(RBFinger <T> finger, Comparison <T> comparison)
        {
            RBNode <T> startingNode = finger.Node;
            int        nodeIndex    = finger.Index - finger.Offset;
            T          x            = startingNode.GetItemAt(finger.Offset);

            // first look within the node, using standard InsertionSort loop
            for (int k = finger.Offset - 1; k >= 0; --k)
            {
                if (comparison(x, startingNode.GetItemAt(k)) >= 0)
                {
                    return new RBFinger <T>()
                           {
                               Node = startingNode, Offset = k + 1, Index = nodeIndex + k + 1
                           }
                }
                ;
            }

            // next locate x between a node and its left-parent
            RBNode <T> node = startingNode, parent = node.Parent;

            while (parent != null)
            {
                while (parent != null && node == parent.LeftChild)
                {
                    node = parent; parent = node.Parent;
                }                                           // find left-parent

                if (parent == null || comparison(x, parent.GetItemAt(parent.Size - 1)) >= 0)
                {
                    break;      // x belongs in startingNode's left subtree
                }
                nodeIndex = nodeIndex - startingNode.LeftSize - parent.Size;
                if (comparison(x, parent.GetItemAt(0)) >= 0)
                {   // x belongs in the parent
                    bool found;
                    int  offset = parent.BinarySearch(x, 1, parent.Size - 1, comparison, -1, out found);
                    return(new RBFinger <T>()
                    {
                        Node = parent, Offset = offset, Index = nodeIndex + offset
                    });
                }

                // advance up the tree
                startingNode = node = parent;
                parent       = node.Parent;
            }

            // now we know x belongs in startingNode's left subtree, if any
            if (startingNode.LeftChild != null)
            {
                RBFinger <T> newFinger = startingNode.LeftChild.Find(x, comparison);
                if (newFinger.Offset == newFinger.Node.Size)
                {
                    newFinger = new RBFinger <T>()
                    {
                        Node = newFinger.Node.GetSuccessor(), Offset = 0, Index = newFinger.Index
                    }
                }
                ;
                return(newFinger);
            }
            else
            {
                return new RBFinger <T>()
                       {
                           Node = startingNode, Offset = 0, Index = nodeIndex
                       }
            };
        }
Ejemplo n.º 2
0
        // Token: 0x0600768F RID: 30351 RVA: 0x0021DD90 File Offset: 0x0021BF90
        protected RBFinger <T> LocateItem(RBFinger <T> finger, Comparison <T> comparison)
        {
            RBNode <T> rbnode = finger.Node;
            int        num    = finger.Index - finger.Offset;
            T          itemAt = rbnode.GetItemAt(finger.Offset);

            for (int i = finger.Offset - 1; i >= 0; i--)
            {
                if (comparison(itemAt, rbnode.GetItemAt(i)) >= 0)
                {
                    return(new RBFinger <T>
                    {
                        Node = rbnode,
                        Offset = i + 1,
                        Index = num + i + 1
                    });
                }
            }
            RBNode <T> rbnode2 = rbnode;

            for (RBNode <T> parent = rbnode2.Parent; parent != null; parent = rbnode2.Parent)
            {
                while (parent != null && rbnode2 == parent.LeftChild)
                {
                    rbnode2 = parent;
                    parent  = rbnode2.Parent;
                }
                if (parent == null || comparison(itemAt, parent.GetItemAt(parent.Size - 1)) >= 0)
                {
                    break;
                }
                num = num - rbnode.LeftSize - parent.Size;
                if (comparison(itemAt, parent.GetItemAt(0)) >= 0)
                {
                    bool flag;
                    int  num2 = parent.BinarySearch(itemAt, 1, parent.Size - 1, comparison, -1, out flag);
                    return(new RBFinger <T>
                    {
                        Node = parent,
                        Offset = num2,
                        Index = num + num2
                    });
                }
                rbnode2 = (rbnode = parent);
            }
            if (rbnode.LeftChild != null)
            {
                RBFinger <T> result = rbnode.LeftChild.Find(itemAt, comparison);
                if (result.Offset == result.Node.Size)
                {
                    result = new RBFinger <T>
                    {
                        Node   = result.Node.GetSuccessor(),
                        Offset = 0,
                        Index  = result.Index
                    };
                }
                return(result);
            }
            return(new RBFinger <T>
            {
                Node = rbnode,
                Offset = 0,
                Index = num
            });
        }