@@ -47,21 +47,29 @@ namespace ctgl {
47
47
template <typename ... Ts>
48
48
constexpr bool operator ==(List<Ts...>, List<Ts...>) noexcept ;
49
49
50
- // Adds an element to the front of a List.
50
+ // Prepends the given element to the provided List.
51
51
template <typename T, typename ... Ts>
52
52
constexpr auto operator +(T, List<Ts...>) noexcept ;
53
53
54
- // Adds an element to the back of a List.
54
+ // Appends the given element to the provided List.
55
55
template <typename ... Ts, typename T>
56
56
constexpr auto operator +(List<Ts...>, T) noexcept ;
57
57
58
58
// Concatenates two Lists together.
59
59
template <typename ... Ts, typename ... Us>
60
60
constexpr auto operator +(List<Ts...>, List<Us...>) noexcept ;
61
61
62
- // Adds the given element to each List in the provided List of Lists.
62
+ // Prepends the given element to each List in the provided List of Lists.
63
63
template <typename T, typename ... Ts>
64
64
constexpr auto operator *(T, List<Ts...>) noexcept ;
65
+
66
+ // Appends the given element to each List in the provided List of Lists.
67
+ template <typename ... Ts, typename T>
68
+ constexpr auto operator *(List<Ts...>, T) noexcept ;
69
+
70
+ // Takes the Cartesian product of the given Lists of Lists.
71
+ template <typename ... Ts, typename ... Us>
72
+ constexpr auto operator *(List<Ts...>, List<Us...>) noexcept ;
65
73
}
66
74
67
75
// -------------------------------------------------------------------------
@@ -173,15 +181,37 @@ namespace ctgl {
173
181
return List<Ts..., Us...>{};
174
182
}
175
183
176
- template <typename T>
177
- constexpr auto operator *(T, List<>) noexcept {
184
+ template <typename T, typename ... Ts>
185
+ constexpr auto operator *(T, List<Ts...>) noexcept {
186
+ return List<List<T>>{} * List<Ts...>{};
187
+ }
188
+
189
+ template <typename ... Ts, typename T>
190
+ constexpr auto operator *(List<Ts...>, T) noexcept {
191
+ return List<Ts...>{} * List<List<T>>{};
192
+ }
193
+
194
+ template <typename ... T>
195
+ constexpr auto distribute (List<T...>, List<>) noexcept {
178
196
return List<>{};
179
197
}
180
198
181
- template <typename T, typename ... Us, typename ... Ts>
182
- constexpr auto operator *(T, List<List<Us...>, Ts...>) noexcept {
183
- constexpr auto head = List<List<T, Us...>>{};
184
- constexpr auto tail = T{} * List<Ts...>{};
199
+ template <typename ... T, typename ... U, typename ... Us>
200
+ constexpr auto distribute (List<T...>, List<List<U...>, Us...>) noexcept {
201
+ constexpr auto head = List<List<T..., U...>>{};
202
+ constexpr auto tail = distribute (List<T...>{}, List<Us...>{});
203
+ return head + tail;
204
+ }
205
+
206
+ template <typename ... Us>
207
+ constexpr auto operator *(List<>, List<Us...>) noexcept {
208
+ return List<>{};
209
+ }
210
+
211
+ template <typename ... T, typename ... Ts, typename ... Us>
212
+ constexpr auto operator *(List<List<T...>, Ts...>, List<Us...>) noexcept {
213
+ constexpr auto head = distribute (List<T...>{}, List<Us...>{});
214
+ constexpr auto tail = List<Ts...>{} * List<Us...>{};
185
215
return head + tail;
186
216
}
187
217
0 commit comments