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