FastLED 3.9.15
Loading...
Searching...
No Matches
functional.h
Go to the documentation of this file.
1#pragma once
3#include "fl/stl/noexcept.h"
4
5namespace fl {
6
7template <typename T, typename Deleter>
8class unique_ptr; // Forward declare unique_ptr to avoid header inclusion
9
10//----------------------------------------------------------------------------
11// invoke implementation - equivalent to std::invoke from C++17
12//----------------------------------------------------------------------------
13
14namespace detail {
15
16// Helper to detect member data pointers
17template <typename T>
19
20template <typename T, typename C>
21struct is_member_data_pointer<T C::*> : integral_constant<bool, !is_function<T>::value> {};
22
23// Helper to detect if T is a pointer type
24template <typename T>
26
27template <typename T>
28struct is_pointer_like<T*> : true_type {};
29
30template <typename T, typename Deleter>
31struct is_pointer_like<fl::unique_ptr<T, Deleter>> : true_type {};
32
33// Helper to detect if we should use pointer-to-member syntax
34template <typename T>
35struct use_pointer_syntax : is_pointer_like<typename remove_reference<T>::type> {};
36
37} // namespace detail
38
39// Main invoke function overloads
40
41// 1a. Member function pointer with object reference
42template <typename F, typename T1, typename... Args>
50
51// 1b. Member function pointer with pointer-like object
52template <typename F, typename T1, typename... Args>
53auto invoke(F&& f, T1&& t1, Args&&... args) FL_NOEXCEPT
54 -> enable_if_t<is_member_function_pointer<typename remove_reference<F>::type>::value &&
56 decltype(((*fl::forward<T1>(t1)).*f)(fl::forward<Args>(args)...))>
57{
58 return ((*fl::forward<T1>(t1)).*f)(fl::forward<Args>(args)...);
59}
60
61// 2a. Member data pointer with object reference
62template <typename F, typename T1>
70
71// 2b. Member data pointer with pointer-like object
72template <typename F, typename T1>
73auto invoke(F&& f, T1&& t1) FL_NOEXCEPT
74 -> enable_if_t<detail::is_member_data_pointer<typename remove_reference<F>::type>::value &&
76 decltype((*fl::forward<T1>(t1)).*f)>
77{
78 return (*fl::forward<T1>(t1)).*f;
79}
80
81// 3. Regular callable (function pointer, lambda, functor)
82template <typename F, typename... Args>
90
91} // namespace fl
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_traits.h:48
constexpr T && forward(typename remove_reference< T >::type &t) FL_NOEXCEPT
Definition s16x16x4.h:234
constexpr int type_rank< T >::value
integral_constant< bool, false > false_type
Definition type_traits.h:28
auto invoke(F &&f, T1 &&t1, Args &&... args) FL_NOEXCEPT -> enable_if_t< is_member_function_pointer< typename remove_reference< F >::type >::value &&!detail::use_pointer_syntax< T1 >::value, decltype((fl::forward< T1 >(t1).*f)(fl::forward< Args >(args)...))>
Definition functional.h:43
constexpr T && forward(typename remove_reference< T >::type &t) FL_NOEXCEPT
typename enable_if< Condition, T >::type enable_if_t
Definition type_traits.h:66
integral_constant< bool, true > true_type
Definition type_traits.h:27
Base definition for an LED controller.
Definition crgb.hpp:179
corkscrew_args args
Definition old.h:149
#define FL_NOEXCEPT