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
16namespace 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