18 #ifndef OTABSL_BASE_INTERNAL_INVOKE_H_
19 #define OTABSL_BASE_INTERNAL_INVOKE_H_
22 #include <type_traits>
25 #include "../../meta/type_traits.h"
32 namespace base_internal {
42 template <
typename Derived>
44 template <
typename... Args>
45 struct Accept : Derived::template AcceptImpl<typename std::remove_cv<
46 typename std::remove_reference<Args>::type>::type...> {};
53 template <
typename... Args>
56 template <
typename MemFunType,
typename C,
typename Obj,
typename... Args>
58 : std::integral_constant<bool, std::is_base_of<C, Obj>::value &&
59 absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<MemFunType>::value> {
62 template <
typename MemFun,
typename Obj,
typename... Args>
63 static decltype((std::declval<Obj>().*
64 std::declval<MemFun>())(std::declval<Args>()...))
65 Invoke(MemFun&& mem_fun, Obj&& obj, Args&&... args) {
66 return (std::forward<Obj>(obj).*
67 std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...);
74 template <
typename... Args>
77 template <
typename MemFunType,
typename C,
typename Ptr,
typename... Args>
79 : std::integral_constant<bool, !std::is_base_of<C, Ptr>::value &&
80 absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<MemFunType>::value> {
83 template <
typename MemFun,
typename Ptr,
typename... Args>
84 static decltype(((*std::declval<Ptr>()).*
85 std::declval<MemFun>())(std::declval<Args>()...))
86 Invoke(MemFun&& mem_fun,
Ptr&& ptr, Args&&... args) {
87 return ((*std::forward<Ptr>(ptr)).*
88 std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...);
96 template <
typename... Args>
99 template <
typename R,
typename C,
typename Obj>
101 : std::integral_constant<bool, std::is_base_of<C, Obj>::value &&
102 !absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<R>::value> {};
104 template <
typename DataMem,
typename Ref>
105 static decltype(std::declval<Ref>().*std::declval<DataMem>())
Invoke(
106 DataMem&& data_mem, Ref&& ref) {
107 return std::forward<Ref>(ref).*std::forward<DataMem>(data_mem);
114 template <
typename... Args>
117 template <
typename R,
typename C,
typename Ptr>
119 : std::integral_constant<bool, !std::is_base_of<C, Ptr>::value &&
120 !absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<R>::value> {};
122 template <
typename DataMem,
typename Ptr>
123 static decltype((*std::declval<Ptr>()).*std::declval<DataMem>())
Invoke(
124 DataMem&& data_mem,
Ptr&& ptr) {
125 return (*std::forward<Ptr>(ptr)).*std::forward<DataMem>(data_mem);
133 template <
typename F,
typename... Args>
134 static decltype(std::declval<F>()(std::declval<Args>()...))
Invoke(
135 F&& f, Args&&... args) {
136 return std::forward<F>(f)(std::forward<Args>(args)...);
141 template <
typename... Args>
143 typedef typename std::conditional<
145 typename std::conditional<
147 typename std::conditional<
149 typename std::conditional<DataMemAndPtr::Accept<Args...>::value,
155 template <
typename F,
typename... Args>
157 std::declval<F>(), std::declval<Args>()...));
161 template <
typename F,
typename... Args>
164 std::forward<Args>(args)...);
171 #endif // OTABSL_BASE_INTERNAL_INVOKE_H_