1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | |
5 | // |
6 | // Used in template metaprogramming, type lists consist of a series of |
7 | // Scheme-like nodes that contain a Head type and a Tail type. The head |
8 | // type is usually a non-list type, but compound lists are possible. |
9 | // |
10 | // Type lists are always terminated with a tail type of mpl::null_type. |
11 | // |
12 | |
13 | #ifndef __type_list__ |
14 | #define __type_list__ |
15 | |
16 | namespace mpl // 'mpl' => 'meta-programming library' |
17 | { |
18 | // Used as terminator in type_lists. |
19 | class null_type {}; |
20 | |
21 | // The core type. See file comment for details. |
22 | template <class T, class U> |
23 | struct type_list |
24 | { |
25 | typedef T head; |
26 | typedef U tail; |
27 | }; |
28 | |
29 | template <class TList, size_t IDX> |
30 | struct type_at; |
31 | |
32 | template <class head, class tail, size_t IDX> |
33 | struct type_at<type_list<head, tail>, IDX> |
34 | { typedef typename type_at<tail, IDX-1>::type type; }; |
35 | |
36 | template <class head, class tail> |
37 | struct type_at<type_list<head, tail>, 0> |
38 | { typedef head type; }; |
39 | |
40 | // Helper struct to create a type_list chain from a list of arguments. |
41 | template |
42 | < |
43 | typename T1 = null_type, typename T2 = null_type, typename T3 = null_type, |
44 | typename T4 = null_type, typename T5 = null_type, typename T6 = null_type, |
45 | typename T7 = null_type, typename T8 = null_type, typename T9 = null_type, |
46 | typename T10 = null_type, typename T11 = null_type, typename T12 = null_type, |
47 | typename T13 = null_type, typename T14 = null_type, typename T15 = null_type, |
48 | typename T16 = null_type, typename T17 = null_type, typename T18 = null_type |
49 | > |
50 | struct make_type_list |
51 | { |
52 | private: |
53 | // recurse on the tail elements |
54 | typedef typename make_type_list<T2, T3, T4, T5, T6, T7, T8, T9, T10, |
55 | T11, T12, T13, T14, T15, T16, T17, T18>::type tail; |
56 | |
57 | public: |
58 | // combine head with computed tail |
59 | typedef type_list<T1, tail> type; |
60 | }; |
61 | |
62 | template<> |
63 | struct make_type_list |
64 | < |
65 | null_type, null_type, null_type, null_type, null_type, null_type, |
66 | null_type, null_type, null_type, null_type, null_type, null_type, |
67 | null_type, null_type, null_type, null_type, null_type, null_type |
68 | > |
69 | { |
70 | public: |
71 | typedef null_type type; |
72 | }; |
73 | } |
74 | |
75 | #endif // __type_list__ |
76 | |
77 | |