System.Xml.Xsl.Runtime.ContentMergeIterator.DocOrderMerge C# (CSharp) Method

DocOrderMerge() private method

If the context node-set returns a node that is contained in the subtree of the previous node, then returning children of each node in "natural" order may not correspond to document order. Therefore, in order to guarantee document order, keep a stack in order to push the sibling of ancestor nodes. These siblings will not be returned until all of the descendants' children are returned first.
private DocOrderMerge ( ) : IteratorResult
return IteratorResult
        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;
        }
    }