#pragma once #include "Sort.h" template struct TDereferenceWrapper { const PREDICATE_CLASS& Predicate; TDereferenceWrapper(const PREDICATE_CLASS& InPredicate) : Predicate(InPredicate) {} /** Pass through for non-pointer types */ FORCEINLINE bool operator()(T& A, T& B) { return Predicate(A, B); } FORCEINLINE bool operator()(const T& A, const T& B) const { return Predicate(A, B); } }; /** Partially specialized version of the above class */ template struct TDereferenceWrapper { const PREDICATE_CLASS& Predicate; TDereferenceWrapper(const PREDICATE_CLASS& InPredicate) : Predicate(InPredicate) {} /** Dereference pointers */ FORCEINLINE bool operator()(T* A, T* B) const { return Predicate(*A, *B); } }; template struct TArrayRange { TArrayRange(T* InPtr, int32 InSize) : Begin(InPtr) , Size(InSize) { } T* GetData() const { return Begin; } int32 Num() const { return Size; } private: T* Begin; int32 Size; }; template void Sort(T** First, const int32 Num, const PREDICATE_CLASS& Predicate) { TArrayRange ArrayRange(First, Num); Algo::Sort(ArrayRange, TDereferenceWrapper(Predicate)); }