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