|
11 | 11 | #define _LIBCPP___FUNCTIONAL_REFERENCE_WRAPPER_H |
12 | 12 |
|
13 | 13 | #include <__compare/synth_three_way.h> |
| 14 | +#include <__concepts/convertible_to.h> |
14 | 15 | #include <__config> |
15 | 16 | #include <__functional/weak_result_type.h> |
16 | 17 | #include <__memory/addressof.h> |
| 18 | +#include <__type_traits/common_reference.h> |
17 | 19 | #include <__type_traits/desugars_to.h> |
18 | 20 | #include <__type_traits/enable_if.h> |
19 | 21 | #include <__type_traits/invoke.h> |
20 | 22 | #include <__type_traits/is_const.h> |
21 | 23 | #include <__type_traits/is_core_convertible.h> |
22 | 24 | #include <__type_traits/is_same.h> |
| 25 | +#include <__type_traits/is_specialization.h> |
23 | 26 | #include <__type_traits/remove_cvref.h> |
24 | 27 | #include <__type_traits/void_t.h> |
25 | 28 | #include <__utility/declval.h> |
@@ -156,6 +159,32 @@ template <class _CanonicalTag, class _Operation, class... _Args> |
156 | 159 | inline const bool __desugars_to_v<_CanonicalTag, reference_wrapper<_Operation>, _Args...> = |
157 | 160 | __desugars_to_v<_CanonicalTag, _Operation, _Args...>; |
158 | 161 |
|
| 162 | +#if _LIBCPP_STD_VER >= 20 |
| 163 | + |
| 164 | +template <class _Tp> |
| 165 | +inline constexpr bool __is_ref_wrapper = __is_specialization_v<_Tp, reference_wrapper>; |
| 166 | + |
| 167 | +template <class _Rp, class _Tp, class _RpQual, class _TpQual> |
| 168 | +concept __ref_wrap_common_reference_exists_with = __is_ref_wrapper<_Rp> && requires { |
| 169 | + typename common_reference_t<typename _Rp::type&, _TpQual>; |
| 170 | +} && convertible_to<_RpQual, common_reference_t<typename _Rp::type&, _TpQual>>; |
| 171 | + |
| 172 | +template <class _Rp, class _Tp, template <class> class _RpQual, template <class> class _TpQual> |
| 173 | + requires(__ref_wrap_common_reference_exists_with<_Rp, _Tp, _RpQual<_Rp>, _TpQual<_Tp>> && |
| 174 | + !__ref_wrap_common_reference_exists_with<_Tp, _Rp, _TpQual<_Tp>, _RpQual<_Rp>>) |
| 175 | +struct basic_common_reference<_Rp, _Tp, _RpQual, _TpQual> { |
| 176 | + using type _LIBCPP_NODEBUG = common_reference_t<typename _Rp::type&, _TpQual<_Tp>>; |
| 177 | +}; |
| 178 | + |
| 179 | +template <class _Tp, class _Rp, template <class> class _TpQual, template <class> class _RpQual> |
| 180 | + requires(__ref_wrap_common_reference_exists_with<_Rp, _Tp, _RpQual<_Rp>, _TpQual<_Tp>> && |
| 181 | + !__ref_wrap_common_reference_exists_with<_Tp, _Rp, _TpQual<_Tp>, _RpQual<_Rp>>) |
| 182 | +struct basic_common_reference<_Tp, _Rp, _TpQual, _RpQual> { |
| 183 | + using type _LIBCPP_NODEBUG = common_reference_t<typename _Rp::type&, _TpQual<_Tp>>; |
| 184 | +}; |
| 185 | + |
| 186 | +#endif // _LIBCPP_STD_VER >= 20 |
| 187 | + |
159 | 188 | _LIBCPP_END_NAMESPACE_STD |
160 | 189 |
|
161 | 190 | #endif // _LIBCPP___FUNCTIONAL_REFERENCE_WRAPPER_H |
0 commit comments