// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
namespace EpicGames.Core
{
///
/// Comparer for String objects. However, it implements UE style ignore case compare
///
public class StringComparerUE : IComparer, IEqualityComparer
{
///
/// Static instance of an ordinal String comparer
///
public static StringComparerUE Ordinal { get; } = new StringComparerUE(StringComparison.Ordinal);
///
/// Static instance of an ordinal String comparer which ignores case
///
public static StringComparerUE OrdinalIgnoreCase { get; } = new StringComparerUE(StringComparison.OrdinalIgnoreCase);
///
/// The comparison type
///
public StringComparison ComparisonType { get; }
///
/// Constructor
///
/// Type of comparison to perform
public StringComparerUE(StringComparison comparisonType)
{
ComparisonType = comparisonType;
}
///
public bool Equals(string? x, string? y)
{
return String.Equals(x, y, ComparisonType);
}
///
public int GetHashCode(string obj)
{
return String.GetHashCode(obj, ComparisonType);
}
///
public int Compare(string? x, string? y)
{
if (ComparisonType == StringComparison.OrdinalIgnoreCase)
{
if (x == null)
{
return y == null ? 0 : -1;
}
else if (y == null)
{
return 1;
}
return StringUtils.CompareIgnoreCaseUe(x.AsSpan(), y.AsSpan());
}
else
{
return String.Compare(x, y, ComparisonType);
}
}
}
}