// 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 } }; }
// 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 }); }