123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- #ifndef BOOST_PFR_OPS_HPP
- #define BOOST_PFR_OPS_HPP
- #pragma once
- #include <boost/pfr/detail/config.hpp>
- #include <boost/pfr/detail/detectors.hpp>
- #include <boost/pfr/ops_fields.hpp>
- namespace boost { namespace pfr {
- namespace detail {
- template <template <class, class> class Detector, class T, class U>
- using enable_not_comp_base_t = std::enable_if_t<
- not_appliable<Detector, T const&, U const&>::value,
- bool
- >;
- template <template <class, class> class Detector, class T, class U>
- using enable_comp_base_t = std::enable_if_t<
- !not_appliable<Detector, T const&, U const&>::value,
- bool
- >;
- template <class T, class U> using enable_not_eq_comp_t = enable_not_comp_base_t<comp_eq_detector, T, U>;
- template <class T, class U> using enable_not_ne_comp_t = enable_not_comp_base_t<comp_ne_detector, T, U>;
- template <class T, class U> using enable_not_lt_comp_t = enable_not_comp_base_t<comp_lt_detector, T, U>;
- template <class T, class U> using enable_not_le_comp_t = enable_not_comp_base_t<comp_le_detector, T, U>;
- template <class T, class U> using enable_not_gt_comp_t = enable_not_comp_base_t<comp_gt_detector, T, U>;
- template <class T, class U> using enable_not_ge_comp_t = enable_not_comp_base_t<comp_ge_detector, T, U>;
- template <class T> using enable_not_hashable_t = std::enable_if_t<
- not_appliable<hash_detector, const T&, const T&>::value,
- std::size_t
- >;
- template <class T, class U> using enable_eq_comp_t = enable_comp_base_t<comp_eq_detector, T, U>;
- template <class T, class U> using enable_ne_comp_t = enable_comp_base_t<comp_ne_detector, T, U>;
- template <class T, class U> using enable_lt_comp_t = enable_comp_base_t<comp_lt_detector, T, U>;
- template <class T, class U> using enable_le_comp_t = enable_comp_base_t<comp_le_detector, T, U>;
- template <class T, class U> using enable_gt_comp_t = enable_comp_base_t<comp_gt_detector, T, U>;
- template <class T, class U> using enable_ge_comp_t = enable_comp_base_t<comp_ge_detector, T, U>;
- template <class T> using enable_hashable_t = std::enable_if_t<
- !not_appliable<hash_detector, const T&, const T&>::value,
- std::size_t
- >;
- }
- template <class T, class U>
- constexpr detail::enable_not_eq_comp_t<T, U> eq(const T& lhs, const U& rhs) noexcept {
- return boost::pfr::eq_fields(lhs, rhs);
- }
- template <class T, class U>
- constexpr detail::enable_eq_comp_t<T, U> eq(const T& lhs, const U& rhs) {
- return lhs == rhs;
- }
- template <class T, class U>
- constexpr detail::enable_not_ne_comp_t<T, U> ne(const T& lhs, const U& rhs) noexcept {
- return boost::pfr::ne_fields(lhs, rhs);
- }
- template <class T, class U>
- constexpr detail::enable_ne_comp_t<T, U> ne(const T& lhs, const U& rhs) {
- return lhs != rhs;
- }
- template <class T, class U>
- constexpr detail::enable_not_lt_comp_t<T, U> lt(const T& lhs, const U& rhs) noexcept {
- return boost::pfr::lt_fields(lhs, rhs);
- }
- template <class T, class U>
- constexpr detail::enable_lt_comp_t<T, U> lt(const T& lhs, const U& rhs) {
- return lhs < rhs;
- }
- template <class T, class U>
- constexpr detail::enable_not_gt_comp_t<T, U> gt(const T& lhs, const U& rhs) noexcept {
- return boost::pfr::gt_fields(lhs, rhs);
- }
- template <class T, class U>
- constexpr detail::enable_gt_comp_t<T, U> gt(const T& lhs, const U& rhs) {
- return lhs > rhs;
- }
- template <class T, class U>
- constexpr detail::enable_not_le_comp_t<T, U> le(const T& lhs, const U& rhs) noexcept {
- return boost::pfr::le_fields(lhs, rhs);
- }
- template <class T, class U>
- constexpr detail::enable_le_comp_t<T, U> le(const T& lhs, const U& rhs) {
- return lhs <= rhs;
- }
- template <class T, class U>
- constexpr detail::enable_not_ge_comp_t<T, U> ge(const T& lhs, const U& rhs) noexcept {
- return boost::pfr::ge_fields(lhs, rhs);
- }
- template <class T, class U>
- constexpr detail::enable_ge_comp_t<T, U> ge(const T& lhs, const U& rhs) {
- return lhs >= rhs;
- }
- template <class T>
- constexpr detail::enable_not_hashable_t<T> hash_value(const T& value) noexcept {
- return boost::pfr::hash_fields(value);
- }
- template <class T>
- constexpr detail::enable_hashable_t<T> hash_value(const T& value) {
- return std::hash<T>{}(value);
- }
- }}
- #endif
|