6 #ifndef EASTL_INTERNAL_FUNCTIONAL_BASE_H
7 #define EASTL_INTERNAL_FUNCTIONAL_BASE_H
9 #include <EASTL/internal/config.h>
11 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
15 #include <EASTL/internal/memory_base.h>
16 #include <EASTL/internal/move_help.h>
17 #include <EASTL/type_traits.h>
24 inline void swap(T& a, T& b)
43 template <
typename R,
typename C,
typename T,
typename... Args>
44 EA_CONSTEXPR
auto invoke_impl(R
C::*func, T&& obj, Args&&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR((eastl::forward<T>(obj).*func)(eastl::forward<Args>(args)...)))
46 decltype((eastl::forward<T>(obj).*func)(eastl::forward<Args>(args)...))>::type
48 return (eastl::forward<T>(obj).*func)(eastl::forward<Args>(args)...);
51 template <
typename F,
typename... Args>
52 EA_CONSTEXPR
auto invoke_impl(F&& func, Args&&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR(eastl::forward<F>(func)(eastl::forward<Args>(args)...)))
53 -> decltype(eastl::forward<F>(func)(eastl::forward<Args>(args)...))
55 return eastl::forward<F>(func)(eastl::forward<Args>(args)...);
59 template <
typename R,
typename C,
typename T,
typename... Args>
60 EA_CONSTEXPR
auto invoke_impl(R
C::*func, T&& obj, Args&&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR(((*eastl::forward<T>(obj)).*func)(eastl::forward<Args>(args)...)))
61 -> decltype(((*eastl::forward<T>(obj)).*func)(eastl::forward<Args>(args)...))
63 return ((*eastl::forward<T>(obj)).*func)(eastl::forward<Args>(args)...);
66 template <
typename M,
typename C,
typename T>
67 EA_CONSTEXPR
auto invoke_impl(M
C::*member, T&& obj) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR(eastl::forward<T>(obj).*member))
68 ->
typename enable_if<
69 is_base_of<C, decay_t<T>>::value,
70 decltype(eastl::forward<T>(obj).*member)
73 return eastl::forward<T>(obj).*member;
76 template <
typename M,
typename C,
typename T>
77 EA_CONSTEXPR
auto invoke_impl(M
C::*member, T&& obj) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR((*eastl::forward<T>(obj)).*member))
78 -> decltype((*eastl::forward<T>(obj)).*member)
80 return (*eastl::forward<T>(obj)).*member;
83 template <
typename F,
typename... Args>
84 EA_CONSTEXPR decltype(
auto) invoke(F&& func, Args&&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR(
invoke_impl(
eastl::forward<F>(func),
eastl::forward<Args>(args)...)))
86 return invoke_impl(eastl::forward<F>(func), eastl::forward<Args>(args)...);
89 template <
typename F,
typename = void,
typename... Args>
93 template <
typename F,
typename... Args>
96 typedef decltype(
invoke_impl(eastl::declval<F>(), eastl::declval<Args>()...)) type;
99 template <
typename F,
typename... Args>
102 #if !defined(EA_COMPILER_NO_TEMPLATE_ALIASES)
103 template <
typename F,
typename... Args>
104 using invoke_result_t =
typename invoke_result<F, Args...>::type;
107 template <
typename F,
typename = void,
typename... Args>
110 template <
typename F,
typename... Args>
113 template <
typename F,
typename... Args>
116 template <
typename R,
typename F,
typename = void,
typename... Args>
119 template <
typename R,
typename F,
typename... Args>
121 :
public is_convertible<typename invoke_result<F, Args...>::type, R> {};
123 template <
typename R,
typename F,
typename... Args>
126 template <
typename F,
typename... Args>
127 EASTL_CPP17_INLINE_VARIABLE EA_CONSTEXPR
bool is_invocable_v =
is_invocable<F, Args...>::value;
129 template <
typename R,
typename F,
typename... Args>
130 EASTL_CPP17_INLINE_VARIABLE EA_CONSTEXPR
bool is_invocable_r_v =
is_invocable_r<R, F, Args...>::value;
132 template <
typename F,
typename = void,
typename... Args>
135 template <
typename F,
typename... Args>
137 :
public eastl::bool_constant<EA_NOEXCEPT_EXPR(eastl::invoke(eastl::declval<F>(), eastl::declval<Args>()...))> {};
139 template <
typename F,
typename... Args>
142 template <
typename R,
typename F,
typename = void,
typename... Args>
145 template <
typename R,
typename F,
typename... Args>
152 template <
typename R,
typename F,
typename... Args>
155 template <
typename F,
typename... Args>
156 EASTL_CPP17_INLINE_VARIABLE EA_CONSTEXPR
bool is_no_throw_invocable_v =
is_nothrow_invocable<F, Args...>::value;
158 template <
typename R,
typename F,
typename... Args>
159 EASTL_CPP17_INLINE_VARIABLE EA_CONSTEXPR
bool is_nothrow_invocable_r_v =
is_nothrow_invocable_r<R, F, Args...>::value;
182 template <
typename Argument,
typename Result>
185 typedef Argument argument_type;
186 typedef Result result_type;
190 template <
typename Argument1,
typename Argument2,
typename Result>
193 typedef Argument1 first_argument_type;
194 typedef Argument2 second_argument_type;
195 typedef Result result_type;
200 template <
typename T =
void>
203 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
211 template<
typename A,
typename B>
212 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
213 -> decltype(eastl::forward<A>(a) < eastl::forward<B>(b))
214 {
return eastl::forward<A>(a) < eastl::forward<B>(b); }
219 template <
typename T>
231 operator T& ()
const EA_NOEXCEPT;
232 T& get()
const EA_NOEXCEPT;
234 template <
typename... ArgTypes>
235 typename eastl::result_of<T&(ArgTypes&&...)>::type operator() (ArgTypes&&...)
const;
241 template <
typename T>
246 template <
typename T>
247 reference_wrapper<T>::reference_wrapper(
const reference_wrapper<T>& other) EA_NOEXCEPT
251 template <
typename T>
252 reference_wrapper<T>& reference_wrapper<T>::operator=(
const reference_wrapper<T>& other) EA_NOEXCEPT
258 template <
typename T>
259 reference_wrapper<T>::operator T&()
const EA_NOEXCEPT
264 template <
typename T>
265 T& reference_wrapper<T>::get() const EA_NOEXCEPT
270 template <
typename T>
271 template <
typename... ArgTypes>
272 typename eastl::result_of<T&(ArgTypes&&...)>::type reference_wrapper<T>::operator() (ArgTypes&&... args)
const
274 return eastl::invoke(*val, eastl::forward<ArgTypes>(args)...);
278 template <
typename T>
279 reference_wrapper<T> ref(T& t) EA_NOEXCEPT
284 template <
typename T>
285 void ref(
const T&&) =
delete;
287 template <
typename T>
288 reference_wrapper<T> ref(reference_wrapper<T>t) EA_NOEXCEPT
290 return eastl::ref(t.get());
293 template <
typename T>
294 reference_wrapper<const T> cref(
const T& t) EA_NOEXCEPT
299 template <
typename T>
300 void cref(
const T&&) =
delete;
302 template <
typename T>
303 reference_wrapper<const T> cref(reference_wrapper<T> t) EA_NOEXCEPT
305 return eastl::cref(t.get());
310 template <
typename T>
314 template <
typename T>
318 template <
typename T>
324 template <
typename T>
328 template <
typename T>
330 {
typedef T& type; };
332 template <
typename T>
334 {
typedef T& type; };
339 template <
typename R,
typename C,
typename T,
typename... Args>
340 EA_CONSTEXPR
auto invoke_impl(R
C::*func, T&& obj, Args&&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR((obj.get().*func)(eastl::forward<Args>(args)...)))
342 decltype((obj.get().*func)(eastl::forward<Args>(args)...))>::type
344 return (obj.get().*func)(eastl::forward<Args>(args)...);
347 template <
typename M,
typename C,
typename T>
348 EA_CONSTEXPR
auto invoke_impl(M
C::*member, T&& obj) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR(obj.get().*member))
349 ->
typename enable_if<is_reference_wrapper<eastl::decay_t<T>>::value,
350 decltype(obj.get().*member)>::type
352 return obj.get().*member;
362 template <
typename Operation>
363 class binder1st :
public unary_function<typename Operation::second_argument_type, typename Operation::result_type>
366 typename Operation::first_argument_type value;
370 binder1st(
const Operation& x,
const typename Operation::first_argument_type& y)
371 : value(y), op(x) { }
373 typename Operation::result_type operator()(
const typename Operation::second_argument_type& x)
const
374 {
return op(value, x); }
376 typename Operation::result_type operator()(
typename Operation::second_argument_type& x)
const
377 {
return op(value, x); }
381 template <
typename Operation,
typename T>
382 inline binder1st<Operation>
bind1st(
const Operation& op,
const T& x)
384 typedef typename Operation::first_argument_type value;
385 return binder1st<Operation>(op, value(x));
391 template <
typename Operation>
396 typename Operation::second_argument_type value;
399 binder2nd(
const Operation& x,
const typename Operation::second_argument_type& y)
400 : op(x), value(y) { }
402 typename Operation::result_type operator()(
const typename Operation::first_argument_type& x)
const
403 {
return op(x, value); }
405 typename Operation::result_type operator()(
typename Operation::first_argument_type& x)
const
406 {
return op(x, value); }
410 template <
typename Operation,
typename T>
413 typedef typename Operation::second_argument_type value;
Definition: functional_base.h:393
reference_wrapper
Definition: functional_base.h:221
EA Standard Template Library.
Definition: algorithm.h:288
EASTL_CPP17_INLINE_VARIABLE EA_CONSTEXPR allocator_arg_t allocator_arg
Definition: functional_base.h:179
EA_CONSTEXPR auto invoke_impl(R C::*func, T &&obj, Args &&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR((obj.get().*func)(eastl binder1st< Operation > bind1st(const Operation &op, const T &x)
Definition: functional_base.h:382
T * addressof(T &value) EA_NOEXCEPT
Definition: memory_base.h:29
void swap(T &a, T &b) EA_NOEXCEPT_IF(eastl EA_CONSTEXPR auto invoke_impl(R C::*func, T &&obj, Args &&... args) EA_NOEXCEPT_IF(EA_NOEXCEPT_EXPR((eastl
Definition: functional_base.h:44
Definition: TestEABase.cpp:2829
Definition: functional_base.h:169
Definition: functional_base.h:192
Definition: type_traits.h:442
Definition: type_traits.h:263
Definition: functional_base.h:90
Definition: functional_base.h:100
Definition: type_compound.h:328
Definition: functional_base.h:108
Definition: functional_base.h:117
Definition: functional_base.h:124
Definition: functional_base.h:114
Definition: functional_base.h:133
Definition: functional_base.h:143
Definition: functional_base.h:153
Definition: functional_base.h:140
Definition: type_pod.h:1676
Definition: type_pod.h:1934
Definition: functional_base.h:312
Definition: functional_base.h:320
less<T>
Definition: functional_base.h:202
Definition: functional_base.h:326
Definition: type_properties.h:359
Definition: functional_base.h:184