Files
osu-framework/osu.Framework/Localisation/LocalisableStringEqualityComparer.cs
2022-04-22 17:06:07 +08:00

48 lines
1.6 KiB
C#

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Collections.Generic;
namespace osu.Framework.Localisation
{
/// <summary>
/// An equality comparer for the <see cref="LocalisableString"/> type.
/// </summary>
public class LocalisableStringEqualityComparer : IEqualityComparer<LocalisableString>
{
// ReSharper disable once InconsistentNaming (follows EqualityComparer<T>.Default)
#pragma warning disable IDE1006 // Naming style
public static readonly LocalisableStringEqualityComparer Default = new LocalisableStringEqualityComparer();
#pragma warning restore IDE1006
public bool Equals(LocalisableString x, LocalisableString y)
{
object xData = x.Data;
object yData = y.Data;
if (ReferenceEquals(null, xData) != ReferenceEquals(null, yData))
return false;
if (ReferenceEquals(null, xData))
return true;
if (xData.GetType() != yData.GetType())
return EqualityComparer<object>.Default.Equals(xData, yData);
switch (xData)
{
case string strX:
return strX.Equals((string)yData, StringComparison.Ordinal);
case ILocalisableStringData dataX:
return dataX.Equals((ILocalisableStringData)yData);
}
return false;
}
public int GetHashCode(LocalisableString obj) => HashCode.Combine(obj.Data?.GetType(), obj.Data);
}
}