public bool Insert(List<XPathNavigator> buffer, XPathNavigator nav) {
int l = 0;
int r = buffer.Count;
// In most cases nodes are already sorted.
// This means that nav often will be equal or after then last item in the buffer
// So let's check this first.
if (r != 0) {
switch (CompareNodes(buffer[r - 1], nav)) {
case XmlNodeOrder.Same:
return false;
case XmlNodeOrder.Before:
buffer.Add(nav.Clone());
return true;
default:
r --;
break;
}
}
while (l < r) {
int m = GetMedian(l, r);
switch (CompareNodes(buffer[m], nav)) {
case XmlNodeOrder.Same:
return false;
case XmlNodeOrder.Before:
l = m + 1;
break;
default:
r = m;
break;
}
}
AssertDOD(buffer, nav, l);
buffer.Insert(l, nav.Clone());
return true;
}