37 #ifndef ABSL_BASE_INTERNAL_INVOKE_H_
38 #define ABSL_BASE_INTERNAL_INVOKE_H_
40 #include "absl/base/config.h"
42 #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
48 namespace base_internal {
58 #else // ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
61 #include <type_traits>
64 #include "absl/meta/type_traits.h"
71 namespace base_internal {
81 template <
typename Derived>
83 template <
typename...
Args>
85 typename std::remove_reference<Args>::type>::type...> {};
92 template <
typename...
Args>
95 template <
typename MemFunType,
typename C,
typename Obj,
typename...
Args>
97 : std::integral_constant<bool, std::is_base_of<C, Obj>::value &&
98 absl::is_function<MemFunType>::value> {
101 template <
typename MemFun,
typename Obj,
typename...
Args>
102 static decltype((std::declval<Obj>().*
103 std::declval<MemFun>())(std::declval<Args>()...))
107 #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0)
108 #pragma GCC diagnostic push
109 #pragma GCC diagnostic ignored "-Warray-bounds"
110 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
112 return (std::forward<Obj>(
obj).*
113 std::forward<MemFun>(mem_fun))(std::forward<Args>(
args)...);
114 #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0)
115 #pragma GCC diagnostic pop
123 template <
typename...
Args>
126 template <
typename MemFunType,
typename C,
typename Ptr,
typename...
Args>
128 : std::integral_constant<bool, !std::is_base_of<C, Ptr>::value &&
129 absl::is_function<MemFunType>::value> {
132 template <
typename MemFun,
typename Ptr,
typename...
Args>
133 static decltype(((*std::declval<Ptr>()).*
134 std::declval<MemFun>())(std::declval<Args>()...))
136 return ((*std::forward<Ptr>(
ptr)).*
137 std::forward<MemFun>(mem_fun))(std::forward<Args>(
args)...);
145 template <
typename...
Args>
148 template <
typename R,
typename C,
typename Obj>
150 : std::integral_constant<bool, std::is_base_of<C, Obj>::value &&
151 !absl::is_function<R>::value> {};
153 template <
typename DataMem,
typename Ref>
154 static decltype(std::declval<Ref>().*std::declval<DataMem>())
Invoke(
155 DataMem&& data_mem,
Ref&&
ref) {
156 return std::forward<Ref>(
ref).*std::forward<DataMem>(data_mem);
163 template <
typename...
Args>
166 template <
typename R,
typename C,
typename Ptr>
168 : std::integral_constant<bool, !std::is_base_of<C, Ptr>::value &&
169 !absl::is_function<R>::value> {};
171 template <
typename DataMem,
typename Ptr>
172 static decltype((*std::declval<Ptr>()).*std::declval<DataMem>())
Invoke(
173 DataMem&& data_mem, Ptr&&
ptr) {
174 return (*std::forward<Ptr>(
ptr)).*std::forward<DataMem>(data_mem);
182 template <
typename F,
typename...
Args>
183 static decltype(std::declval<F>()(std::declval<Args>()...))
Invoke(
185 return std::forward<F>(f)(std::forward<Args>(
args)...);
190 template <
typename...
Args>
192 typedef typename std::conditional<
194 typename std::conditional<
196 typename std::conditional<
198 typename std::conditional<DataMemAndPtr::Accept<
Args...>
::value,
204 template <
typename F,
typename...
Args>
206 std::declval<F>(), std::declval<Args>()...));
210 template <
typename F,
typename...
Args>
213 std::forward<Args>(
args)...);
216 template <
typename AlwaysVoid,
typename,
typename,
typename...>
219 template <
typename R,
typename F,
typename...
Args>
221 absl::
void_t<absl::base_internal::invoke_result_t<F, Args...> >, R,
F,
223 : std::integral_constant<
225 std::is_convertible<absl::base_internal::invoke_result_t<F, Args...>,
227 std::is_void<R>::value> {};
232 template <
typename R,
typename F,
typename...
Args>
239 #endif // ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
241 #endif // ABSL_BASE_INTERNAL_INVOKE_H_