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;
}
}
}