30#ifndef _GLIBCXX_REFWRAP_H
31#define _GLIBCXX_REFWRAP_H 1
34#pragma GCC system_header
37#if __cplusplus >= 201103L
43#if __glibcxx_reference_wrapper >= 202403L
47namespace std _GLIBCXX_VISIBILITY(default)
49_GLIBCXX_BEGIN_NAMESPACE_VERSION
58 template<
typename _Res,
typename... _ArgTypes>
59 struct _Maybe_unary_or_binary_function { };
62#pragma GCC diagnostic push
63#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
66 template<
typename _Res,
typename _T1>
67 struct _Maybe_unary_or_binary_function<_Res, _T1>
71 template<
typename _Res,
typename _T1,
typename _T2>
72 struct _Maybe_unary_or_binary_function<_Res, _T1, _T2>
75#pragma GCC diagnostic pop
77 template<
typename _Signature>
78 struct _Mem_fn_traits;
80 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
81 struct _Mem_fn_traits_base
83 using __result_type = _Res;
85 = _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>;
86 using __arity = integral_constant<size_t,
sizeof...(_ArgTypes)>;
89#define _GLIBCXX_MEM_FN_TRAITS2(_CV, _REF, _LVAL, _RVAL) \
90 template<typename _Res, typename _Class, typename... _ArgTypes> \
91 struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) _CV _REF> \
92 : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \
94 using __vararg = false_type; \
96 template<typename _Res, typename _Class, typename... _ArgTypes> \
97 struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) _CV _REF> \
98 : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \
100 using __vararg = true_type; \
103#define _GLIBCXX_MEM_FN_TRAITS(_REF, _LVAL, _RVAL) \
104 _GLIBCXX_MEM_FN_TRAITS2( , _REF, _LVAL, _RVAL) \
105 _GLIBCXX_MEM_FN_TRAITS2(const , _REF, _LVAL, _RVAL) \
106 _GLIBCXX_MEM_FN_TRAITS2(volatile , _REF, _LVAL, _RVAL) \
107 _GLIBCXX_MEM_FN_TRAITS2(const volatile, _REF, _LVAL, _RVAL)
113#if __cplusplus > 201402L
119#undef _GLIBCXX_MEM_FN_TRAITS
120#undef _GLIBCXX_MEM_FN_TRAITS2
123 template<
typename _Functor,
typename = __
void_t<>>
124 struct _Maybe_get_result_type
127 template<
typename _Functor>
128 struct _Maybe_get_result_type<_Functor,
129 __void_t<typename _Functor::result_type>>
130 {
typedef typename _Functor::result_type result_type; };
136 template<
typename _Functor>
137 struct _Weak_result_type_impl
138 : _Maybe_get_result_type<_Functor>
142 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
143 struct _Weak_result_type_impl<_Res(_ArgTypes...) _GLIBCXX_NOEXCEPT_QUAL>
144 {
typedef _Res result_type; };
147 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
148 struct _Weak_result_type_impl<_Res(_ArgTypes......) _GLIBCXX_NOEXCEPT_QUAL>
149 {
typedef _Res result_type; };
152 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
153 struct _Weak_result_type_impl<_Res(*)(_ArgTypes...) _GLIBCXX_NOEXCEPT_QUAL>
154 {
typedef _Res result_type; };
157 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
159 _Weak_result_type_impl<_Res(*)(_ArgTypes......) _GLIBCXX_NOEXCEPT_QUAL>
160 {
typedef _Res result_type; };
163 template<
typename _Functor,
164 bool = is_member_function_pointer<_Functor>::value>
165 struct _Weak_result_type_memfun
166 : _Weak_result_type_impl<_Functor>
170 template<
typename _MemFunPtr>
171 struct _Weak_result_type_memfun<_MemFunPtr, true>
173 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
177 template<
typename _Func,
typename _Class>
178 struct _Weak_result_type_memfun<_Func _Class::*, false>
185 template<
typename _Functor>
186 struct _Weak_result_type
187 : _Weak_result_type_memfun<typename remove_cv<_Functor>::type>
190#if __cplusplus <= 201703L
192 template<
typename _Tp,
typename = __
void_t<>>
193 struct _Refwrap_base_arg1
197 template<
typename _Tp>
198 struct _Refwrap_base_arg1<_Tp,
199 __void_t<typename _Tp::argument_type>>
201 typedef typename _Tp::argument_type argument_type;
205 template<
typename _Tp,
typename = __
void_t<>>
206 struct _Refwrap_base_arg2
210 template<
typename _Tp>
211 struct _Refwrap_base_arg2<_Tp,
212 __void_t<typename _Tp::first_argument_type,
213 typename _Tp::second_argument_type>>
215 typedef typename _Tp::first_argument_type first_argument_type;
216 typedef typename _Tp::second_argument_type second_argument_type;
225 template<
typename _Tp>
226 struct _Reference_wrapper_base
227 : _Weak_result_type<_Tp>, _Refwrap_base_arg1<_Tp>, _Refwrap_base_arg2<_Tp>
231#pragma GCC diagnostic push
232#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
235 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
236 struct _Reference_wrapper_base<_Res(_T1) _GLIBCXX_NOEXCEPT_QUAL>
237 : unary_function<_T1, _Res>
240 template<
typename _Res,
typename _T1>
241 struct _Reference_wrapper_base<_Res(_T1) const>
242 : unary_function<_T1, _Res>
245 template<
typename _Res,
typename _T1>
246 struct _Reference_wrapper_base<_Res(_T1) volatile>
247 : unary_function<_T1, _Res>
250 template<
typename _Res,
typename _T1>
251 struct _Reference_wrapper_base<_Res(_T1) const volatile>
252 : unary_function<_T1, _Res>
256 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
257 struct _Reference_wrapper_base<_Res(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
258 : binary_function<_T1, _T2, _Res>
261 template<
typename _Res,
typename _T1,
typename _T2>
262 struct _Reference_wrapper_base<_Res(_T1, _T2) const>
263 : binary_function<_T1, _T2, _Res>
266 template<
typename _Res,
typename _T1,
typename _T2>
267 struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
268 : binary_function<_T1, _T2, _Res>
271 template<
typename _Res,
typename _T1,
typename _T2>
272 struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
273 : binary_function<_T1, _T2, _Res>
277 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
278 struct _Reference_wrapper_base<_Res(*)(_T1) _GLIBCXX_NOEXCEPT_QUAL>
279 : unary_function<_T1, _Res>
283 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
284 struct _Reference_wrapper_base<_Res(*)(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
285 : binary_function<_T1, _T2, _Res>
288 template<typename _Tp, bool = is_member_function_pointer<_Tp>::value>
289 struct _Reference_wrapper_base_memfun
290 : _Reference_wrapper_base<_Tp>
293 template<
typename _MemFunPtr>
294 struct _Reference_wrapper_base_memfun<_MemFunPtr, true>
295 : _Mem_fn_traits<_MemFunPtr>::__maybe_type
297 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
299#pragma GCC diagnostic pop
308 template<
typename _Tp>
310#if __cplusplus <= 201703L
313 :
public _Reference_wrapper_base_memfun<typename remove_cv<_Tp>::type>
321 static void _S_fun(_Tp&&) =
delete;
323 template<
typename _Up,
typename _Up2 = __remove_cvref_t<_Up>>
333 template<
typename _Up,
typename = __not_same<_Up>,
typename
334 = decltype(reference_wrapper::_S_fun(std::declval<_Up>()))>
337 noexcept(
noexcept(reference_wrapper::_S_fun(std::declval<_Up>())))
338 : _M_data(reference_wrapper::_S_fun(std::forward<_Up>(__uref)))
347 operator _Tp&()
const noexcept
348 {
return this->get(); }
355 template<
typename... _Args>
357 typename __invoke_result<_Tp&, _Args...>::type
358 operator()(_Args&&... __args)
const
359 noexcept(__is_nothrow_invocable<_Tp&, _Args...>::value)
361#if __cplusplus > 201703L
362 if constexpr (is_object_v<type>)
363 static_assert(
sizeof(type),
"type must be complete");
368#if __glibcxx_reference_wrapper >= 202403L
371 friend constexpr bool
373 requires requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
374 {
return __x.get() == __y.get(); }
377 friend constexpr bool
379 requires requires { { __x.get() == __y } -> convertible_to<bool>; }
380 {
return __x.get() == __y; }
383 friend constexpr bool
385 requires (!is_const_v<_Tp>)
386 &&
requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
387 {
return __x.get() == __y.get(); }
393 friend constexpr auto
395 requires requires (
const _Tp __t) {
396 { __t < __t } -> __detail::__boolean_testable;
398 {
return __detail::__synth3way(__x.get(), __y.get()); }
401 friend constexpr auto
403 requires requires { { __y < __y } -> __detail::__boolean_testable; }
404 {
return __detail::__synth3way(__x.get(), __y); }
407 friend constexpr auto
409 requires (!is_const_v<_Tp>) &&
requires (
const _Tp __t) {
410 { __t < __t } -> __detail::__boolean_testable;
412 {
return __detail::__synth3way(__x.get(), __y.get()); }
416#if __cpp_deduction_guides
417 template<
typename _Tp>
424 template<
typename _Tp>
431 template<
typename _Tp>
437 template<
typename _Tp>
438 void ref(
const _Tp&&) =
delete;
440 template<
typename _Tp>
441 void cref(
const _Tp&&) =
delete;
444 template<
typename _Tp>
451 template<
typename _Tp>
455 {
return { __t.get() }; }
459_GLIBCXX_END_NAMESPACE_VERSION
__bool_constant< true > true_type
The type used as a compile-time boolean with true value.
__bool_constant< false > false_type
The type used as a compile-time boolean with false value.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
ISO C++ entities toplevel namespace is std.
Primary class template for reference_wrapper.
constexpr reference_wrapper< _Tp > ref(_Tp &__t) noexcept
constexpr reference_wrapper< _Tp > ref(reference_wrapper< _Tp > __t) noexcept
std::ref overload to prevent wrapping a reference_wrapper
constexpr reference_wrapper< const _Tp > cref(const _Tp &__t) noexcept
Denotes a const reference should be taken to a variable.
constexpr reference_wrapper< const _Tp > cref(reference_wrapper< _Tp > __t) noexcept
std::cref overload to prevent wrapping a reference_wrapper
Define a member typedef type only if a boolean constant is true.