#pragma once #include #include namespace NThreading { namespace NImpl { Y_HAS_MEMBER(compare); Y_HAS_MEMBER(Compare); template inline int CompareImpl(const T& l, const T& r) { if (l < r) { return -1; } else if (r < l) { return +1; } else { return 0; } } template struct TSmallCompareSelector { template static inline int Compare(const T& l, const T& r) { return CompareImpl(l, r); } }; template <> struct TSmallCompareSelector { template static inline int Compare(const T& l, const T& r) { return l.compare(r); } }; template struct TBigCompareSelector { template static inline int Compare(const T& l, const T& r) { return TSmallCompareSelector::value>::Compare(l, r); } }; template <> struct TBigCompareSelector { template static inline int Compare(const T& l, const T& r) { return l.Compare(r); } }; template struct TCompareSelector: public TBigCompareSelector::value> { }; } //////////////////////////////////////////////////////////////////////////////// // Generic compare function template inline int Compare(const T& l, const T& r) { return NImpl::TCompareSelector::Compare(l, r); } //////////////////////////////////////////////////////////////////////////////// // Generic compare functor template struct TCompare { inline int operator()(const T& l, const T& r) const { return Compare(l, r); } }; }