|
// 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.
#nullable disable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis
{
internal sealed class ReadOnlyMemoryOfCharComparer : IEqualityComparer<ReadOnlyMemory<char>>
{
public static readonly ReadOnlyMemoryOfCharComparer Instance = new ReadOnlyMemoryOfCharComparer();
private ReadOnlyMemoryOfCharComparer()
{
}
public static bool Equals(ReadOnlySpan<char> x, ReadOnlyMemory<char> y)
=> x.SequenceEqual(y.Span);
public bool Equals(ReadOnlyMemory<char> x, ReadOnlyMemory<char> y)
=> x.Span.SequenceEqual(y.Span);
public int GetHashCode(ReadOnlyMemory<char> obj)
{
#if NET
return string.GetHashCode(obj.Span);
#else
return Hash.GetFNVHashCode(obj.Span);
#endif
}
}
/// <summary>
/// Very cheap trivial comparer that never matches the keys,
/// should only be used in empty dictionaries.
/// </summary>
internal sealed class EmptyReadOnlyMemoryOfCharComparer : IEqualityComparer<ReadOnlyMemory<char>>
{
public static readonly EmptyReadOnlyMemoryOfCharComparer Instance = new EmptyReadOnlyMemoryOfCharComparer();
private EmptyReadOnlyMemoryOfCharComparer()
{
}
public bool Equals(ReadOnlyMemory<char> a, ReadOnlyMemory<char> b)
=> throw ExceptionUtilities.Unreachable();
public int GetHashCode(ReadOnlyMemory<char> s)
{
// dictionary will call this often
return 0;
}
}
}
|