34 internal interface IRecord : IComparable<T>
37 int FilterKey {
get; }
41 internal struct Enumerable
58 public Enumerator GetEnumerator()
60 var records = table.records;
61 if (table.Sorted ==
false)
62 return new Enumerator(records, table.RowCount - 1, -1, token);
64 int index = BinarySearch(records, table.RowCount, token & 0xFFFFFF);
66 return new Enumerator(
null, 0, 1, -1);
69 while (start > 0 && (records[start - 1].FilterKey & 0xFFFFFF) == (token & 0xFFFFFF))
73 int max = table.RowCount - 1;
74 while (end < max && (records[end + 1].FilterKey & 0xFFFFFF) == (token & 0xFFFFFF))
77 return new Enumerator(records, end, start - 1, token);
80 static int BinarySearch(T[] records,
int length,
int maskedToken)
86 int mid = min + ((max - min) / 2);
87 int maskedValue = records[mid].FilterKey & 0xFFFFFF;
88 if (maskedToken == maskedValue)
90 else if (maskedToken < maskedValue)
100 internal struct Enumerator
103 readonly T[] records;
115 internal Enumerator(T[] records,
int max,
int index,
int token)
117 this.records = records;
123 public readonly
int Current => index;
125 public bool MoveNext()
130 if (records[index].FilterKey == token)
138 internal Enumerable Filter(
int token)
140 return new Enumerable(
this, token);
148 Array.Sort(records, 0,
rowCount, Comparer<T>.Default);