Skip to content
Flecs v4.1
entity_component_tuple.hpp
Go to the documentation of this file.
1/**
2 * @file addons/cpp/entity_component_tuple.hpp
3 * @brief Utilities to fetch components as tuples from entities.
4 */
5
6#pragma once
7
8/**
9 * @ingroup cpp_entities
10 * @{
11 */
12
13namespace flecs
14{
15
16 /** Builds tuple types for a given number of component types.
17 *
18 * @tparam size The number of components.
19 * @tparam Args The component types.
20 */
21 template<std::size_t size, typename... Args>
22 struct tuple_builder {};
23
24 /** Tuple of 2 elements. */
25 template<typename T, typename U>
26 struct tuple_2 {
27 T val1; /**< First element. */
28 U val2; /**< Second element. */
29 };
30
31 /** Tuple builder specialization for 2 elements. */
32 template<typename... Args>
33 struct tuple_builder<2, Args...> {
34 using type = tuple_2<Args&...>; /**< Reference tuple type. */
35 using type_ptr = tuple_2<Args*...>; /**< Pointer tuple type. */
36 using type_const = tuple_2<const Args&...>; /**< Const reference tuple type. */
37 using type_const_ptr = tuple_2<const Args*...>; /**< Const pointer tuple type. */
38 };
39
40 /** Tuple of 3 elements. */
41 template<typename T, typename U, typename V>
42 struct tuple_3 {
43 T val1; /**< First element. */
44 U val2; /**< Second element. */
45 V val3; /**< Third element. */
46 };
47
48 /** Tuple builder specialization for 3 elements. */
49 template<typename... Args>
50 struct tuple_builder<3, Args...> {
51 using type = tuple_3<Args&...>; /**< Reference tuple type. */
52 using type_ptr = tuple_3<Args*...>; /**< Pointer tuple type. */
53 using type_const = tuple_3<const Args&...>; /**< Const reference tuple type. */
54 using type_const_ptr = tuple_3<const Args*...>; /**< Const pointer tuple type. */
55 };
56
57 /** Tuple of 4 elements. */
58 template<typename T, typename U, typename V, typename W>
59 struct tuple_4 {
60 T val1; /**< First element. */
61 U val2; /**< Second element. */
62 V val3; /**< Third element. */
63 W val4; /**< Fourth element. */
64 };
65
66 /** Tuple builder specialization for 4 elements. */
67 template<typename... Args>
68 struct tuple_builder<4, Args...> {
69 using type = tuple_4<Args&...>; /**< Reference tuple type. */
70 using type_ptr = tuple_4<Args*...>; /**< Pointer tuple type. */
71 using type_const = tuple_4<const Args&...>; /**< Const reference tuple type. */
72 using type_const_ptr = tuple_4<const Args*...>; /**< Const pointer tuple type. */
73 };
74
75 /** Tuple of 5 elements. */
76 template<typename T, typename U, typename V, typename W, typename X>
77 struct tuple_5 {
78 T val1; /**< First element. */
79 U val2; /**< Second element. */
80 V val3; /**< Third element. */
81 W val4; /**< Fourth element. */
82 X val5; /**< Fifth element. */
83 };
84
85 /** Tuple builder specialization for 5 elements. */
86 template<typename... Args>
87 struct tuple_builder<5, Args...> {
88 using type = tuple_5<Args&...>; /**< Reference tuple type. */
89 using type_ptr = tuple_5<Args*...>; /**< Pointer tuple type. */
90 using type_const = tuple_5<const Args&...>; /**< Const reference tuple type. */
91 using type_const_ptr = tuple_5<const Args*...>; /**< Const pointer tuple type. */
92 };
93
94 /** Tuple of 6 elements. */
95 template<typename T, typename U, typename V, typename W, typename X, typename Y>
96 struct tuple_6 {
97 T val1; /**< First element. */
98 U val2; /**< Second element. */
99 V val3; /**< Third element. */
100 W val4; /**< Fourth element. */
101 X val5; /**< Fifth element. */
102 Y val6; /**< Sixth element. */
103 };
104
105 /** Tuple builder specialization for 6 elements. */
106 template<typename... Args>
107 struct tuple_builder<6, Args...> {
108 using type = tuple_6<Args&...>; /**< Reference tuple type. */
109 using type_ptr = tuple_6<Args*...>; /**< Pointer tuple type. */
110 using type_const = tuple_6<const Args&...>; /**< Const reference tuple type. */
111 using type_const_ptr = tuple_6<const Args*...>; /**< Const pointer tuple type. */
112 };
113
114 /** Tuple of 7 elements. */
115 template<typename T, typename U, typename V, typename W, typename X, typename Y, typename Z>
116 struct tuple_7 {
117 T val1; /**< First element. */
118 U val2; /**< Second element. */
119 V val3; /**< Third element. */
120 W val4; /**< Fourth element. */
121 X val5; /**< Fifth element. */
122 Y val6; /**< Sixth element. */
123 Z val7; /**< Seventh element. */
124 };
125
126 /** Tuple builder specialization for 7 elements. */
127 template<typename... Args>
128 struct tuple_builder<7, Args...> {
129 using type = tuple_7<Args&...>; /**< Reference tuple type. */
130 using type_ptr = tuple_7<Args*...>; /**< Pointer tuple type. */
131 using type_const = tuple_7<const Args&...>; /**< Const reference tuple type. */
132 using type_const_ptr = tuple_7<const Args*...>; /**< Const pointer tuple type. */
133 };
134
135 /** Tuple of 8 elements. */
136 template<typename T, typename U, typename V, typename W, typename X, typename Y, typename Z, typename A>
137 struct tuple_8 {
138 T val1; /**< First element. */
139 U val2; /**< Second element. */
140 V val3; /**< Third element. */
141 W val4; /**< Fourth element. */
142 X val5; /**< Fifth element. */
143 Y val6; /**< Sixth element. */
144 Z val7; /**< Seventh element. */
145 A val8; /**< Eighth element. */
146 };
147
148 /** Tuple builder specialization for 8 elements. */
149 template<typename... Args>
150 struct tuple_builder<8, Args...> {
151 using type = tuple_8<Args&...>; /**< Reference tuple type. */
152 using type_ptr = tuple_8<Args*...>; /**< Pointer tuple type. */
153 using type_const = tuple_8<const Args&...>; /**< Const reference tuple type. */
154 using type_const_ptr = tuple_8<const Args*...>; /**< Const pointer tuple type. */
155 };
156
157}
158
159/** @} */
Tuple of 2 elements.
Tuple of 3 elements.
Tuple of 4 elements.
Tuple of 5 elements.
Tuple of 6 elements.
Tuple of 7 elements.
Tuple of 8 elements.
tuple_2< Args *... > type_ptr
Pointer tuple type.
tuple_2< Args &... > type
Reference tuple type.
tuple_2< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_2< const Args &... > type_const
Const reference tuple type.
tuple_3< Args &... > type
Reference tuple type.
tuple_3< Args *... > type_ptr
Pointer tuple type.
tuple_3< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_3< const Args &... > type_const
Const reference tuple type.
tuple_4< const Args &... > type_const
Const reference tuple type.
tuple_4< Args *... > type_ptr
Pointer tuple type.
tuple_4< Args &... > type
Reference tuple type.
tuple_4< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_5< const Args &... > type_const
Const reference tuple type.
tuple_5< Args &... > type
Reference tuple type.
tuple_5< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_5< Args *... > type_ptr
Pointer tuple type.
tuple_6< Args &... > type
Reference tuple type.
tuple_6< Args *... > type_ptr
Pointer tuple type.
tuple_6< const Args &... > type_const
Const reference tuple type.
tuple_6< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_7< const Args &... > type_const
Const reference tuple type.
tuple_7< Args *... > type_ptr
Pointer tuple type.
tuple_7< Args &... > type
Reference tuple type.
tuple_7< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_8< Args &... > type
Reference tuple type.
tuple_8< const Args *... > type_const_ptr
Const pointer tuple type.
tuple_8< Args *... > type_ptr
Pointer tuple type.
tuple_8< const Args &... > type_const
Const reference tuple type.
Builds tuple types for a given number of component types.