Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

62 linhas
2.1 KiB

  1. #pragma once
  2. #include "equality_compare.h"
  3. namespace cpphibernate
  4. {
  5. namespace __impl
  6. {
  7. template<typename T_lhs, typename T_rhs, typename = void>
  8. struct equality_compare_impl
  9. {
  10. static constexpr decltype(auto) equal(T_lhs&&, T_rhs&&)
  11. { static_assert(sizeof(T_lhs) == -1, "Unable to equality compare these two types."); }
  12. static constexpr decltype(auto) not_equal(T_lhs&&, T_rhs&&)
  13. { static_assert(sizeof(T_lhs) == -1, "Unable to equality compare these two types."); }
  14. };
  15. template<typename T_lhs, typename T_rhs>
  16. struct equality_compare_impl<
  17. T_lhs,
  18. T_rhs,
  19. mp::enable_if_t<
  20. mp::is_valid_v<typename T_lhs::equality_compare_group_type>
  21. && mp::is_valid_v<typename T_rhs::equality_compare_group_type>
  22. && mp::is_same_v<
  23. typename T_lhs::equality_compare_group_type,
  24. typename T_rhs::equality_compare_group_type>>>
  25. {
  26. static constexpr decltype(auto) equal(T_lhs&&, T_rhs&&)
  27. { return hana::type_c<mp::decay_t<T_lhs>> == hana::type_c<mp::decay_t<T_rhs>>; }
  28. static constexpr decltype(auto) not_equal(T_lhs&&, T_rhs&&)
  29. { return hana::type_c<mp::decay_t<T_lhs>> != hana::type_c<mp::decay_t<T_rhs>>; }
  30. };
  31. };
  32. template<typename T_group>
  33. struct tag_equality_comparable
  34. {
  35. using equality_compare_group_type = T_group;
  36. };
  37. template<typename T_lhs, typename T_rhs>
  38. constexpr decltype(auto) operator == (T_lhs&& lhs, T_rhs&& rhs)
  39. {
  40. using equality_compare_type = __impl::equality_compare_impl<T_lhs, T_rhs>;
  41. return equality_compare_type::equal(std::forward<T_lhs>(lhs), std::forward<T_rhs>(rhs));
  42. }
  43. template<typename T_lhs, typename T_rhs>
  44. constexpr decltype(auto) operator != (T_lhs&& lhs, T_rhs&& rhs)
  45. {
  46. using equality_compare_type = __impl::equality_compare_impl<T_lhs, T_rhs>;
  47. return equality_compare_type::not_equal(std::forward<T_lhs>(lhs), std::forward<T_rhs>(rhs));
  48. }
  49. }