4#ifndef TETL_FUNCTIONAL_INVOKE_HPP
5#define TETL_FUNCTIONAL_INVOKE_HPP
7#include <etl/_type_traits/decay.hpp>
8#include <etl/_type_traits/invoke_result.hpp>
9#include <etl/_type_traits/is_base_of.hpp>
10#include <etl/_type_traits/is_function.hpp>
11#include <etl/_type_traits/is_member_pointer.hpp>
12#include <etl/_type_traits/is_object.hpp>
13#include <etl/_utility/forward.hpp>
19template <
typename Class,
typename Pointed,
typename T1,
typename... Args>
20constexpr auto invoke_memptr(Pointed Class::* f, T1&& t1, Args&&... args) ->
decltype(
auto)
22 if constexpr (is_function_v<Pointed>) {
23 if constexpr (is_base_of_v<Class, decay_t<T1>>) {
24 return (
etl::forward<T1>(t1).*f)(
etl::forward<Args>(args)...);
25 }
else if constexpr (is_reference_wrapper_v<decay_t<T1>>) {
26 return (t1.get().*f)(
etl::forward<Args>(args)...);
28 return ((*
etl::forward<T1>(t1)).*f)(
etl::forward<Args>(args)...);
31 static_assert(is_object_v<Pointed> &&
sizeof...(args) == 0);
32 if constexpr (is_base_of_v<Class, decay_t<T1>>) {
33 return etl::forward<T1>(t1).*f;
34 }
else if constexpr (is_reference_wrapper_v<decay_t<T1>>) {
37 return (*
etl::forward<T1>(t1)).*f;
45template <
typename F,
typename... Args>
46constexpr auto invoke(F&& f, Args&&... args) -> invoke_result_t<F, Args...>
48 if constexpr (is_member_pointer_v<decay_t<F>>) {
49 return detail::invoke_memptr(f,
etl::forward<Args>(args)...);
51 return etl::forward<F>(f)(
etl::forward<Args>(args)...);
Definition adjacent_find.hpp:9
constexpr auto invoke(F &&f, Args &&... args) -> invoke_result_t< F, Args... >
Definition invoke.hpp:46