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// SPDX-FileCopyrightText: Copyright (C) 2021 Tobias Hienzsch
3
4#ifndef TETL_FUNCTIONAL_INVOKE_HPP
5#define TETL_FUNCTIONAL_INVOKE_HPP
6
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>
14
15namespace etl {
16
17namespace detail {
18
19template <typename Class, typename Pointed, typename T1, typename... Args>
20constexpr auto invoke_memptr(Pointed Class::* f, T1&& t1, Args&&... args) -> decltype(auto)
21{
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)...);
27 } else {
28 return ((*etl::forward<T1>(t1)).*f)(etl::forward<Args>(args)...);
29 }
30 } else {
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>>) {
35 return t1.get().*f;
36 } else {
37 return (*etl::forward<T1>(t1)).*f;
38 }
39 }
40}
41
42} // namespace detail
43
44/// \todo Add noexcept(is_nothrow_invocable_v<F, Args...>)
45template <typename F, typename... Args>
46constexpr auto invoke(F&& f, Args&&... args) -> invoke_result_t<F, Args...>
47{
48 if constexpr (is_member_pointer_v<decay_t<F>>) {
49 return detail::invoke_memptr(f, etl::forward<Args>(args)...);
50 } else {
51 return etl::forward<F>(f)(etl::forward<Args>(args)...);
52 }
53}
54
55} // namespace etl
56
57#endif // TETL_FUNCTIONAL_INVOKE_HPP
Definition adjacent_find.hpp:9
constexpr auto invoke(F &&f, Args &&... args) -> invoke_result_t< F, Args... >
Definition invoke.hpp:46