FastLED 3.9.15
Loading...
Searching...
No Matches
functional.h
Go to the documentation of this file.
1#pragma once
2#include "fl/type_traits.h"
3#include "fl/utility.h"
4
5namespace fl {
6
7template <typename T>
8class Ptr; // Forward declare Ptr to avoid header inclusion
9
10template <typename T, typename Deleter>
11class unique_ptr; // Forward declare unique_ptr to avoid header inclusion
12
13//----------------------------------------------------------------------------
14// invoke implementation - equivalent to std::invoke from C++17
15//----------------------------------------------------------------------------
16
17namespace detail {
18
19// Helper to detect member data pointers
20template <typename T>
22
23template <typename T, typename C>
24struct is_member_data_pointer<T C::*> : integral_constant<bool, !is_function<T>::value> {};
25
26// Helper to detect if T is a pointer type
27template <typename T>
29
30template <typename T>
31struct is_pointer_like<T*> : true_type {};
32
33template <typename T>
35
36template <typename T, typename Deleter>
37struct is_pointer_like<fl::unique_ptr<T, Deleter>> : true_type {};
38
39// Helper to detect if we should use pointer-to-member syntax
40template <typename T>
41struct use_pointer_syntax : is_pointer_like<typename remove_reference<T>::type> {};
42
43} // namespace detail
44
45// Main invoke function overloads
46
47// 1a. Member function pointer with object reference
48template <typename F, typename T1, typename... Args>
56
57// 1b. Member function pointer with pointer-like object
58template <typename F, typename T1, typename... Args>
59auto invoke(F&& f, T1&& t1, Args&&... args)
60 -> enable_if_t<is_member_function_pointer<typename remove_reference<F>::type>::value &&
62 decltype(((*fl::forward<T1>(t1)).*f)(fl::forward<Args>(args)...))>
63{
64 return ((*fl::forward<T1>(t1)).*f)(fl::forward<Args>(args)...);
65}
66
67// 2a. Member data pointer with object reference
68template <typename F, typename T1>
76
77// 2b. Member data pointer with pointer-like object
78template <typename F, typename T1>
79auto invoke(F&& f, T1&& t1)
80 -> enable_if_t<detail::is_member_data_pointer<typename remove_reference<F>::type>::value &&
82 decltype((*fl::forward<T1>(t1)).*f)>
83{
84 return (*fl::forward<T1>(t1)).*f;
85}
86
87// 3. Regular callable (function pointer, lambda, functor)
88template <typename F, typename... Args>
96
97} // namespace fl
Definition ptr.h:114
auto invoke(F &&f, T1 &&t1, Args &&... args) -> 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:49
integral_constant< bool, false > false_type
Definition type_traits.h:30
typename enable_if< Condition, T >::type enable_if_t
Definition type_traits.h:59
integral_constant< bool, true > true_type
Definition type_traits.h:29
constexpr T && forward(typename remove_reference< T >::type &t) noexcept
IMPORTANT!
Definition crgb.h:20
corkscrew_args args
Definition old.h:150