30#ifndef _GLIBCXX_REFWRAP_H
31#define _GLIBCXX_REFWRAP_H 1
33#pragma GCC system_header
35#if __cplusplus >= 201103L
41#if __glibcxx_reference_wrapper >= 202403L
45namespace std _GLIBCXX_VISIBILITY(default)
47_GLIBCXX_BEGIN_NAMESPACE_VERSION
56 template<
typename _Res,
typename... _ArgTypes>
57 struct _Maybe_unary_or_binary_function { };
60#pragma GCC diagnostic push
61#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
64 template<
typename _Res,
typename _T1>
65 struct _Maybe_unary_or_binary_function<_Res, _T1>
69 template<
typename _Res,
typename _T1,
typename _T2>
70 struct _Maybe_unary_or_binary_function<_Res, _T1, _T2>
73#pragma GCC diagnostic pop
75 template<
typename _Signature>
76 struct _Mem_fn_traits;
78 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
79 struct _Mem_fn_traits_base
81 using __result_type = _Res;
83 = _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>;
84 using __arity = integral_constant<size_t,
sizeof...(_ArgTypes)>;
87#define _GLIBCXX_MEM_FN_TRAITS2(_CV, _REF, _LVAL, _RVAL) \
88 template<typename _Res, typename _Class, typename... _ArgTypes> \
89 struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) _CV _REF> \
90 : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \
92 using __vararg = false_type; \
94 template<typename _Res, typename _Class, typename... _ArgTypes> \
95 struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) _CV _REF> \
96 : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \
98 using __vararg = true_type; \
101#define _GLIBCXX_MEM_FN_TRAITS(_REF, _LVAL, _RVAL) \
102 _GLIBCXX_MEM_FN_TRAITS2( , _REF, _LVAL, _RVAL) \
103 _GLIBCXX_MEM_FN_TRAITS2(const , _REF, _LVAL, _RVAL) \
104 _GLIBCXX_MEM_FN_TRAITS2(volatile , _REF, _LVAL, _RVAL) \
105 _GLIBCXX_MEM_FN_TRAITS2(const volatile, _REF, _LVAL, _RVAL)
111#if __cplusplus > 201402L
117#undef _GLIBCXX_MEM_FN_TRAITS
118#undef _GLIBCXX_MEM_FN_TRAITS2
121 template<
typename _Functor,
typename = __
void_t<>>
122 struct _Maybe_get_result_type
125 template<
typename _Functor>
126 struct _Maybe_get_result_type<_Functor,
127 __void_t<typename _Functor::result_type>>
128 {
typedef typename _Functor::result_type result_type; };
134 template<
typename _Functor>
135 struct _Weak_result_type_impl
136 : _Maybe_get_result_type<_Functor>
140 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
141 struct _Weak_result_type_impl<_Res(_ArgTypes...) _GLIBCXX_NOEXCEPT_QUAL>
142 {
typedef _Res result_type; };
145 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
146 struct _Weak_result_type_impl<_Res(_ArgTypes......) _GLIBCXX_NOEXCEPT_QUAL>
147 {
typedef _Res result_type; };
150 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
151 struct _Weak_result_type_impl<_Res(*)(_ArgTypes...) _GLIBCXX_NOEXCEPT_QUAL>
152 {
typedef _Res result_type; };
155 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
157 _Weak_result_type_impl<_Res(*)(_ArgTypes......) _GLIBCXX_NOEXCEPT_QUAL>
158 {
typedef _Res result_type; };
161 template<
typename _Functor,
162 bool = is_member_function_pointer<_Functor>::value>
163 struct _Weak_result_type_memfun
164 : _Weak_result_type_impl<_Functor>
168 template<
typename _MemFunPtr>
169 struct _Weak_result_type_memfun<_MemFunPtr, true>
171 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
175 template<
typename _Func,
typename _Class>
176 struct _Weak_result_type_memfun<_Func _Class::*, false>
183 template<
typename _Functor>
184 struct _Weak_result_type
185 : _Weak_result_type_memfun<typename remove_cv<_Functor>::type>
188#if __cplusplus <= 201703L
190 template<
typename _Tp,
typename = __
void_t<>>
191 struct _Refwrap_base_arg1
195 template<
typename _Tp>
196 struct _Refwrap_base_arg1<_Tp,
197 __void_t<typename _Tp::argument_type>>
199 typedef typename _Tp::argument_type argument_type;
203 template<
typename _Tp,
typename = __
void_t<>>
204 struct _Refwrap_base_arg2
208 template<
typename _Tp>
209 struct _Refwrap_base_arg2<_Tp,
210 __void_t<typename _Tp::first_argument_type,
211 typename _Tp::second_argument_type>>
213 typedef typename _Tp::first_argument_type first_argument_type;
214 typedef typename _Tp::second_argument_type second_argument_type;
223 template<
typename _Tp>
224 struct _Reference_wrapper_base
225 : _Weak_result_type<_Tp>, _Refwrap_base_arg1<_Tp>, _Refwrap_base_arg2<_Tp>
229#pragma GCC diagnostic push
230#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
233 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
234 struct _Reference_wrapper_base<_Res(_T1) _GLIBCXX_NOEXCEPT_QUAL>
235 : unary_function<_T1, _Res>
238 template<
typename _Res,
typename _T1>
239 struct _Reference_wrapper_base<_Res(_T1) const>
240 : unary_function<_T1, _Res>
243 template<
typename _Res,
typename _T1>
244 struct _Reference_wrapper_base<_Res(_T1) volatile>
245 : unary_function<_T1, _Res>
248 template<
typename _Res,
typename _T1>
249 struct _Reference_wrapper_base<_Res(_T1) const volatile>
250 : unary_function<_T1, _Res>
254 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
255 struct _Reference_wrapper_base<_Res(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
256 : binary_function<_T1, _T2, _Res>
259 template<
typename _Res,
typename _T1,
typename _T2>
260 struct _Reference_wrapper_base<_Res(_T1, _T2) const>
261 : binary_function<_T1, _T2, _Res>
264 template<
typename _Res,
typename _T1,
typename _T2>
265 struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
266 : binary_function<_T1, _T2, _Res>
269 template<
typename _Res,
typename _T1,
typename _T2>
270 struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
271 : binary_function<_T1, _T2, _Res>
275 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
276 struct _Reference_wrapper_base<_Res(*)(_T1) _GLIBCXX_NOEXCEPT_QUAL>
277 : unary_function<_T1, _Res>
281 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
282 struct _Reference_wrapper_base<_Res(*)(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
283 : binary_function<_T1, _T2, _Res>
286 template<typename _Tp, bool = is_member_function_pointer<_Tp>::value>
287 struct _Reference_wrapper_base_memfun
288 : _Reference_wrapper_base<_Tp>
291 template<
typename _MemFunPtr>
292 struct _Reference_wrapper_base_memfun<_MemFunPtr, true>
293 : _Mem_fn_traits<_MemFunPtr>::__maybe_type
295 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
297#pragma GCC diagnostic pop
306 template<
typename _Tp>
308#if __cplusplus <= 201703L
311 :
public _Reference_wrapper_base_memfun<typename remove_cv<_Tp>::type>
319 static void _S_fun(_Tp&&) =
delete;
321 template<
typename _Up,
typename _Up2 = __remove_cvref_t<_Up>>
331 template<
typename _Up,
typename = __not_same<_Up>,
typename
332 = decltype(reference_wrapper::_S_fun(std::declval<_Up>()))>
335 noexcept(
noexcept(reference_wrapper::_S_fun(std::declval<_Up>())))
336 : _M_data(reference_wrapper::_S_fun(std::forward<_Up>(__uref)))
345 operator _Tp&()
const noexcept
346 {
return this->get(); }
353 template<
typename... _Args>
355 typename __invoke_result<_Tp&, _Args...>::type
356 operator()(_Args&&... __args)
const
357 noexcept(__is_nothrow_invocable<_Tp&, _Args...>::value)
359#if __cplusplus > 201703L
360 if constexpr (is_object_v<type>)
361 static_assert(
sizeof(type),
"type must be complete");
366#if __glibcxx_reference_wrapper >= 202403L
369 friend constexpr bool
371 requires requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
372 {
return __x.get() == __y.get(); }
375 friend constexpr bool
377 requires requires { { __x.get() == __y } -> convertible_to<bool>; }
378 {
return __x.get() == __y; }
381 friend constexpr bool
383 requires (!is_const_v<_Tp>)
384 &&
requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
385 {
return __x.get() == __y.get(); }
391 friend constexpr auto
393 requires requires (
const _Tp __t) {
394 { __t < __t } -> __detail::__boolean_testable;
396 {
return __detail::__synth3way(__x.get(), __y.get()); }
399 friend constexpr auto
401 requires requires { { __y < __y } -> __detail::__boolean_testable; }
402 {
return __detail::__synth3way(__x.get(), __y); }
405 friend constexpr auto
407 requires (!is_const_v<_Tp>) &&
requires (
const _Tp __t) {
408 { __t < __t } -> __detail::__boolean_testable;
410 {
return __detail::__synth3way(__x.get(), __y.get()); }
414#if __cpp_deduction_guides
415 template<
typename _Tp>
422 template<
typename _Tp>
429 template<
typename _Tp>
435 template<
typename _Tp>
436 void ref(
const _Tp&&) =
delete;
438 template<
typename _Tp>
439 void cref(
const _Tp&&) =
delete;
442 template<
typename _Tp>
449 template<
typename _Tp>
453 {
return { __t.get() }; }
457_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.