predicates.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (C) 2017 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
  3. #pragma once
  4. #include <functional>
  5. #include <type_traits>
  6. #include <utility>
  7. namespace Utils
  8. {
  9. //////////////////
  10. // find helpers
  11. //////////////////
  12. template<typename R, typename S, typename T>
  13. decltype(auto) equal(R (S::*function)() const, T value)
  14. {
  15. // This should use std::equal_to<> instead of std::equal_to<T>,
  16. // but that's not supported everywhere yet, since it is C++14
  17. return std::bind<bool>(std::equal_to<T>(), value, std::bind(function, std::placeholders::_1));
  18. }
  19. template<typename R, typename S, typename T>
  20. decltype(auto) equal(R S::*member, T value)
  21. {
  22. return std::bind<bool>(std::equal_to<T>(), value, std::bind(member, std::placeholders::_1));
  23. }
  24. //////////////////
  25. // comparison predicates
  26. //////////////////
  27. template <typename Type>
  28. auto equalTo(Type &&value)
  29. {
  30. return [value = std::forward<Type>(value)] (const auto &entry)
  31. {
  32. static_assert(std::is_same<std::decay_t<Type>,
  33. std::decay_t<decltype(entry)>>::value,
  34. "The container and predicate type of equalTo should be the same to prevent "
  35. "unnecessary conversion.");
  36. return entry == value;
  37. };
  38. }
  39. template <typename Type>
  40. auto unequalTo(Type &&value)
  41. {
  42. return [value = std::forward<Type>(value)] (const auto &entry)
  43. {
  44. static_assert(std::is_same<std::decay_t<Type>,
  45. std::decay_t<decltype(entry)>>::value,
  46. "The container and predicate type of unequalTo should be the same to prevent "
  47. "unnecessary conversion.");
  48. return !(entry == value);
  49. };
  50. }
  51. template <typename Type>
  52. auto lessThan(Type &&value)
  53. {
  54. return [value = std::forward<Type>(value)] (const auto &entry)
  55. {
  56. static_assert(std::is_same<std::decay_t<Type>,
  57. std::decay_t<decltype(entry)>>::value,
  58. "The container and predicate type of unequalTo should be the same to prevent "
  59. "unnecessary conversion.");
  60. return entry < value;
  61. };
  62. }
  63. template <typename Type>
  64. auto lessEqualThan(Type &&value)
  65. {
  66. return [value = std::forward<Type>(value)] (const auto &entry)
  67. {
  68. static_assert(std::is_same<std::decay_t<Type>,
  69. std::decay_t<decltype(entry)>>::value,
  70. "The container and predicate type of lessEqualThan should be the same to "
  71. "prevent unnecessary conversion.");
  72. return !(value < entry);
  73. };
  74. }
  75. template <typename Type>
  76. auto greaterThan(Type &&value)
  77. {
  78. return [value = std::forward<Type>(value)] (const auto &entry)
  79. {
  80. static_assert(std::is_same<std::decay_t<Type>,
  81. std::decay_t<decltype(entry)>>::value,
  82. "The container and predicate type of greaterThan should be the same to "
  83. "prevent unnecessary conversion.");
  84. return value < entry;
  85. };
  86. }
  87. template <typename Type>
  88. auto greaterEqualThan(Type &&value)
  89. {
  90. return [value = std::forward<Type>(value)] (const auto &entry)
  91. {
  92. static_assert(std::is_same<std::decay_t<Type>,
  93. std::decay_t<decltype(entry)>>::value,
  94. "The container and predicate type of greaterEqualThan should be the same to "
  95. "prevent unnecessary conversion.");
  96. return !(entry < value);
  97. };
  98. }
  99. } // namespace Utils