private IteratorResult DocOrderMerge() {
XmlNodeOrder cmp;
Debug.Assert(this.state == IteratorState.HaveCurrentHaveNext);
// Compare location of navCurrent with navNext
cmp = this.navCurrent.ComparePosition(this.navNext);
// If navCurrent is before navNext in document order,
// If cmp = XmlNodeOrder.Unknown, then navCurrent is before navNext (since input is is doc order)
if (cmp == XmlNodeOrder.Before || cmp == XmlNodeOrder.Unknown) {
// Then navCurrent can be returned (it is guaranteed to be first in document order)
return IteratorResult.HaveCurrentNode;
}
// If navCurrent is after navNext in document order, then delay returning navCurrent
// Otherwise, discard navNext since it is positioned to the same node as navCurrent
if (cmp == XmlNodeOrder.After) {
this.navStack.Push(this.navCurrent);
this.navCurrent = this.navNext;
this.navNext = null;
}
// Need next input node
this.state = IteratorState.HaveCurrentNeedNext;
return IteratorResult.NeedInputNode;
}
}