File: FrameworkFork\Microsoft.Xml\Xml\XPath\XPathNavigatorKeyComparer.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.IO;
using Microsoft.Xml.Schema;
using System.Collections;
using System.Diagnostics;
using MS.Internal.Xml.Cache;
 
namespace Microsoft.Xml.XPath
{
    using System;
    using Microsoft.Xml;
 
    internal class XPathNavigatorKeyComparer : IEqualityComparer
    {
        bool IEqualityComparer.Equals(Object obj1, Object obj2)
        {
            XPathNavigator nav1 = obj1 as XPathNavigator;
            XPathNavigator nav2 = obj2 as XPathNavigator;
            if ((nav1 != null) && (nav2 != null))
            {
                if (nav1.IsSamePosition(nav2))
                    return true;
            }
            return false;
        }
 
        int IEqualityComparer.GetHashCode(Object obj)
        {
            int hashCode;
            XPathNavigator nav;
            XPathDocumentNavigator xpdocNav;
 
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }
            else if (null != (xpdocNav = obj as XPathDocumentNavigator))
            {
                hashCode = xpdocNav.GetPositionHashCode();
            }
            else if (null != (nav = obj as XPathNavigator))
            {
                Object underlyingObject = nav.UnderlyingObject;
                if (underlyingObject != null)
                {
                    hashCode = underlyingObject.GetHashCode();
                }
                else
                {
                    hashCode = (int)nav.NodeType;
                    hashCode ^= nav.LocalName.GetHashCode();
                    hashCode ^= nav.Prefix.GetHashCode();
                    hashCode ^= nav.NamespaceURI.GetHashCode();
                }
            }
            else
            {
                hashCode = obj.GetHashCode();
            }
            return hashCode;
        }
    }
}