Embedded Template Library 1.0
type_select.h
1/******************************************************************************
2The MIT License(MIT)
3
4Embedded Template Library.
5https://github.com/ETLCPP/etl
6https://www.etlcpp.com
7
8Copyright(c) 2018 John Wellbelove
9
10Permission is hereby granted, free of charge, to any person obtaining a copy
11of this software and associated documentation files(the "Software"), to deal
12in the Software without restriction, including without limitation the rights
13to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
14copies of the Software, and to permit persons to whom the Software is
15furnished to do so, subject to the following conditions :
16
17The above copyright notice and this permission notice shall be included in all
18copies or substantial portions of the Software.
19
20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
23AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26SOFTWARE.
27******************************************************************************/
28
29#ifndef ETL_TYPE_SELECT_INCLUDED
30#define ETL_TYPE_SELECT_INCLUDED
31
32#include "platform.h"
33#include "static_assert.h"
34#include "type_traits.h"
35#include "null_type.h"
36
37#if 0
38#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
39#endif
40
41//***************************************************************************
42// THIS FILE HAS BEEN AUTO GENERATED. DO NOT EDIT THIS FILE.
43//***************************************************************************
44
45namespace etl
46{
47#if ETL_USING_CPP11 && !defined(ETL_TYPE_SELECT_FORCE_CPP03_IMPLEMENTATION)
48 //***************************************************************************
49 // Variadic version.
50 //***************************************************************************
51 template <typename... TTypes>
52 struct type_select
53 {
54 private:
55
56 //***********************************
57 template <size_t ID, size_t N, typename T1, typename... TRest>
58 struct type_select_helper
59 {
60 using type = typename etl::conditional<ID == N,
61 T1,
62 typename type_select_helper<ID, N + 1, TRest...>::type>::type;
63 };
64
65 //***********************************
66 template <size_t ID, size_t N, typename T1>
67 struct type_select_helper<ID, N, T1>
68 {
69 using type = T1;
70 };
71
72 public:
73
74 template <size_t ID>
75 struct select
76 {
77 static_assert(ID < sizeof...(TTypes), "Illegal type_select::select index");
78
79 using type = typename type_select_helper<ID, 0, TTypes...>::type;
80 };
81
82 template <size_t ID>
83 using select_t = typename select<ID>::type;
84 };
85
86 //***************************************************************************
87 // Select type alias
88 //***************************************************************************
89 template <size_t N, typename... TTypes>
90 using type_select_t = typename etl::type_select<TTypes...>:: template select_t<N>;
91
92#else
93
94 //***************************************************************************
95 // For 16 types.
96 //***************************************************************************
97 template <typename T0,
98 typename T1 = void,
99 typename T2 = void,
100 typename T3 = void,
101 typename T4 = void,
102 typename T5 = void,
103 typename T6 = void,
104 typename T7 = void,
105 typename T8 = void,
106 typename T9 = void,
107 typename T10 = void,
108 typename T11 = void,
109 typename T12 = void,
110 typename T13 = void,
111 typename T14 = void,
112 typename T15 = void>
114 {
115 public:
116
117 template <size_t ID>
118 struct select
119 {
120 typedef typename etl::conditional<ID == 0, T0,
121 typename etl::conditional<ID == 1, T1,
122 typename etl::conditional<ID == 2, T2,
123 typename etl::conditional<ID == 3, T3,
124 typename etl::conditional<ID == 4, T4,
125 typename etl::conditional<ID == 5, T5,
126 typename etl::conditional<ID == 6, T6,
127 typename etl::conditional<ID == 7, T7,
128 typename etl::conditional<ID == 8, T8,
129 typename etl::conditional<ID == 9, T9,
130 typename etl::conditional<ID == 10, T10,
131 typename etl::conditional<ID == 11, T11,
132 typename etl::conditional<ID == 12, T12,
133 typename etl::conditional<ID == 13, T13,
134 typename etl::conditional<ID == 14, T14,
135 typename etl::conditional<ID == 15, T15,
137 ::type>::type>::type>::type>::type>::type>::type>::type>
138 ::type>::type>::type>::type>::type>::type>::type>::type type;
139
140 ETL_STATIC_ASSERT(ID < 16, "Invalid ID");
141 };
142 };
143
144 //***************************************************************************
145 // For 15 types.
146 //***************************************************************************
147 template <typename T0,
148 typename T1,
149 typename T2,
150 typename T3,
151 typename T4,
152 typename T5,
153 typename T6,
154 typename T7,
155 typename T8,
156 typename T9,
157 typename T10,
158 typename T11,
159 typename T12,
160 typename T13,
161 typename T14>
162 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
163 {
164 public:
165 template <size_t ID>
166 struct select
167 {
168 typedef typename etl::conditional<ID == 0, T0,
169 typename etl::conditional<ID == 1, T1,
170 typename etl::conditional<ID == 2, T2,
171 typename etl::conditional<ID == 3, T3,
172 typename etl::conditional<ID == 4, T4,
173 typename etl::conditional<ID == 5, T5,
174 typename etl::conditional<ID == 6, T6,
175 typename etl::conditional<ID == 7, T7,
176 typename etl::conditional<ID == 8, T8,
177 typename etl::conditional<ID == 9, T9,
178 typename etl::conditional<ID == 10, T10,
179 typename etl::conditional<ID == 11, T11,
180 typename etl::conditional<ID == 12, T12,
181 typename etl::conditional<ID == 13, T13,
182 typename etl::conditional<ID == 14, T14,
184 ::type>::type>::type>::type>::type>::type>::type>::type>
185 ::type>::type>::type>::type>::type>::type>::type type;
186
187 ETL_STATIC_ASSERT(ID < 15, "Invalid ID");
188 };
189 };
190
191 //***************************************************************************
192 // For 14 types.
193 //***************************************************************************
194 template <typename T0,
195 typename T1,
196 typename T2,
197 typename T3,
198 typename T4,
199 typename T5,
200 typename T6,
201 typename T7,
202 typename T8,
203 typename T9,
204 typename T10,
205 typename T11,
206 typename T12,
207 typename T13>
208 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
209 {
210 public:
211 template <size_t ID>
212 struct select
213 {
214 typedef typename etl::conditional<ID == 0, T0,
215 typename etl::conditional<ID == 1, T1,
216 typename etl::conditional<ID == 2, T2,
217 typename etl::conditional<ID == 3, T3,
218 typename etl::conditional<ID == 4, T4,
219 typename etl::conditional<ID == 5, T5,
220 typename etl::conditional<ID == 6, T6,
221 typename etl::conditional<ID == 7, T7,
222 typename etl::conditional<ID == 8, T8,
223 typename etl::conditional<ID == 9, T9,
224 typename etl::conditional<ID == 10, T10,
225 typename etl::conditional<ID == 11, T11,
226 typename etl::conditional<ID == 12, T12,
227 typename etl::conditional<ID == 13, T13,
229 ::type>::type>::type>::type>::type>::type>::type>::type>
230 ::type>::type>::type>::type>::type>::type type;
231
232 ETL_STATIC_ASSERT(ID < 14, "Invalid ID");
233 };
234 };
235
236 //***************************************************************************
237 // For 13 types.
238 //***************************************************************************
239 template <typename T0,
240 typename T1,
241 typename T2,
242 typename T3,
243 typename T4,
244 typename T5,
245 typename T6,
246 typename T7,
247 typename T8,
248 typename T9,
249 typename T10,
250 typename T11,
251 typename T12>
252 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
253 {
254 public:
255 template <size_t ID>
256 struct select
257 {
258 typedef typename etl::conditional<ID == 0, T0,
259 typename etl::conditional<ID == 1, T1,
260 typename etl::conditional<ID == 2, T2,
261 typename etl::conditional<ID == 3, T3,
262 typename etl::conditional<ID == 4, T4,
263 typename etl::conditional<ID == 5, T5,
264 typename etl::conditional<ID == 6, T6,
265 typename etl::conditional<ID == 7, T7,
266 typename etl::conditional<ID == 8, T8,
267 typename etl::conditional<ID == 9, T9,
268 typename etl::conditional<ID == 10, T10,
269 typename etl::conditional<ID == 11, T11,
270 typename etl::conditional<ID == 12, T12,
272 ::type>::type>::type>::type>::type>::type>::type>::type>
273 ::type>::type>::type>::type>::type type;
274
275 ETL_STATIC_ASSERT(ID < 13, "Invalid ID");
276 };
277 };
278
279 //***************************************************************************
280 // For 12 types.
281 //***************************************************************************
282 template <typename T0,
283 typename T1,
284 typename T2,
285 typename T3,
286 typename T4,
287 typename T5,
288 typename T6,
289 typename T7,
290 typename T8,
291 typename T9,
292 typename T10,
293 typename T11>
294 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
295 {
296 public:
297 template <size_t ID>
298 struct select
299 {
300 typedef typename etl::conditional<ID == 0, T0,
301 typename etl::conditional<ID == 1, T1,
302 typename etl::conditional<ID == 2, T2,
303 typename etl::conditional<ID == 3, T3,
304 typename etl::conditional<ID == 4, T4,
305 typename etl::conditional<ID == 5, T5,
306 typename etl::conditional<ID == 6, T6,
307 typename etl::conditional<ID == 7, T7,
308 typename etl::conditional<ID == 8, T8,
309 typename etl::conditional<ID == 9, T9,
310 typename etl::conditional<ID == 10, T10,
311 typename etl::conditional<ID == 11, T11,
313 ::type>::type>::type>::type>::type>::type>::type>::type>
314 ::type>::type>::type>::type type;
315
316 ETL_STATIC_ASSERT(ID < 12, "Invalid ID");
317 };
318 };
319
320 //***************************************************************************
321 // For 11 types.
322 //***************************************************************************
323 template <typename T0,
324 typename T1,
325 typename T2,
326 typename T3,
327 typename T4,
328 typename T5,
329 typename T6,
330 typename T7,
331 typename T8,
332 typename T9,
333 typename T10>
334 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
335 {
336 public:
337 template <size_t ID>
338 struct select
339 {
340 typedef typename etl::conditional<ID == 0, T0,
341 typename etl::conditional<ID == 1, T1,
342 typename etl::conditional<ID == 2, T2,
343 typename etl::conditional<ID == 3, T3,
344 typename etl::conditional<ID == 4, T4,
345 typename etl::conditional<ID == 5, T5,
346 typename etl::conditional<ID == 6, T6,
347 typename etl::conditional<ID == 7, T7,
348 typename etl::conditional<ID == 8, T8,
349 typename etl::conditional<ID == 9, T9,
350 typename etl::conditional<ID == 10, T10,
352 ::type>::type>::type>::type>::type>::type>::type>::type>
353 ::type>::type>::type type;
354
355 ETL_STATIC_ASSERT(ID < 11, "Invalid ID");
356 };
357 };
358
359 //***************************************************************************
360 // For 10 types.
361 //***************************************************************************
362 template <typename T0,
363 typename T1,
364 typename T2,
365 typename T3,
366 typename T4,
367 typename T5,
368 typename T6,
369 typename T7,
370 typename T8,
371 typename T9>
372 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>
373 {
374 public:
375 template <size_t ID>
376 struct select
377 {
378 typedef typename etl::conditional<ID == 0, T0,
379 typename etl::conditional<ID == 1, T1,
380 typename etl::conditional<ID == 2, T2,
381 typename etl::conditional<ID == 3, T3,
382 typename etl::conditional<ID == 4, T4,
383 typename etl::conditional<ID == 5, T5,
384 typename etl::conditional<ID == 6, T6,
385 typename etl::conditional<ID == 7, T7,
386 typename etl::conditional<ID == 8, T8,
387 typename etl::conditional<ID == 9, T9,
389 ::type>::type>::type>::type>::type>::type>::type>::type>
390 ::type>::type type;
391
392 ETL_STATIC_ASSERT(ID < 10, "Invalid ID");
393 };
394 };
395
396 //***************************************************************************
397 // For 9 types.
398 //***************************************************************************
399 template <typename T0,
400 typename T1,
401 typename T2,
402 typename T3,
403 typename T4,
404 typename T5,
405 typename T6,
406 typename T7,
407 typename T8>
408 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7, T8>
409 {
410 public:
411 template <size_t ID>
412 struct select
413 {
414 typedef typename etl::conditional<ID == 0, T0,
415 typename etl::conditional<ID == 1, T1,
416 typename etl::conditional<ID == 2, T2,
417 typename etl::conditional<ID == 3, T3,
418 typename etl::conditional<ID == 4, T4,
419 typename etl::conditional<ID == 5, T5,
420 typename etl::conditional<ID == 6, T6,
421 typename etl::conditional<ID == 7, T7,
422 typename etl::conditional<ID == 8, T8,
424 ::type>::type>::type>::type>::type>::type>::type>::type>
425 ::type type;
426
427 ETL_STATIC_ASSERT(ID < 9, "Invalid ID");
428 };
429 };
430
431 //***************************************************************************
432 // For 8 types.
433 //***************************************************************************
434 template <typename T0,
435 typename T1,
436 typename T2,
437 typename T3,
438 typename T4,
439 typename T5,
440 typename T6,
441 typename T7>
442 struct type_select<T0, T1, T2, T3, T4, T5, T6, T7>
443 {
444 public:
445 template <size_t ID>
446 struct select
447 {
448 typedef typename etl::conditional<ID == 0, T0,
449 typename etl::conditional<ID == 1, T1,
450 typename etl::conditional<ID == 2, T2,
451 typename etl::conditional<ID == 3, T3,
452 typename etl::conditional<ID == 4, T4,
453 typename etl::conditional<ID == 5, T5,
454 typename etl::conditional<ID == 6, T6,
455 typename etl::conditional<ID == 7, T7,
457 ::type>::type>::type>::type>::type>::type>::type>::type type;
458
459 ETL_STATIC_ASSERT(ID < 8, "Invalid ID");
460 };
461 };
462
463 //***************************************************************************
464 // For 7 types.
465 //***************************************************************************
466 template <typename T0,
467 typename T1,
468 typename T2,
469 typename T3,
470 typename T4,
471 typename T5,
472 typename T6>
473 struct type_select<T0, T1, T2, T3, T4, T5, T6>
474 {
475 public:
476 template <size_t ID>
477 struct select
478 {
479 typedef typename etl::conditional<ID == 0, T0,
480 typename etl::conditional<ID == 1, T1,
481 typename etl::conditional<ID == 2, T2,
482 typename etl::conditional<ID == 3, T3,
483 typename etl::conditional<ID == 4, T4,
484 typename etl::conditional<ID == 5, T5,
485 typename etl::conditional<ID == 6, T6,
487 ::type>::type>::type>::type>::type>::type>::type type;
488
489 ETL_STATIC_ASSERT(ID < 7, "Invalid ID");
490 };
491 };
492
493 //***************************************************************************
494 // For 6 types.
495 //***************************************************************************
496 template <typename T0,
497 typename T1,
498 typename T2,
499 typename T3,
500 typename T4,
501 typename T5>
502 struct type_select<T0, T1, T2, T3, T4, T5>
503 {
504 public:
505 template <size_t ID>
506 struct select
507 {
508 typedef typename etl::conditional<ID == 0, T0,
509 typename etl::conditional<ID == 1, T1,
510 typename etl::conditional<ID == 2, T2,
511 typename etl::conditional<ID == 3, T3,
512 typename etl::conditional<ID == 4, T4,
513 typename etl::conditional<ID == 5, T5,
515 ::type>::type>::type>::type>::type>::type type;
516
517 ETL_STATIC_ASSERT(ID < 6, "Invalid ID");
518 };
519 };
520
521 //***************************************************************************
522 // For 5 types.
523 //***************************************************************************
524 template <typename T0,
525 typename T1,
526 typename T2,
527 typename T3,
528 typename T4>
529 struct type_select<T0, T1, T2, T3, T4>
530 {
531 public:
532 template <size_t ID>
533 struct select
534 {
535 typedef typename etl::conditional<ID == 0, T0,
536 typename etl::conditional<ID == 1, T1,
537 typename etl::conditional<ID == 2, T2,
538 typename etl::conditional<ID == 3, T3,
539 typename etl::conditional<ID == 4, T4,
541 ::type>::type>::type>::type>::type type;
542
543 ETL_STATIC_ASSERT(ID < 5, "Invalid ID");
544 };
545 };
546
547 //***************************************************************************
548 // For 4 types.
549 //***************************************************************************
550 template <typename T0,
551 typename T1,
552 typename T2,
553 typename T3>
554 struct type_select<T0, T1, T2, T3>
555 {
556 public:
557 template <size_t ID>
558 struct select
559 {
560 typedef typename etl::conditional<ID == 0, T0,
561 typename etl::conditional<ID == 1, T1,
562 typename etl::conditional<ID == 2, T2,
563 typename etl::conditional<ID == 3, T3,
565 ::type>::type>::type>::type type;
566
567 ETL_STATIC_ASSERT(ID < 4, "Invalid ID");
568 };
569 };
570
571 //***************************************************************************
572 // For 3 types.
573 //***************************************************************************
574 template <typename T0,
575 typename T1,
576 typename T2>
577 struct type_select<T0, T1, T2>
578 {
579 public:
580 template <size_t ID>
581 struct select
582 {
583 typedef typename etl::conditional<ID == 0, T0,
584 typename etl::conditional<ID == 1, T1,
585 typename etl::conditional<ID == 2, T2,
587 ::type>::type>::type type;
588
589 ETL_STATIC_ASSERT(ID < 3, "Invalid ID");
590 };
591 };
592
593 //***************************************************************************
594 // For 2 types.
595 //***************************************************************************
596 template <typename T0,
597 typename T1>
598 struct type_select<T0, T1>
599 {
600 public:
601 template <size_t ID>
602 struct select
603 {
604 typedef typename etl::conditional<ID == 0, T0,
605 typename etl::conditional<ID == 1, T1,
607 ::type>::type type;
608
609 ETL_STATIC_ASSERT(ID < 2, "Invalid ID");
610 };
611 };
612
613 //***************************************************************************
614 // For 1 types.
615 //***************************************************************************
616 template <typename T0>
617 struct type_select<T0>
618 {
619 public:
620 template <size_t ID>
621 struct select
622 {
623 typedef typename etl::conditional<ID == 0, T0,
625 ::type type;
626
627 ETL_STATIC_ASSERT(ID < 1, "Invalid ID");
628 };
629 };
630#endif
631}
632
633#endif
Definition: constant.h:45
Definition: null_type.h:40
conditional
Definition: type_traits_generator.h:1160
bitset_ext
Definition: absolute.h:38
Definition: type_select.h:119
Definition: type_select.h:114