protected int FindSplit(DCompare compare) { int x = Root; int result = 0; IndexFileRecord r = new IndexFileRecord(); while (x != 0) { GetRecord(x, ref r); int c = compare(ref r); if (c < 0) { x = GetLeft(x); } else if (c > 0) { result = x; x = GetRight(x); } else // c == 0 { result = x; break; } } return(result); }
int Compare(int x, DCompare seek) { IndexFileRecord r = new IndexFileRecord(); GetRecord(x, ref r); return(seek(ref r)); }
public virtual G.IEnumerable <IndexFileRecord> From(IndexFile ixf, DCompare seek, bool desc) { IndexFileRecord v = new IndexFileRecord(); foreach (int x in From(seek, desc)) { GetRecord(x, ref v); yield return(v); } }
public override G.IEnumerable <IndexFileRecord> From(IndexFile ixf, DCompare seek, bool desc) { int x = FindSplit(seek); long childId = x == 0 ? FirstPage : GetChild(x); IndexPage cp = ixf.GetPage(childId); cp.ParentId = PageId; foreach (IndexFileRecord r in cp.From(ixf, seek, desc)) { yield return(r); } }
G.IEnumerable <int> From(DCompare seek, bool desc) { if (desc) { foreach (int x in Desc(Root, seek)) { yield return(x); } } else { foreach (int x in Asc(Root, seek)) { yield return(x); } } }
G.IEnumerable <int> Desc(int x, DCompare cf) { if (x == 0) { yield break; } int c = Compare(x, cf); if (c > 0) { foreach (int a in Desc(GetRight(x), cf)) { yield return(a); } } if (c >= 0) { yield return(x); } foreach (int a in Desc(GetLeft(x), cf)) { yield return(a); } }
G.IEnumerable <int> Asc(int x, DCompare cf) { if (x == 0) { yield break; } int c = Compare(x, cf); if (c < 0) { foreach (int a in Asc(GetLeft(x), cf)) { yield return(a); } } if (c <= 0) { yield return(x); } foreach (int a in Asc(GetRight(x), cf)) { yield return(a); // Is this doing extra compares when c <= 0? } }