File indexing completed on 2025-09-16 08:42:26
0001
0002
0003
0004
0005
0006 #ifndef BOOST_PFR_OPS_HPP
0007 #define BOOST_PFR_OPS_HPP
0008 #pragma once
0009
0010 #include <boost/pfr/detail/config.hpp>
0011
0012 #include <boost/pfr/detail/detectors.hpp>
0013 #include <boost/pfr/ops_fields.hpp>
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 namespace boost { namespace pfr {
0037
0038 namespace detail {
0039
0040
0041 template <template <class, class> class Detector, class T, class U>
0042 using enable_not_comp_base_t = std::enable_if_t<
0043 not_appliable<Detector, T const&, U const&>::value,
0044 bool
0045 >;
0046
0047 template <template <class, class> class Detector, class T, class U>
0048 using enable_comp_base_t = std::enable_if_t<
0049 !not_appliable<Detector, T const&, U const&>::value,
0050 bool
0051 >;
0052
0053
0054 template <class T, class U> using enable_not_eq_comp_t = enable_not_comp_base_t<comp_eq_detector, T, U>;
0055 template <class T, class U> using enable_not_ne_comp_t = enable_not_comp_base_t<comp_ne_detector, T, U>;
0056 template <class T, class U> using enable_not_lt_comp_t = enable_not_comp_base_t<comp_lt_detector, T, U>;
0057 template <class T, class U> using enable_not_le_comp_t = enable_not_comp_base_t<comp_le_detector, T, U>;
0058 template <class T, class U> using enable_not_gt_comp_t = enable_not_comp_base_t<comp_gt_detector, T, U>;
0059 template <class T, class U> using enable_not_ge_comp_t = enable_not_comp_base_t<comp_ge_detector, T, U>;
0060
0061 template <class T> using enable_not_hashable_t = std::enable_if_t<
0062 not_appliable<hash_detector, const T&, const T&>::value,
0063 std::size_t
0064 >;
0065
0066
0067 template <class T, class U> using enable_eq_comp_t = enable_comp_base_t<comp_eq_detector, T, U>;
0068 template <class T, class U> using enable_ne_comp_t = enable_comp_base_t<comp_ne_detector, T, U>;
0069 template <class T, class U> using enable_lt_comp_t = enable_comp_base_t<comp_lt_detector, T, U>;
0070 template <class T, class U> using enable_le_comp_t = enable_comp_base_t<comp_le_detector, T, U>;
0071 template <class T, class U> using enable_gt_comp_t = enable_comp_base_t<comp_gt_detector, T, U>;
0072 template <class T, class U> using enable_ge_comp_t = enable_comp_base_t<comp_ge_detector, T, U>;
0073
0074 template <class T> using enable_hashable_t = std::enable_if_t<
0075 !not_appliable<hash_detector, const T&, const T&>::value,
0076 std::size_t
0077 >;
0078 }
0079
0080 BOOST_PFR_BEGIN_MODULE_EXPORT
0081
0082
0083
0084
0085 template <class T, class U>
0086 constexpr detail::enable_not_eq_comp_t<T, U> eq(const T& lhs, const U& rhs) noexcept {
0087 return boost::pfr::eq_fields(lhs, rhs);
0088 }
0089
0090
0091 template <class T, class U>
0092 constexpr detail::enable_eq_comp_t<T, U> eq(const T& lhs, const U& rhs) {
0093 return lhs == rhs;
0094 }
0095
0096
0097
0098
0099
0100 template <class T, class U>
0101 constexpr detail::enable_not_ne_comp_t<T, U> ne(const T& lhs, const U& rhs) noexcept {
0102 return boost::pfr::ne_fields(lhs, rhs);
0103 }
0104
0105
0106 template <class T, class U>
0107 constexpr detail::enable_ne_comp_t<T, U> ne(const T& lhs, const U& rhs) {
0108 return lhs != rhs;
0109 }
0110
0111
0112
0113
0114
0115 template <class T, class U>
0116 constexpr detail::enable_not_lt_comp_t<T, U> lt(const T& lhs, const U& rhs) noexcept {
0117 return boost::pfr::lt_fields(lhs, rhs);
0118 }
0119
0120
0121 template <class T, class U>
0122 constexpr detail::enable_lt_comp_t<T, U> lt(const T& lhs, const U& rhs) {
0123 return lhs < rhs;
0124 }
0125
0126
0127
0128
0129
0130 template <class T, class U>
0131 constexpr detail::enable_not_gt_comp_t<T, U> gt(const T& lhs, const U& rhs) noexcept {
0132 return boost::pfr::gt_fields(lhs, rhs);
0133 }
0134
0135
0136 template <class T, class U>
0137 constexpr detail::enable_gt_comp_t<T, U> gt(const T& lhs, const U& rhs) {
0138 return lhs > rhs;
0139 }
0140
0141
0142
0143
0144
0145 template <class T, class U>
0146 constexpr detail::enable_not_le_comp_t<T, U> le(const T& lhs, const U& rhs) noexcept {
0147 return boost::pfr::le_fields(lhs, rhs);
0148 }
0149
0150
0151 template <class T, class U>
0152 constexpr detail::enable_le_comp_t<T, U> le(const T& lhs, const U& rhs) {
0153 return lhs <= rhs;
0154 }
0155
0156
0157
0158
0159
0160 template <class T, class U>
0161 constexpr detail::enable_not_ge_comp_t<T, U> ge(const T& lhs, const U& rhs) noexcept {
0162 return boost::pfr::ge_fields(lhs, rhs);
0163 }
0164
0165
0166 template <class T, class U>
0167 constexpr detail::enable_ge_comp_t<T, U> ge(const T& lhs, const U& rhs) {
0168 return lhs >= rhs;
0169 }
0170
0171
0172
0173
0174
0175 template <class T>
0176 constexpr detail::enable_not_hashable_t<T> hash_value(const T& value) noexcept {
0177 return boost::pfr::hash_fields(value);
0178 }
0179
0180
0181 template <class T>
0182 constexpr detail::enable_hashable_t<T> hash_value(const T& value) {
0183 return std::hash<T>{}(value);
0184 }
0185
0186 BOOST_PFR_END_MODULE_EXPORT
0187
0188 }}
0189
0190 #endif