| File: MS\Internal\Data\RBFinger.cs | Web Access |
| Project: src\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj (PresentationFramework) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // // Description: Finger into a red-black tree. // namespace MS.Internal.Data { internal struct RBFinger<T> { public RBNode<T> Node { get; set; } public int Offset { get; set; } public int Index { get; set; } public bool Found { get; set; } public T Item { get { return Node.GetItemAt(Offset); } } public void SetItem(T x) { Node.SetItemAt(Offset, x); } public bool IsValid { get { return Node != null && Node.HasData; } } public static RBFinger<T> operator +(RBFinger<T> finger, int delta) { if (delta >= 0) for (; delta > 0 && finger.IsValid; --delta) ++finger; else for (; delta < 0 && finger.IsValid; ++delta) --finger; return finger; } public static RBFinger<T> operator -(RBFinger<T> finger, int delta) { return finger + (-delta); } public static int operator -(RBFinger<T> f1, RBFinger<T> f2) { return f1.Index - f2.Index; } public static RBFinger<T> operator ++(RBFinger<T> finger) { finger.Offset += 1; finger.Index += 1; if (finger.Offset == finger.Node.Size) { finger.Node = finger.Node.GetSuccessor(); finger.Offset = 0; } return finger; } public static RBFinger<T> operator --(RBFinger<T> finger) { finger.Offset -= 1; finger.Index -= 1; if (finger.Offset < 0) { finger.Node = finger.Node.GetPredecessor(); if (finger.Node != null) finger.Offset = finger.Node.Size - 1; } return finger; } public static bool operator <(RBFinger<T> f1, RBFinger<T> f2) { return (f1.Index < f2.Index); } public static bool operator >(RBFinger<T> f1, RBFinger<T> f2) { return (f1.Index > f2.Index); } } }