FastLED 3.9.15
Loading...
Searching...
No Matches
tuple.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/cstddef.h"
4#include "fl/utility.h"
5#include "fl/type_traits.h"
6
7namespace fl {
8
9// Forward declaration
10template<typename... Ts> struct tuple;
11
12// Empty-tuple specialization
13template<>
14struct tuple<> {};
15
16// Recursive tuple: head + tail
17template<typename Head, typename... Tail>
18struct tuple<Head, Tail...> {
19 Head head;
20 tuple<Tail...> tail;
21
22 tuple() = default;
23
24 tuple(const Head& h, const Tail&... t)
25 : head(h), tail(t...) {}
26
27 tuple(Head&& h, Tail&&... t)
28 : head(fl::move(h)), tail(fl::forward<Tail>(t)...) {}
29};
30
31// tuple_size
32template<typename T>
33struct tuple_size;
34
35template<typename... Ts>
36struct tuple_size< tuple<Ts...> > : integral_constant<size_t, sizeof...(Ts)> {};
37
38// tuple_element
39template<size_t I, typename Tuple>
40struct tuple_element;
41
42template<typename Head, typename... Tail>
43struct tuple_element<0, tuple<Head, Tail...>> {
44 using type = Head;
45};
46
47template<size_t I, typename Head, typename... Tail>
48struct tuple_element<I, tuple<Head, Tail...>>
49 : tuple_element<I-1, tuple<Tail...>> {};
50
51// get<I>(tuple)
52template<size_t I, typename Head, typename... Tail>
55 return t.head;
56}
57
58template<size_t I, typename Head, typename... Tail>
59typename enable_if<I != 0, typename tuple_element<I, tuple<Head, Tail...>>::type&>::type
61 return get<I-1>(t.tail);
62}
63
64// const overloads
65template<size_t I, typename Head, typename... Tail>
66typename enable_if<I == 0, const Head&>::type
68 return t.head;
69}
70
71template<size_t I, typename Head, typename... Tail>
72typename enable_if<I != 0, const typename tuple_element<I, tuple<Head, Tail...>>::type&>::type
74 return get<I-1>(t.tail);
75}
76
77// rvalue overloads
78template<size_t I, typename Head, typename... Tail>
79typename enable_if<I == 0, Head&&>::type
81 return fl::move(t.head);
82}
83
84template<size_t I, typename Head, typename... Tail>
85typename enable_if<I != 0, typename tuple_element<I, tuple<Head, Tail...>>::type&&>::type
87 return get<I-1>(fl::move(t.tail));
88}
89
90// make_tuple
91template<typename... Ts>
92tuple<typename fl::decay<Ts>::type...>
96
97} // namespace fl
static uint32_t t
Definition Luminova.h:54
constexpr remove_reference< T >::type && move(T &&t) noexcept
Definition move.h:27
tuple< typename fl::decay< Ts >::type... > make_tuple(Ts &&... args)
Definition tuple.h:93
pair_element< I, T1, T2 >::type & get(pair< T1, T2 > &p) noexcept
Definition pair.h:113
constexpr T && forward(typename remove_reference< T >::type &t) noexcept
IMPORTANT!
Definition crgb.h:20
corkscrew_args args
Definition old.h:150
tuple< Tail... > tail
Definition tuple.h:20
tuple(const Head &h, const Tail &... t)
Definition tuple.h:24
tuple(Head &&h, Tail &&... t)
Definition tuple.h:27