using System; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace JM.LinqFaster.Utils { //Takes a comparer, and creates a reverse comparer, for Descending sorts internal sealed class ComparerReverser : IComparer { private readonly IComparer wrappedComparer; public ComparerReverser(IComparer wrappedComparer) { this.wrappedComparer = wrappedComparer; } #if !(UNITY_4 || UNITY_5) [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public int Compare(T x, T y) { return wrappedComparer.Compare(y, x); } } internal static class ComparerExtensions { // Lets us reverse a comparere with comparer.Reverse(); public static IComparer Reverse(this IComparer comparer) { return new ComparerReverser(comparer); } } internal sealed class LambdaComparer : IComparer { IComparer comparer; Func selector; public LambdaComparer(Func selector, IComparer comparer) { this.comparer = comparer; this.selector = selector; } #if !(UNITY_4 || UNITY_5) [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public int Compare(T x, T y) { return comparer.Compare(selector(x), selector(y)); } } internal sealed class ReverseLambdaComparer : IComparer { IComparer comparer; Func selector; public ReverseLambdaComparer(Func selector, IComparer comparer) { this.comparer = comparer; this.selector = selector; } #if !(UNITY_4 || UNITY_5) [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public int Compare(T x, T y) { return comparer.Compare(selector(y), selector(x)); } } }