compare.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma once
  2. #include <util/generic/typetraits.h>
  3. #include <util/str_stl.h>
  4. namespace NThreading {
  5. namespace NImpl {
  6. Y_HAS_MEMBER(compare);
  7. Y_HAS_MEMBER(Compare);
  8. template <typename T>
  9. inline int CompareImpl(const T& l, const T& r) {
  10. if (l < r) {
  11. return -1;
  12. } else if (r < l) {
  13. return +1;
  14. } else {
  15. return 0;
  16. }
  17. }
  18. template <bool val>
  19. struct TSmallCompareSelector {
  20. template <typename T>
  21. static inline int Compare(const T& l, const T& r) {
  22. return CompareImpl(l, r);
  23. }
  24. };
  25. template <>
  26. struct TSmallCompareSelector<true> {
  27. template <typename T>
  28. static inline int Compare(const T& l, const T& r) {
  29. return l.compare(r);
  30. }
  31. };
  32. template <bool val>
  33. struct TBigCompareSelector {
  34. template <typename T>
  35. static inline int Compare(const T& l, const T& r) {
  36. return TSmallCompareSelector<THascompare<T>::value>::Compare(l, r);
  37. }
  38. };
  39. template <>
  40. struct TBigCompareSelector<true> {
  41. template <typename T>
  42. static inline int Compare(const T& l, const T& r) {
  43. return l.Compare(r);
  44. }
  45. };
  46. template <typename T>
  47. struct TCompareSelector: public TBigCompareSelector<THasCompare<T>::value> {
  48. };
  49. }
  50. ////////////////////////////////////////////////////////////////////////////////
  51. // Generic compare function
  52. template <typename T>
  53. inline int Compare(const T& l, const T& r) {
  54. return NImpl::TCompareSelector<T>::Compare(l, r);
  55. }
  56. ////////////////////////////////////////////////////////////////////////////////
  57. // Generic compare functor
  58. template <typename T>
  59. struct TCompare {
  60. inline int operator()(const T& l, const T& r) const {
  61. return Compare(l, r);
  62. }
  63. };
  64. }