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>
68 : std::unary_function<_T1, _Res> { };
71 template<
typename _Res,
typename _T1,
typename _T2>
72 struct _Maybe_unary_or_binary_function<_Res, _T1, _T2>
73 : std::binary_function<_T1, _T2, _Res> { };
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...,
149 ...) _GLIBCXX_NOEXCEPT_QUAL>
150 {
typedef _Res result_type; };
153 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
154 struct _Weak_result_type_impl<_Res(*)(_ArgTypes...) _GLIBCXX_NOEXCEPT_QUAL>
155 {
typedef _Res result_type; };
158 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
160 _Weak_result_type_impl<_Res(*)(_ArgTypes..., ...) _GLIBCXX_NOEXCEPT_QUAL>
161 {
typedef _Res result_type; };
164 template<
typename _Functor,
166 struct _Weak_result_type_memfun
167 : _Weak_result_type_impl<_Functor>
171 template<
typename _MemFunPtr>
172 struct _Weak_result_type_memfun<_MemFunPtr, true>
174 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
178 template<
typename _Func,
typename _Class>
179 struct _Weak_result_type_memfun<_Func _Class::*, false>
186 template<
typename _Functor>
187 struct _Weak_result_type
188 : _Weak_result_type_memfun<typename remove_cv<_Functor>::type>
191#if __cplusplus <= 201703L
193 template<
typename _Tp,
typename = __
void_t<>>
194 struct _Refwrap_base_arg1
198 template<
typename _Tp>
199 struct _Refwrap_base_arg1<_Tp,
200 __void_t<typename _Tp::argument_type>>
202 typedef typename _Tp::argument_type argument_type;
206 template<
typename _Tp,
typename = __
void_t<>>
207 struct _Refwrap_base_arg2
211 template<
typename _Tp>
212 struct _Refwrap_base_arg2<_Tp,
213 __void_t<typename _Tp::first_argument_type,
214 typename _Tp::second_argument_type>>
216 typedef typename _Tp::first_argument_type first_argument_type;
217 typedef typename _Tp::second_argument_type second_argument_type;
226 template<
typename _Tp>
227 struct _Reference_wrapper_base
228 : _Weak_result_type<_Tp>, _Refwrap_base_arg1<_Tp>, _Refwrap_base_arg2<_Tp>
232#pragma GCC diagnostic push
233#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
236 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
237 struct _Reference_wrapper_base<_Res(_T1) _GLIBCXX_NOEXCEPT_QUAL>
241 template<
typename _Res,
typename _T1>
242 struct _Reference_wrapper_base<_Res(_T1) const>
246 template<
typename _Res,
typename _T1>
247 struct _Reference_wrapper_base<_Res(_T1) volatile>
251 template<
typename _Res,
typename _T1>
252 struct _Reference_wrapper_base<_Res(_T1) const volatile>
257 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
258 struct _Reference_wrapper_base<_Res(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
262 template<
typename _Res,
typename _T1,
typename _T2>
263 struct _Reference_wrapper_base<_Res(_T1, _T2) const>
267 template<
typename _Res,
typename _T1,
typename _T2>
268 struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
272 template<
typename _Res,
typename _T1,
typename _T2>
273 struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
278 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
279 struct _Reference_wrapper_base<_Res(*)(_T1) _GLIBCXX_NOEXCEPT_QUAL>
284 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
285 struct _Reference_wrapper_base<_Res(*)(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
289 template<typename _Tp, bool = is_member_function_pointer<_Tp>::value>
290 struct _Reference_wrapper_base_memfun
291 : _Reference_wrapper_base<_Tp>
294 template<
typename _MemFunPtr>
295 struct _Reference_wrapper_base_memfun<_MemFunPtr, true>
296 : _Mem_fn_traits<_MemFunPtr>::__maybe_type
298 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
300#pragma GCC diagnostic pop
309 template<
typename _Tp>
310 class reference_wrapper
311#if __cplusplus <= 201703L
314 :
public _Reference_wrapper_base_memfun<typename remove_cv<_Tp>::type>
322 static void _S_fun(_Tp&&) =
delete;
324 template<
typename _Up,
typename _Up2 = __remove_cvref_t<_Up>>
334 template<
typename _Up,
typename = __not_same<_Up>,
typename
335 = decltype(reference_wrapper::_S_fun(std::declval<_Up>()))>
337 reference_wrapper(_Up&& __uref)
342 reference_wrapper(
const reference_wrapper&) =
default;
345 operator=(
const reference_wrapper&) =
default;
348 operator _Tp&()
const noexcept
349 {
return this->get(); }
356 template<
typename... _Args>
358 typename __invoke_result<_Tp&, _Args...>::type
359 operator()(_Args&&... __args)
const
360 noexcept(__is_nothrow_invocable<_Tp&, _Args...>::value)
362#if __cplusplus > 201703L
363 if constexpr (is_object_v<type>)
364 static_assert(
sizeof(type),
"type must be complete");
369#if __glibcxx_reference_wrapper >= 202403L
372 friend constexpr bool
373 operator==(reference_wrapper __x, reference_wrapper __y)
374 requires requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
375 {
return __x.get() == __y.get(); }
378 friend constexpr bool
379 operator==(reference_wrapper __x,
const _Tp& __y)
380 requires requires { { __x.get() == __y } -> convertible_to<bool>; }
381 {
return __x.get() == __y; }
384 friend constexpr bool
385 operator==(reference_wrapper __x, reference_wrapper<const _Tp> __y)
386 requires (!is_const_v<_Tp>)
387 &&
requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
388 {
return __x.get() == __y.get(); }
394 friend constexpr auto
395 operator<=>(reference_wrapper __x, reference_wrapper __y)
396 requires requires (
const _Tp __t) {
397 { __t < __t } -> __detail::__boolean_testable;
399 {
return __detail::__synth3way(__x.get(), __y.get()); }
402 friend constexpr auto
403 operator<=>(reference_wrapper __x,
const _Tp& __y)
404 requires requires { { __y < __y } -> __detail::__boolean_testable; }
405 {
return __detail::__synth3way(__x.get(), __y); }
408 friend constexpr auto
409 operator<=>(reference_wrapper __x, reference_wrapper<const _Tp> __y)
410 requires (!is_const_v<_Tp>) &&
requires (
const _Tp __t) {
411 { __t < __t } -> __detail::__boolean_testable;
413 {
return __detail::__synth3way(__x.get(), __y.get()); }
417#if __cpp_deduction_guides
418 template<
typename _Tp>
425 template<
typename _Tp>
429 {
return reference_wrapper<_Tp>(__t); }
432 template<
typename _Tp>
436 {
return reference_wrapper<const _Tp>(__t); }
438 template<
typename _Tp>
439 void ref(
const _Tp&&) =
delete;
441 template<
typename _Tp>
442 void cref(
const _Tp&&) =
delete;
445 template<
typename _Tp>
448 ref(reference_wrapper<_Tp> __t)
noexcept
452 template<
typename _Tp>
455 cref(reference_wrapper<_Tp> __t)
noexcept
456 {
return { __t.get() }; }
460_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.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
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.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
ISO C++ entities toplevel namespace is std.
Primary class template for reference_wrapper.
constexpr reference_wrapper< _Tp > ref(_Tp &__t) noexcept
Denotes a reference should be taken to a variable.
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.
is_member_function_pointer