File: src\Framework\MS\Internal\Data\RBFinger.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//---------------------------------------------------------------------------
//
// <copyright file="RBFinger.cs" company="Microsoft">
//    Copyright (C) by Microsoft Corporation.  All rights reserved.
// </copyright>
//
//
// 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);
        }
    }
}