30#ifndef _GLIBCXX_INVOKE_H
31#define _GLIBCXX_INVOKE_H 1
34#pragma GCC system_header
37#if __cplusplus < 201103L
44namespace std _GLIBCXX_VISIBILITY(default)
46_GLIBCXX_BEGIN_NAMESPACE_VERSION
55 template<typename _Tp, typename _Up = typename __inv_unwrap<_Tp>::type>
57 __invfwd(
typename remove_reference<_Tp>::type& __t)
noexcept
58 {
return static_cast<_Up&&
>(__t); }
60 template<
typename _Res,
typename _Fn,
typename... _Args>
62 __invoke_impl(__invoke_other, _Fn&& __f, _Args&&... __args)
65 template<
typename _Res,
typename _MemFun,
typename _Tp,
typename... _Args>
67 __invoke_impl(__invoke_memfun_ref, _MemFun&& __f, _Tp&& __t,
71 template<
typename _Res,
typename _MemFun,
typename _Tp,
typename... _Args>
73 __invoke_impl(__invoke_memfun_deref, _MemFun&& __f, _Tp&& __t,
79 template<
typename _Res,
typename _MemPtr,
typename _Tp>
81 __invoke_impl(__invoke_memobj_ref, _MemPtr&& __f, _Tp&& __t)
82 {
return __invfwd<_Tp>(__t).*__f; }
84 template<
typename _Res,
typename _MemPtr,
typename _Tp>
86 __invoke_impl(__invoke_memobj_deref, _MemPtr&& __f, _Tp&& __t)
90 template<
typename _Callable,
typename... _Args>
91 constexpr typename __invoke_result<_Callable, _Args...>::type
93 noexcept(__is_nothrow_invocable<_Callable, _Args...>::value)
95 using __result = __invoke_result<_Callable, _Args...>;
96 using __type =
typename __result::type;
97 using __tag =
typename __result::__invoke_type;
102#if __cplusplus >= 201703L
104 template<
typename _Res,
typename _Callable,
typename... _Args>
105 constexpr enable_if_t<is_invocable_r_v<_Res, _Callable, _Args...>, _Res>
106 __invoke_r(_Callable&& __fn, _Args&&... __args)
107 noexcept(is_nothrow_invocable_r_v<_Res, _Callable, _Args...>)
109 using __result = __invoke_result<_Callable, _Args...>;
110 using __type =
typename __result::type;
111 using __tag =
typename __result::__invoke_type;
112 if constexpr (is_void_v<_Res>)
116 return std::__invoke_impl<__type>(__tag{},
129 template<
typename _Res,
typename _Callable,
typename... _Args>
130 constexpr __enable_if_t<!is_void<_Res>::value, _Res>
131 __invoke_r(_Callable&& __fn, _Args&&... __args)
133 using __result = __invoke_result<_Callable, _Args...>;
134 using __type =
typename __result::type;
135#if __has_builtin(__reference_converts_from_temporary)
136 static_assert(!__reference_converts_from_temporary(_Res, __type),
137 "INVOKE<R> must not create a dangling reference");
139 using __tag =
typename __result::__invoke_type;
145 template<
typename _Res,
typename _Callable,
typename... _Args>
146 _GLIBCXX14_CONSTEXPR __enable_if_t<is_void<_Res>::value, _Res>
147 __invoke_r(_Callable&& __fn, _Args&&... __args)
149 using __result = __invoke_result<_Callable, _Args...>;
150 using __type =
typename __result::type;
151 using __tag =
typename __result::__invoke_type;
157_GLIBCXX_END_NAMESPACE_VERSION
typename enable_if< _Cond, _Tp >::type enable_if_t
Alias template for enable_if.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
ISO C++ entities toplevel namespace is std.