Skip to content

Commit

Permalink
sort(): case insensitive comparer
Browse files Browse the repository at this point in the history
  • Loading branch information
jakubmisek committed Jan 24, 2023
1 parent f6ef2f4 commit 5742517
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 14 deletions.
13 changes: 6 additions & 7 deletions src/Peachpie.Library/Arrays.cs
Expand Up @@ -1107,11 +1107,10 @@ public static PhpArray range(Context ctx, PhpValue low, PhpValue high, PhpValue
return (order == SortingOrder.Descending) ? KeyComparer.ReverseNumeric : KeyComparer.Numeric;

case ComparisonMethod.String:
return (order == SortingOrder.Descending) ? KeyComparer.ReverseString(ctx) : KeyComparer.String(ctx);
return (order == SortingOrder.Descending) ? KeyComparer.ReverseString(ctx, false) : KeyComparer.String(ctx, false);

case ComparisonMethod.String | ComparisonMethod.FlagCase:
//return (order == SortingOrder.Descending) ? KeyComparer.ReverseStringIgnoreCase(ctx) : KeyComparer.StringIgnoreCase(ctx);
throw new NotImplementedException();
return (order == SortingOrder.Descending) ? KeyComparer.ReverseString(ctx, true) : KeyComparer.String(ctx, true);

case ComparisonMethod.LocaleString:
return new KeyComparer(Locale.GetStringComparer(ctx, false), order == SortingOrder.Descending);
Expand Down Expand Up @@ -1730,7 +1729,7 @@ public static PhpArray array_intersect_assoc(Context ctx, PhpArray array, params
//[return: PhpDeepCopy]
public static PhpArray array_diff_key(Context ctx, PhpArray array, params PhpArray[] arrays)
{
return SetOperation(SetOperations.Difference, array, arrays, KeyComparer.String(ctx));
return SetOperation(SetOperations.Difference, array, arrays, KeyComparer.String(ctx, false));
}

/// <summary>
Expand All @@ -1739,7 +1738,7 @@ public static PhpArray array_diff_key(Context ctx, PhpArray array, params PhpArr
//[return: PhpDeepCopy]
public static PhpArray array_intersect_key(Context ctx, PhpArray array, params PhpArray[] arrays)
{
return SetOperation(SetOperations.Intersection, array, arrays, KeyComparer.String(ctx));
return SetOperation(SetOperations.Intersection, array, arrays, KeyComparer.String(ctx, false));
}

/// <summary>
Expand Down Expand Up @@ -2425,8 +2424,8 @@ public static PhpArray array_unique(Context ctx, PhpArray array, ComparisonMetho
{
ComparisonMethod.Regular => PhpComparer.Default,
ComparisonMethod.Numeric => PhpNumericComparer.Default,
ComparisonMethod.String => new PhpStringComparer(ctx),
ComparisonMethod.String | ComparisonMethod.FlagCase => throw new NotImplementedException(sortFlags.ToString()),
ComparisonMethod.String => new PhpStringComparer(ctx, false),
ComparisonMethod.String | ComparisonMethod.FlagCase => new PhpStringComparer(ctx, caseInsensitive: true),
ComparisonMethod.Natural => new PhpNaturalComparer(ctx, false),
ComparisonMethod.Natural | ComparisonMethod.FlagCase => new PhpNaturalComparer(ctx, caseInsensitive: true),
ComparisonMethod.LocaleString => throw new NotImplementedException(sortFlags.ToString()),
Expand Down
18 changes: 11 additions & 7 deletions src/Peachpie.Runtime/Comparers.cs
Expand Up @@ -21,15 +21,15 @@ public sealed class KeyComparer : IComparer<KeyValuePair<IntStringKey, PhpValue>
/// <summary>Numeric comparer.</summary>
public static readonly KeyComparer Numeric = new KeyComparer(PhpNumericComparer.Default, false);
/// <summary>String comparer.</summary>
public static KeyComparer String(Context ctx) => new KeyComparer(new PhpStringComparer(ctx), false);
public static KeyComparer String(Context ctx, bool caseInsensitive) => new KeyComparer(new PhpStringComparer(ctx, caseInsensitive), false);
/// <summary>Array keys comparer.</summary>
public static readonly KeyComparer ArrayKeys = new KeyComparer(PhpArrayKeysComparer.Default, false);
/// <summary>Regular comparer with reverse order.</summary>
public static readonly KeyComparer Reverse = new KeyComparer(PhpComparer.Default, true);
/// <summary>Numeric comparer with reverse order.</summary>
public static readonly KeyComparer ReverseNumeric = new KeyComparer(PhpNumericComparer.Default, true);
/// <summary>String comparer with reverse order.</summary>
public static KeyComparer ReverseString(Context ctx) => new KeyComparer(new PhpStringComparer(ctx), true);
public static KeyComparer ReverseString(Context ctx, bool caseInsensitive) => new KeyComparer(new PhpStringComparer(ctx, caseInsensitive), true);
/// <summary>Locale string comparer with reverse order.</summary>
public static readonly KeyComparer ReverseArrayKeys = new KeyComparer(PhpArrayKeysComparer.Default, true);

Expand Down Expand Up @@ -319,10 +319,12 @@ public sealed class PhpStringComparer : IComparer<PhpValue>, IEqualityComparer<P
{
readonly Context _ctx;

/// <summary>Prevents from creating instances of this class.</summary>
public PhpStringComparer(Context ctx)
readonly bool _caseInsensitive;

public PhpStringComparer(Context ctx, bool caseInsensitive = false)
{
_ctx = ctx;
_caseInsensitive = caseInsensitive;
}

string ToStringQuiet(PhpValue obj)
Expand All @@ -336,22 +338,24 @@ string ToStringQuiet(PhpValue obj)
}
}

StringComparison StringComparison => _caseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;

/// <summary>
/// Compares two objects in a manner of PHP string comparison.
/// </summary>
public int Compare(PhpValue x, PhpValue y)
{
return string.CompareOrdinal(ToStringQuiet(x), ToStringQuiet(y));
return string.Compare(ToStringQuiet(x), ToStringQuiet(y), this.StringComparison);
}

public bool Equals(PhpValue x, PhpValue y)
{
return string.Equals(ToStringQuiet(x), ToStringQuiet(y), StringComparison.Ordinal);
return string.Equals(ToStringQuiet(x), ToStringQuiet(y), this.StringComparison);
}

public int GetHashCode(PhpValue obj)
{
return StringComparer.Ordinal.GetHashCode(ToStringQuiet(obj));
return string.GetHashCode(ToStringQuiet(obj), this.StringComparison);
}
}

Expand Down

0 comments on commit 5742517

Please sign in to comment.