FastLED 3.10.8
Loading...
Searching...
No Matches
tuple.h
Go to the documentation of this file.
1#pragma once
2
4#include "fl/stl/cstddef.h"
6#include "fl/stl/noexcept.h"
7
8namespace fl {
9
10// Forward declaration
11template<typename... Ts> struct tuple;
12
13// Empty-tuple specialization
14template<>
15struct tuple<> {};
16
17// Recursive tuple: head + tail
18template<typename Head, typename... Tail>
19struct tuple<Head, Tail...> {
20 Head head;
21 tuple<Tail...> tail;
22
23 tuple() = default;
24
25 tuple(const Head& h, const Tail&... t) FL_NO_EXCEPT
26 : head(h), tail(t...) {}
27
28 // Only enable rvalue constructor when Head is not a reference
29 // (prevents overload ambiguity when Head = const T&)
30 template<typename H = Head, typename... T,
31 typename = typename enable_if<!is_reference<H>::value>::type>
32 tuple(H&& h, T&&... t) FL_NO_EXCEPT
34};
35
36// tuple_size
37template<typename T>
38struct tuple_size;
39
40template<typename... Ts>
41struct tuple_size< tuple<Ts...> > {
42 // Use enum instead of static constexpr to avoid ODR-use issues in C++11
43 enum : size_t { value = sizeof...(Ts) };
46 constexpr operator value_type() const FL_NO_EXCEPT { return value; }
47 constexpr value_type operator()() const FL_NO_EXCEPT { return value; }
48};
49
50// tuple_element
51template<size_t I, typename Tuple>
52struct tuple_element;
53
54template<typename Head, typename... Tail>
55struct tuple_element<0, tuple<Head, Tail...>> {
56 using type = Head;
57};
58
59template<size_t I, typename Head, typename... Tail>
60struct tuple_element<I, tuple<Head, Tail...>>
61 : tuple_element<I-1, tuple<Tail...>> {};
62
63// get<I>(tuple)
64template<size_t I, typename Head, typename... Tail>
67 return t.head;
68}
69
70template<size_t I, typename Head, typename... Tail>
71typename enable_if<I != 0, typename tuple_element<I, tuple<Head, Tail...>>::type&>::type
73 return get<I-1>(t.tail);
74}
75
76// const overloads
77template<size_t I, typename Head, typename... Tail>
78typename enable_if<I == 0, const Head&>::type
80 return t.head;
81}
82
83template<size_t I, typename Head, typename... Tail>
84typename enable_if<I != 0, const typename tuple_element<I, tuple<Head, Tail...>>::type&>::type
86 return get<I-1>(t.tail);
87}
88
89// rvalue overloads
90template<size_t I, typename Head, typename... Tail>
91typename enable_if<I == 0, Head&&>::type
93 return fl::move(t.head);
94}
95
96template<size_t I, typename Head, typename... Tail>
97typename enable_if<I != 0, typename tuple_element<I, tuple<Head, Tail...>>::type&&>::type
99 return get<I-1>(fl::move(t.tail));
100}
101
102namespace adl_barrier { // see fl/stl/adl_barrier.h
103// make_tuple
104template<typename... Ts>
105tuple<typename fl::decay<Ts>::type...>
109} // namespace adl_barrier
110
111// C++11 requires out-of-class definitions for static constexpr members that are ODR-used
112// tuple_size<tuple<Ts...>>::value is inherited from integral_constant<size_t, sizeof...(Ts)>
113// which means we need to define integral_constant<T, v>::value
114// This is actually defined in type_traits.h where integral_constant is declared
115
116} // namespace fl
static const int H
Definition PerfDisc.ino:21
Keeps fl's generic templates out of argument-dependent lookup (ADL).
tuple< typename fl::decay< Ts >::type... > make_tuple(Ts &&... args) FL_NO_EXCEPT
Definition tuple.h:106
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
Definition s16x16x4.h:30
constexpr T && forward(typename remove_reference< T >::type &t) FL_NO_EXCEPT
Definition s16x16x4.h:236
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
fl::size size_t
Definition s16x16x4.h:223
pair_element< I, T1, T2 >::type & get(pair< T1, T2 > &p) FL_NO_EXCEPT
Definition pair.h:119
Base definition for an LED controller.
corkscrew_args args
Definition old.h:149
tuple< Tail... > tail
Definition tuple.h:21
tuple(H &&h, T &&... t) FL_NO_EXCEPT
Definition tuple.h:32
tuple(const Head &h, const Tail &... t) FL_NO_EXCEPT
Definition tuple.h:25
constexpr value_type operator()() const FL_NO_EXCEPT
Definition tuple.h:47