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
52 template<
typename _Res,
typename... _ArgTypes>
56 template<
typename _Res,
typename _T1>
61 template<
typename _Res,
typename _T1,
typename _T2>
65 template<
typename _Signature>
66 struct _Mem_fn_traits;
68 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
69 struct _Mem_fn_traits_base
71 using __result_type = _Res;
77 #define _GLIBCXX_MEM_FN_TRAITS2(_CV, _REF, _LVAL, _RVAL) \ 78 template<typename _Res, typename _Class, typename... _ArgTypes> \ 79 struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) _CV _REF> \ 80 : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \ 82 using __vararg = false_type; \ 84 template<typename _Res, typename _Class, typename... _ArgTypes> \ 85 struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) _CV _REF> \ 86 : _Mem_fn_traits_base<_Res, _CV _Class, _ArgTypes...> \ 88 using __vararg = true_type; \ 91 #define _GLIBCXX_MEM_FN_TRAITS(_REF, _LVAL, _RVAL) \ 92 _GLIBCXX_MEM_FN_TRAITS2( , _REF, _LVAL, _RVAL) \ 93 _GLIBCXX_MEM_FN_TRAITS2(const , _REF, _LVAL, _RVAL) \ 94 _GLIBCXX_MEM_FN_TRAITS2(volatile , _REF, _LVAL, _RVAL) \ 95 _GLIBCXX_MEM_FN_TRAITS2(const volatile, _REF, _LVAL, _RVAL) 101 #if __cplusplus > 201402L 107 #undef _GLIBCXX_MEM_FN_TRAITS 108 #undef _GLIBCXX_MEM_FN_TRAITS2 111 template<
typename _Functor,
typename = __
void_t<>>
115 template<
typename _Functor>
117 __void_t<typename _Functor::result_type>>
118 {
typedef typename _Functor::result_type result_type; };
124 template<
typename _Functor>
130 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
132 {
typedef _Res result_type; };
135 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
137 {
typedef _Res result_type; };
140 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
142 {
typedef _Res result_type; };
145 template<
typename _Res,
typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
148 {
typedef _Res result_type; };
151 template<
typename _Functor,
153 struct _Weak_result_type_memfun
158 template<
typename _MemFunPtr>
159 struct _Weak_result_type_memfun<_MemFunPtr, true>
161 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
165 template<
typename _Func,
typename _Class>
166 struct _Weak_result_type_memfun<_Func _Class::*, false>
173 template<
typename _Functor>
175 : _Weak_result_type_memfun<typename remove_cv<_Functor>::type>
179 template<
typename _Tp,
typename = __
void_t<>>
180 struct _Refwrap_base_arg1
184 template<
typename _Tp>
185 struct _Refwrap_base_arg1<_Tp,
186 __void_t<typename _Tp::argument_type>>
188 typedef typename _Tp::argument_type argument_type;
192 template<
typename _Tp,
typename = __
void_t<>>
193 struct _Refwrap_base_arg2
197 template<
typename _Tp>
198 struct _Refwrap_base_arg2<_Tp,
199 __void_t<typename _Tp::first_argument_type,
200 typename _Tp::second_argument_type>>
202 typedef typename _Tp::first_argument_type first_argument_type;
203 typedef typename _Tp::second_argument_type second_argument_type;
212 template<
typename _Tp>
218 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
223 template<
typename _Res,
typename _T1>
224 struct _Reference_wrapper_base<_Res(_T1) const>
225 : unary_function<_T1, _Res>
228 template<
typename _Res,
typename _T1>
229 struct _Reference_wrapper_base<_Res(_T1) volatile>
230 : unary_function<_T1, _Res>
233 template<
typename _Res,
typename _T1>
234 struct _Reference_wrapper_base<_Res(_T1) const volatile>
235 : unary_function<_T1, _Res>
239 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
240 struct _Reference_wrapper_base<_Res(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
241 : binary_function<_T1, _T2, _Res>
244 template<
typename _Res,
typename _T1,
typename _T2>
245 struct _Reference_wrapper_base<_Res(_T1, _T2) const>
246 : binary_function<_T1, _T2, _Res>
249 template<
typename _Res,
typename _T1,
typename _T2>
250 struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
251 : binary_function<_T1, _T2, _Res>
254 template<
typename _Res,
typename _T1,
typename _T2>
255 struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
256 : binary_function<_T1, _T2, _Res>
260 template<
typename _Res,
typename _T1 _GLIBCXX_NOEXCEPT_PARM>
261 struct _Reference_wrapper_base<_Res(*)(_T1) _GLIBCXX_NOEXCEPT_QUAL>
262 : unary_function<_T1, _Res>
266 template<
typename _Res,
typename _T1,
typename _T2 _GLIBCXX_NOEXCEPT_PARM>
267 struct _Reference_wrapper_base<_Res(*)(_T1, _T2) _GLIBCXX_NOEXCEPT_QUAL>
268 : binary_function<_T1, _T2, _Res>
271 template<typename _Tp, bool = is_member_function_pointer<_Tp>::value>
272 struct _Reference_wrapper_base_memfun
273 : _Reference_wrapper_base<_Tp>
276 template<
typename _MemFunPtr>
277 struct _Reference_wrapper_base_memfun<_MemFunPtr, true>
278 : _Mem_fn_traits<_MemFunPtr>::__maybe_type
280 using result_type =
typename _Mem_fn_traits<_MemFunPtr>::__result_type;
288 template<
typename _Tp>
289 class reference_wrapper
290 :
public _Reference_wrapper_base_memfun<typename remove_cv<_Tp>::type>
297 reference_wrapper(_Tp& __indata) noexcept
301 reference_wrapper(_Tp&&) =
delete;
303 reference_wrapper(
const reference_wrapper&) =
default;
306 operator=(
const reference_wrapper&) =
default;
308 operator _Tp&()
const noexcept
309 {
return this->get(); }
315 template<
typename... _Args>
316 typename result_of<_Tp&(_Args&&...)>::type
317 operator()(_Args&&... __args)
const 325 template<
typename _Tp>
326 inline reference_wrapper<_Tp>
331 template<
typename _Tp>
332 inline reference_wrapper<const _Tp>
336 template<
typename _Tp>
337 void ref(
const _Tp&&) =
delete;
339 template<
typename _Tp>
340 void cref(
const _Tp&&) =
delete;
343 template<
typename _Tp>
344 inline reference_wrapper<_Tp>
349 template<
typename _Tp>
350 inline reference_wrapper<const _Tp>
352 {
return { __t.get() }; }
356 _GLIBCXX_END_NAMESPACE_VERSION
361 #endif // _GLIBCXX_REFWRAP_H
is_member_function_pointer
integral_constant< bool, true > true_type
The type used as a compile-time boolean with true value.
reference_wrapper< _Tp > ref(_Tp &__t) noexcept
Denotes a reference should be taken to a variable.
If we have found a result_type, extract it.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
reference_wrapper< const _Tp > cref(const _Tp &__t) noexcept
Denotes a const reference should be taken to a variable.
ISO C++ entities toplevel namespace is std.
Primary class template for reference_wrapper.
integral_constant< bool, false > false_type
The type used as a compile-time boolean with false value.