XmlPositionComparer
namespace Castle.Components.DictionaryAdapter.Xml
{
    public class XmlPositionComparer
    {
        private struct ComparandIterator
        {
            public IXmlNode Node;
            public XmlName Name;
            public CompiledXPathNode Step;
            public bool MoveNext()
            {
                if (Step == null) {
                    if (Node == null)
                        return Stop();
                    return ConsumeNode();
                }
                return ConsumeStep();
            }
            private bool ConsumeNode()
            {
                bool result = true;
                CompiledXPath path = Node.Path;
                if (path != null)
                    result = ConsumeFirstStep(path);
                else
                    Name = Node.Name;
                Node = Node.Parent;
                return result;
            }
            private bool Stop()
            {
                Name = XmlName.Empty;
                return false;
            }
            private bool ConsumeFirstStep(CompiledXPath path)
            {
                if (!path.IsCreatable)
                    return false;
                Step = path.LastStep;
                return ConsumeStep();
            }
            private bool ConsumeStep()
            {
                Name = new XmlName(Step.LocalName, Node.LookupNamespaceUri(Step.Prefix));
                Step = Step.PreviousNode;
                return true;
            }
        }
        public static readonly XmlPositionComparer Instance = new XmlPositionComparer();
        public bool Equals(IXmlNode nodeA, IXmlNode nodeB)
        {
            XmlNameComparer default = XmlNameComparer.Default;
            ComparandIterator comparandIterator = default(ComparandIterator);
            comparandIterator.Node = nodeA;
            ComparandIterator comparandIterator2 = comparandIterator;
            comparandIterator = default(ComparandIterator);
            comparandIterator.Node = nodeB;
            ComparandIterator comparandIterator3 = comparandIterator;
            do {
                if (comparandIterator2.Node.IsReal && comparandIterator3.Node.IsReal)
                    return comparandIterator2.Node.UnderlyingPositionEquals(comparandIterator3.Node);
                if (!comparandIterator2.MoveNext() || !comparandIterator3.MoveNext())
                    return false;
            } while (default.Equals(comparandIterator2.Name, comparandIterator3.Name));
            return false;
        }
    }
}