30 #ifndef _GLIBCXX_REFWRAP_H
31 #define _GLIBCXX_REFWRAP_H 1
33 #pragma GCC system_header
35 #if __cplusplus < 201103L
43 namespace std _GLIBCXX_VISIBILITY(default)
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
typename _Functor,
typename = __
void_t<>>
52 template<
typename _Functor>
54 __void_t<typename _Functor::result_type>>
55 {
typedef typename _Functor::result_type result_type; };
61 template<
typename _Functor>
67 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
69 {
typedef _Res result_type; };
71 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
73 {
typedef _Res result_type; };
75 template<
typename _Res,
typename... _ArgTypes>
76 struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
77 {
typedef _Res result_type; };
79 template<
typename _Res,
typename... _ArgTypes>
80 struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
81 {
typedef _Res result_type; };
83 template<
typename _Res,
typename... _ArgTypes>
84 struct _Weak_result_type_impl<_Res(_ArgTypes...) volatile>
85 {
typedef _Res result_type; };
87 template<
typename _Res,
typename... _ArgTypes>
88 struct _Weak_result_type_impl<_Res(_ArgTypes......) volatile>
89 {
typedef _Res result_type; };
91 template<
typename _Res,
typename... _ArgTypes>
92 struct _Weak_result_type_impl<_Res(_ArgTypes...) const volatile>
93 {
typedef _Res result_type; };
95 template<
typename _Res,
typename... _ArgTypes>
96 struct _Weak_result_type_impl<_Res(_ArgTypes......) const volatile>
97 {
typedef _Res result_type; };
100 template<
typename _Res,
typename... _ArgTypes>
102 {
typedef _Res result_type; };
104 template<
typename _Res,
typename... _ArgTypes>
106 {
typedef _Res result_type; };
109 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
111 {
typedef _Res result_type; };
113 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
115 _GLIBCXX_NOEXCEPT_QUAL>
116 {
typedef _Res result_type; };
119 template<
typename _Res,
typename _Class,
typename... _ArgTypes
120 _GLIBCXX_NOEXCEPT_PARM>
122 _GLIBCXX_NOEXCEPT_QUAL>
123 {
typedef _Res result_type; };
125 template<
typename _Res,
typename _Class,
typename... _ArgTypes
126 _GLIBCXX_NOEXCEPT_PARM>
128 _GLIBCXX_NOEXCEPT_QUAL>
129 {
typedef _Res result_type; };
132 template<
typename _Res,
typename _Class,
typename... _ArgTypes
133 _GLIBCXX_NOEXCEPT_PARM>
135 _GLIBCXX_NOEXCEPT_QUAL>
136 {
typedef _Res result_type; };
138 template<
typename _Res,
typename _Class,
typename... _ArgTypes
139 _GLIBCXX_NOEXCEPT_PARM>
141 _GLIBCXX_NOEXCEPT_QUAL>
142 {
typedef _Res result_type; };
145 template<
typename _Res,
typename _Class,
typename... _ArgTypes
146 _GLIBCXX_NOEXCEPT_PARM>
148 _GLIBCXX_NOEXCEPT_QUAL>
149 {
typedef _Res result_type; };
151 template<
typename _Res,
typename _Class,
typename... _ArgTypes
152 _GLIBCXX_NOEXCEPT_PARM>
154 _GLIBCXX_NOEXCEPT_QUAL>
155 {
typedef _Res result_type; };
158 template<
typename _Res,
typename _Class,
typename... _ArgTypes
159 _GLIBCXX_NOEXCEPT_PARM>
161 const volatile _GLIBCXX_NOEXCEPT_QUAL>
162 {
typedef _Res result_type; };
164 template<
typename _Res,
typename _Class,
typename... _ArgTypes
165 _GLIBCXX_NOEXCEPT_PARM>
167 const volatile _GLIBCXX_NOEXCEPT_QUAL>
168 {
typedef _Res result_type; };
174 template<
typename _Functor>
180 template<
typename _Tp,
typename = __
void_t<>>
181 struct _Refwrap_base_arg1
185 template<
typename _Tp>
186 struct _Refwrap_base_arg1<_Tp,
187 __void_t<typename _Tp::argument_type>>
189 typedef typename _Tp::argument_type argument_type;
193 template<
typename _Tp,
typename = __
void_t<>>
194 struct _Refwrap_base_arg2
198 template<
typename _Tp>
199 struct _Refwrap_base_arg2<_Tp,
200 __void_t<typename _Tp::first_argument_type,
201 typename _Tp::second_argument_type>>
203 typedef typename _Tp::first_argument_type first_argument_type;
204 typedef typename _Tp::second_argument_type second_argument_type;
213 template<
typename _Tp>
219 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
224 template<
typename _Res,
typename _T1>
225 struct _Reference_wrapper_base<_Res(_T1) const>
226 : unary_function<_T1, _Res>
229 template<
typename _Res,
typename _T1>
230 struct _Reference_wrapper_base<_Res(_T1) volatile>
231 : unary_function<_T1, _Res>
234 template<
typename _Res,
typename _T1>
235 struct _Reference_wrapper_base<_Res(_T1) const volatile>
236 : unary_function<_T1, _Res>
240 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
241 struct _Reference_wrapper_base<_Res(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
242 : binary_function<_T1, _T2, _Res>
245 template<
typename _Res,
typename _T1,
typename _T2>
246 struct _Reference_wrapper_base<_Res(_T1, _T2) const>
247 : binary_function<_T1, _T2, _Res>
250 template<
typename _Res,
typename _T1,
typename _T2>
251 struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
252 : binary_function<_T1, _T2, _Res>
255 template<
typename _Res,
typename _T1,
typename _T2>
256 struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
257 : binary_function<_T1, _T2, _Res>
261 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
262 struct _Reference_wrapper_base<_Res(*)(_T1) _GLIBCXX_NOEXCEPT_QUAL>
263 : unary_function<_T1, _Res>
267 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
268 struct _Reference_wrapper_base<_Res(*)(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
269 : binary_function<_T1, _T2, _Res>
273 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
274 struct _Reference_wrapper_base<_Res (_T1::*)() _GLIBCXX_NOEXCEPT_QUAL>
275 : unary_function<_T1*, _Res>
279 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
280 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) _GLIBCXX_NOEXCEPT_QUAL>
281 : binary_function<_T1*, _T2, _Res>
285 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
286 struct _Reference_wrapper_base<_Res (_T1::*)() const _GLIBCXX_NOEXCEPT_QUAL>
287 : unary_function<const _T1*, _Res>
291 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
292 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const _GLIBCXX_NOEXCEPT_QUAL>
293 : binary_function<const _T1*, _T2, _Res>
297 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
298 struct _Reference_wrapper_base<_Res (_T1::*)() volatile _GLIBCXX_NOEXCEPT_QUAL>
299 : unary_function<volatile _T1*, _Res>
303 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
304 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile _GLIBCXX_NOEXCEPT_QUAL>
305 : binary_function<volatile _T1*, _T2, _Res>
309 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
310 struct _Reference_wrapper_base<_Res (_T1::*)() const volatile _GLIBCXX_NOEXCEPT_QUAL>
311 : unary_function<const volatile _T1*, _Res>
315 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
316 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile _GLIBCXX_NOEXCEPT_QUAL>
317 : binary_function<const volatile _T1*, _T2, _Res>
325 template<
typename _Tp>
345 operator _Tp&()
const noexcept
346 {
return this->
get(); }
352 template<
typename... _Args>
353 typename result_of<_Tp&(_Args&&...)>::type
354 operator()(_Args&&... __args)
const
356 return std::__invoke(
get(), std::forward<_Args>(__args)...);
362 template<
typename _Tp>
368 template<
typename _Tp>
369 inline reference_wrapper<const _Tp>
373 template<
typename _Tp>
374 void ref(
const _Tp&&) =
delete;
376 template<
typename _Tp>
377 void cref(
const _Tp&&) =
delete;
380 template<
typename _Tp>
381 inline reference_wrapper<_Tp>
383 {
return ref(__t.get()); }
386 template<
typename _Tp>
387 inline reference_wrapper<const _Tp>
389 {
return cref(__t.get()); }
393 _GLIBCXX_END_NAMESPACE_VERSION
398 #endif // _GLIBCXX_REFWRAP_H
reference_wrapper< const _Tp > cref(const _Tp &__t) noexcept
Denotes a const reference should be taken to a variable.
reference_wrapper< _Tp > ref(_Tp &__t) noexcept
Denotes a reference should be taken to a variable.
Primary class template for reference_wrapper.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
If we have found a result_type, extract it.