nlib
ParamTypeTypes.h
1 
2 /*--------------------------------------------------------------------------------*
3  Project: CrossRoad
4  Copyright (C)Nintendo All rights reserved.
5 
6  These coded instructions, statements, and computer programs contain proprietary
7  information of Nintendo and/or its licensed developers and are protected by
8  national and international copyright laws. They may not be disclosed to third
9  parties or copied or duplicated in any form, in whole or in part, without the
10  prior written consent of Nintendo.
11 
12  The content herein is highly confidential and should be handled accordingly.
13  *--------------------------------------------------------------------------------*/
14 
15 #pragma once
16 #ifndef INCLUDE_NN_NLIB_TESTING_PARAMTYPETYPES_H_
17 #define INCLUDE_NN_NLIB_TESTING_PARAMTYPETYPES_H_
18 
19 NLIB_NAMESPACE_BEGIN
20 namespace testing {
21 
22 #ifdef NLIB_CXX11_VARIADIC_TEMPLATES
23 struct Tp0 {};
24 template <class HEAD, class... TAIL>
25 struct Types {
26  typedef HEAD Head;
27  typedef Types<TAIL...> Tail;
28  typedef Types<HEAD, TAIL...> type;
29 };
30 template <class HEAD>
31 struct Types<HEAD> {
32  typedef HEAD Head;
33  typedef Tp0 Tail;
34  typedef Types<HEAD> type;
35 };
36 template <>
37 struct Types<Tp0> {
38  typedef Types<Tp0> type;
39 };
40 #else
41 struct None {};
42 struct Tp0 {};
43 template <class T1>
44 struct Tp1 {
45  typedef T1 Head;
46  typedef Tp0 Tail;
47 };
48 template <class T1, class T2>
49 struct Tp2 {
50  typedef T1 Head;
51  typedef Tp1<T2> Tail;
52 };
53 template <class T1, class T2, class T3>
54 struct Tp3 {
55  typedef T1 Head;
56  typedef Tp2<T2, T3> Tail;
57 };
58 template <class T1, class T2, class T3, class T4>
59 struct Tp4 {
60  typedef T1 Head;
61  typedef Tp3<T2, T3, T4> Tail;
62 };
63 template <class T1, class T2, class T3, class T4, class T5>
64 struct Tp5 {
65  typedef T1 Head;
66  typedef Tp4<T2, T3, T4, T5> Tail;
67 };
68 template <class T1, class T2, class T3, class T4, class T5, class T6>
69 struct Tp6 {
70  typedef T1 Head;
71  typedef Tp5<T2, T3, T4, T5, T6> Tail;
72 };
73 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>
74 struct Tp7 {
75  typedef T1 Head;
76  typedef Tp6<T2, T3, T4, T5, T6, T7> Tail;
77 };
78 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
79 struct Tp8 {
80  typedef T1 Head;
81  typedef Tp7<T2, T3, T4, T5, T6, T7, T8> Tail;
82 };
83 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
84 struct Tp9 {
85  typedef T1 Head;
86  typedef Tp8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
87 };
88 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
89  class T10> // NOLINT
90 struct Tp10 {
91  typedef T1 Head;
92  typedef Tp9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
93 };
94 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
95  class T10,
96  class T11> // NOLINT
97 struct Tp11 {
98  typedef T1 Head;
99  typedef Tp10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
100 };
101 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
102  class T10, class T11, class T12> // NOLINT
103 struct Tp12 {
104  typedef T1 Head;
105  typedef Tp11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
106 };
107 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
108  class T10, class T11, class T12, class T13> // NOLINT
109 struct Tp13 {
110  typedef T1 Head;
111  typedef Tp12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
112 };
113 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
114  class T10, class T11, class T12, class T13, class T14> // NOLINT
115 struct Tp14 {
116  typedef T1 Head;
117  typedef Tp13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
118 };
119 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
120  class T10, class T11, class T12, class T13, class T14, class T15> // NOLINT
121 struct Tp15 {
122  typedef T1 Head;
123  typedef Tp14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Tail;
124 };
125 
126 template <class T1 = None, class T2 = None, class T3 = None, class T4 = None, class T5 = None,
127  class T6 = None, class T7 = None, class T8 = None, class T9 = None, class T10 = None,
128  class T11 = None, class T12 = None, class T13 = None, class T14 = None, class T15 = None>
129 struct Types {
130  typedef Tp15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> type;
131 };
132 
133 template <>
134 struct Types<None, None, None, None, None, None, None, None, None, None, None, None, None, None,
135  None> { // NOLINT
136  typedef Tp0 type;
137 };
138 template <class T1>
139 struct Types<T1, None, None, None, None, None, None, None, None, None, None, None, None, None,
140  None> { // NOLINT
141  typedef Tp1<T1> type;
142 };
143 template <class T1, class T2>
144 struct Types<T1, T2, None, None, None, None, None, None, None, None, None, None, None, None,
145  None> { // NOLINT
146  typedef Tp2<T1, T2> type;
147 };
148 template <class T1, class T2, class T3>
149 struct Types<T1, T2, T3, None, None, None, None, None, None, None, None, None, None, None, None> {
150  typedef Tp3<T1, T2, T3> type;
151 };
152 template <class T1, class T2, class T3, class T4>
153 struct Types<T1, T2, T3, T4, None, None, None, None, None, None, None, None, None, None, None> {
154  typedef Tp4<T1, T2, T3, T4> type;
155 };
156 template <class T1, class T2, class T3, class T4, class T5>
157 struct Types<T1, T2, T3, T4, T5, None, None, None, None, None, None, None, None, None, None> {
158  typedef Tp5<T1, T2, T3, T4, T5> type;
159 };
160 template <class T1, class T2, class T3, class T4, class T5, class T6>
161 struct Types<T1, T2, T3, T4, T5, T6, None, None, None, None, None, None, None, None, None> {
162  typedef Tp6<T1, T2, T3, T4, T5, T6> type;
163 };
164 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>
165 struct Types<T1, T2, T3, T4, T5, T6, T7, None, None, None, None, None, None, None, None> {
166  typedef Tp7<T1, T2, T3, T4, T5, T6, T7> type;
167 };
168 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
169 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, None, None, None, None, None, None, None> {
170  typedef Tp8<T1, T2, T3, T4, T5, T6, T7, T8> type;
171 };
172 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
173 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, None, None, None, None, None, None> {
174  typedef Tp9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
175 };
176 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
177  class T10>
178 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, None, None, None, None, None> {
179  typedef Tp10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
180 };
181 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
182  class T10, class T11>
183 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, None, None, None, None> {
184  typedef Tp11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
185 };
186 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
187  class T10, class T11, class T12>
188 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, None, None, None> {
189  typedef Tp12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
190 };
191 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
192  class T10, class T11, class T12, class T13>
193 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, None, None> {
194  typedef Tp13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> type;
195 };
196 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
197  class T10, class T11, class T12, class T13, class T14>
198 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, None> {
199  typedef Tp14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> type;
200 };
201 #endif
202 
203 } // namespace testing
204 NLIB_NAMESPACE_END
205 
206 #endif // INCLUDE_NN_NLIB_TESTING_PARAMTYPETYPES_H_