A game framework written with osu! in mind.
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2// See the LICENCE file in the repository root for full licence text.
3
4using System;
5using System.Collections.Generic;
6
7namespace osu.Framework.Localisation
8{
9 /// <summary>
10 /// An equality comparer for the <see cref="LocalisableString"/> type.
11 /// </summary>
12 public class LocalisableStringEqualityComparer : IEqualityComparer<LocalisableString>
13 {
14 // ReSharper disable once InconsistentNaming (follows EqualityComparer<T>.Default)
15 public static readonly LocalisableStringEqualityComparer Default = new LocalisableStringEqualityComparer();
16
17 public bool Equals(LocalisableString x, LocalisableString y)
18 {
19 var xData = x.Data;
20 var yData = y.Data;
21
22 if (ReferenceEquals(null, xData) != ReferenceEquals(null, yData))
23 return false;
24
25 if (ReferenceEquals(null, xData))
26 return true;
27
28 if (xData.GetType() != yData.GetType())
29 return EqualityComparer<object>.Default.Equals(xData, yData);
30
31 switch (xData)
32 {
33 case string strX:
34 return strX.Equals((string)yData, StringComparison.Ordinal);
35
36 case ILocalisableStringData dataX:
37 return dataX.Equals((ILocalisableStringData)yData);
38 }
39
40 return false;
41 }
42
43 public int GetHashCode(LocalisableString obj) => HashCode.Combine(obj.Data?.GetType(), obj.Data);
44 }
45}