tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
invoke.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_FUNCTIONAL_INVOKE_HPP
4#define TETL_FUNCTIONAL_INVOKE_HPP
5
13
14namespace etl {
15
16namespace detail {
17
18template <typename Class, typename Pointed, typename T1, typename... Args>
19constexpr auto invoke_memptr(Pointed Class::* f, T1&& t1, Args&&... args) -> decltype(auto)
20{
21 if constexpr (is_function_v<Pointed>) {
22 if constexpr (is_base_of_v<Class, decay_t<T1>>) {
23 return (etl::forward<T1>(t1).*f)(etl::forward<Args>(args)...);
24 } else if constexpr (is_reference_wrapper_v<decay_t<T1>>) {
25 return (t1.get().*f)(etl::forward<Args>(args)...);
26 } else {
27 return ((*etl::forward<T1>(t1)).*f)(etl::forward<Args>(args)...);
28 }
29 } else {
30 static_assert(is_object_v<Pointed> && sizeof...(args) == 0);
31 if constexpr (is_base_of_v<Class, decay_t<T1>>) {
32 return etl::forward<T1>(t1).*f;
33 } else if constexpr (is_reference_wrapper_v<decay_t<T1>>) {
34 return t1.get().*f;
35 } else {
36 return (*etl::forward<T1>(t1)).*f;
37 }
38 }
39}
40
41} // namespace detail
42
44template <typename F, typename... Args>
45constexpr auto invoke(F&& f, Args&&... args) -> invoke_result_t<F, Args...>
46{
47 if constexpr (is_member_pointer_v<decay_t<F>>) {
48 return detail::invoke_memptr(f, etl::forward<Args>(args)...);
49 } else {
50 return etl::forward<F>(f)(etl::forward<Args>(args)...);
51 }
52}
53
54} // namespace etl
55
56#endif // TETL_FUNCTIONAL_INVOKE_HPP
Definition adjacent_find.hpp:8
constexpr bool is_base_of_v
Definition is_base_of.hpp:39
constexpr bool is_reference_wrapper_v
Definition is_reference_wrapper.hpp:20
constexpr bool is_object_v
Definition is_object.hpp:35
constexpr bool is_member_pointer_v
Definition is_member_pointer.hpp:40
constexpr auto invoke(F &&f, Args &&... args) -> invoke_result_t< F, Args... >
Definition invoke.hpp:45
constexpr bool is_function_v
Checks whether T is a function type. Types like etl::inplace_function, lambdas, classes with overload...
Definition is_function.hpp:35
constexpr auto forward(remove_reference_t< T > &param) noexcept -> T &&
Forwards lvalues as either lvalues or as rvalues, depending on T. When t is a forwarding reference (a...
Definition forward.hpp:18