PageRenderTime 41ms CodeModel.GetById 6ms RepoModel.GetById 0ms app.codeStats 1ms

/thirdparty/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h

http://github.com/tomahawk-player/tomahawk
C++ Header | 1248 lines | 1105 code | 70 blank | 73 comment | 2 complexity | 8575e073367408b27c5d3b8ece3d8aba MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, GPL-3.0, GPL-2.0
  1. // This file was GENERATED by command:
  2. // pump.py gtest-type-util.h.pump
  3. // DO NOT EDIT BY HAND!!!
  4. // Copyright 2008 Google Inc.
  5. // All Rights Reserved.
  6. //
  7. // Redistribution and use in source and binary forms, with or without
  8. // modification, are permitted provided that the following conditions are
  9. // met:
  10. //
  11. // * Redistributions of source code must retain the above copyright
  12. // notice, this list of conditions and the following disclaimer.
  13. // * Redistributions in binary form must reproduce the above
  14. // copyright notice, this list of conditions and the following disclaimer
  15. // in the documentation and/or other materials provided with the
  16. // distribution.
  17. // * Neither the name of Google Inc. nor the names of its
  18. // contributors may be used to endorse or promote products derived from
  19. // this software without specific prior written permission.
  20. //
  21. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  24. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  25. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  26. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  27. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  28. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  29. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  30. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  31. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. //
  33. // Author: wan@google.com (Zhanyong Wan)
  34. // Type utilities needed for implementing typed and type-parameterized
  35. // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
  36. //
  37. // Currently we support at most 50 types in a list, and at most 50
  38. // type-parameterized tests in one type-parameterized test case.
  39. // Please contact googletestframework@googlegroups.com if you need
  40. // more.
  41. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
  42. #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
  43. #include <gtest/internal/gtest-port.h>
  44. #include <gtest/internal/gtest-string.h>
  45. #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
  46. // #ifdef __GNUC__ is too general here. It is possible to use gcc without using
  47. // libstdc++ (which is where cxxabi.h comes from).
  48. #ifdef __GLIBCXX__
  49. #include <cxxabi.h>
  50. #endif // __GLIBCXX__
  51. namespace testing {
  52. namespace internal {
  53. // AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
  54. // type. This can be used as a compile-time assertion to ensure that
  55. // two types are equal.
  56. template <typename T1, typename T2>
  57. struct AssertTypeEq;
  58. template <typename T>
  59. struct AssertTypeEq<T, T> {
  60. typedef bool type;
  61. };
  62. // GetTypeName<T>() returns a human-readable name of type T.
  63. template <typename T>
  64. String GetTypeName() {
  65. #if GTEST_HAS_RTTI
  66. const char* const name = typeid(T).name();
  67. #ifdef __GLIBCXX__
  68. int status = 0;
  69. // gcc's implementation of typeid(T).name() mangles the type name,
  70. // so we have to demangle it.
  71. char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status);
  72. const String name_str(status == 0 ? readable_name : name);
  73. free(readable_name);
  74. return name_str;
  75. #else
  76. return name;
  77. #endif // __GLIBCXX__
  78. #else
  79. return "<type>";
  80. #endif // GTEST_HAS_RTTI
  81. }
  82. // A unique type used as the default value for the arguments of class
  83. // template Types. This allows us to simulate variadic templates
  84. // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
  85. // support directly.
  86. struct None {};
  87. // The following family of struct and struct templates are used to
  88. // represent type lists. In particular, TypesN<T1, T2, ..., TN>
  89. // represents a type list with N types (T1, T2, ..., and TN) in it.
  90. // Except for Types0, every struct in the family has two member types:
  91. // Head for the first type in the list, and Tail for the rest of the
  92. // list.
  93. // The empty type list.
  94. struct Types0 {};
  95. // Type lists of length 1, 2, 3, and so on.
  96. template <typename T1>
  97. struct Types1 {
  98. typedef T1 Head;
  99. typedef Types0 Tail;
  100. };
  101. template <typename T1, typename T2>
  102. struct Types2 {
  103. typedef T1 Head;
  104. typedef Types1<T2> Tail;
  105. };
  106. template <typename T1, typename T2, typename T3>
  107. struct Types3 {
  108. typedef T1 Head;
  109. typedef Types2<T2, T3> Tail;
  110. };
  111. template <typename T1, typename T2, typename T3, typename T4>
  112. struct Types4 {
  113. typedef T1 Head;
  114. typedef Types3<T2, T3, T4> Tail;
  115. };
  116. template <typename T1, typename T2, typename T3, typename T4, typename T5>
  117. struct Types5 {
  118. typedef T1 Head;
  119. typedef Types4<T2, T3, T4, T5> Tail;
  120. };
  121. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  122. typename T6>
  123. struct Types6 {
  124. typedef T1 Head;
  125. typedef Types5<T2, T3, T4, T5, T6> Tail;
  126. };
  127. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  128. typename T6, typename T7>
  129. struct Types7 {
  130. typedef T1 Head;
  131. typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
  132. };
  133. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  134. typename T6, typename T7, typename T8>
  135. struct Types8 {
  136. typedef T1 Head;
  137. typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
  138. };
  139. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  140. typename T6, typename T7, typename T8, typename T9>
  141. struct Types9 {
  142. typedef T1 Head;
  143. typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
  144. };
  145. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  146. typename T6, typename T7, typename T8, typename T9, typename T10>
  147. struct Types10 {
  148. typedef T1 Head;
  149. typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
  150. };
  151. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  152. typename T6, typename T7, typename T8, typename T9, typename T10,
  153. typename T11>
  154. struct Types11 {
  155. typedef T1 Head;
  156. typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
  157. };
  158. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  159. typename T6, typename T7, typename T8, typename T9, typename T10,
  160. typename T11, typename T12>
  161. struct Types12 {
  162. typedef T1 Head;
  163. typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
  164. };
  165. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  166. typename T6, typename T7, typename T8, typename T9, typename T10,
  167. typename T11, typename T12, typename T13>
  168. struct Types13 {
  169. typedef T1 Head;
  170. typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
  171. };
  172. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  173. typename T6, typename T7, typename T8, typename T9, typename T10,
  174. typename T11, typename T12, typename T13, typename T14>
  175. struct Types14 {
  176. typedef T1 Head;
  177. typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
  178. };
  179. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  180. typename T6, typename T7, typename T8, typename T9, typename T10,
  181. typename T11, typename T12, typename T13, typename T14, typename T15>
  182. struct Types15 {
  183. typedef T1 Head;
  184. typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
  185. T15> Tail;
  186. };
  187. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  188. typename T6, typename T7, typename T8, typename T9, typename T10,
  189. typename T11, typename T12, typename T13, typename T14, typename T15,
  190. typename T16>
  191. struct Types16 {
  192. typedef T1 Head;
  193. typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  194. T16> Tail;
  195. };
  196. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  197. typename T6, typename T7, typename T8, typename T9, typename T10,
  198. typename T11, typename T12, typename T13, typename T14, typename T15,
  199. typename T16, typename T17>
  200. struct Types17 {
  201. typedef T1 Head;
  202. typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  203. T16, T17> Tail;
  204. };
  205. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  206. typename T6, typename T7, typename T8, typename T9, typename T10,
  207. typename T11, typename T12, typename T13, typename T14, typename T15,
  208. typename T16, typename T17, typename T18>
  209. struct Types18 {
  210. typedef T1 Head;
  211. typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  212. T16, T17, T18> Tail;
  213. };
  214. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  215. typename T6, typename T7, typename T8, typename T9, typename T10,
  216. typename T11, typename T12, typename T13, typename T14, typename T15,
  217. typename T16, typename T17, typename T18, typename T19>
  218. struct Types19 {
  219. typedef T1 Head;
  220. typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  221. T16, T17, T18, T19> Tail;
  222. };
  223. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  224. typename T6, typename T7, typename T8, typename T9, typename T10,
  225. typename T11, typename T12, typename T13, typename T14, typename T15,
  226. typename T16, typename T17, typename T18, typename T19, typename T20>
  227. struct Types20 {
  228. typedef T1 Head;
  229. typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  230. T16, T17, T18, T19, T20> Tail;
  231. };
  232. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  233. typename T6, typename T7, typename T8, typename T9, typename T10,
  234. typename T11, typename T12, typename T13, typename T14, typename T15,
  235. typename T16, typename T17, typename T18, typename T19, typename T20,
  236. typename T21>
  237. struct Types21 {
  238. typedef T1 Head;
  239. typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  240. T16, T17, T18, T19, T20, T21> Tail;
  241. };
  242. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  243. typename T6, typename T7, typename T8, typename T9, typename T10,
  244. typename T11, typename T12, typename T13, typename T14, typename T15,
  245. typename T16, typename T17, typename T18, typename T19, typename T20,
  246. typename T21, typename T22>
  247. struct Types22 {
  248. typedef T1 Head;
  249. typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  250. T16, T17, T18, T19, T20, T21, T22> Tail;
  251. };
  252. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  253. typename T6, typename T7, typename T8, typename T9, typename T10,
  254. typename T11, typename T12, typename T13, typename T14, typename T15,
  255. typename T16, typename T17, typename T18, typename T19, typename T20,
  256. typename T21, typename T22, typename T23>
  257. struct Types23 {
  258. typedef T1 Head;
  259. typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  260. T16, T17, T18, T19, T20, T21, T22, T23> Tail;
  261. };
  262. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  263. typename T6, typename T7, typename T8, typename T9, typename T10,
  264. typename T11, typename T12, typename T13, typename T14, typename T15,
  265. typename T16, typename T17, typename T18, typename T19, typename T20,
  266. typename T21, typename T22, typename T23, typename T24>
  267. struct Types24 {
  268. typedef T1 Head;
  269. typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  270. T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
  271. };
  272. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  273. typename T6, typename T7, typename T8, typename T9, typename T10,
  274. typename T11, typename T12, typename T13, typename T14, typename T15,
  275. typename T16, typename T17, typename T18, typename T19, typename T20,
  276. typename T21, typename T22, typename T23, typename T24, typename T25>
  277. struct Types25 {
  278. typedef T1 Head;
  279. typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  280. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
  281. };
  282. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  283. typename T6, typename T7, typename T8, typename T9, typename T10,
  284. typename T11, typename T12, typename T13, typename T14, typename T15,
  285. typename T16, typename T17, typename T18, typename T19, typename T20,
  286. typename T21, typename T22, typename T23, typename T24, typename T25,
  287. typename T26>
  288. struct Types26 {
  289. typedef T1 Head;
  290. typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  291. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
  292. };
  293. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  294. typename T6, typename T7, typename T8, typename T9, typename T10,
  295. typename T11, typename T12, typename T13, typename T14, typename T15,
  296. typename T16, typename T17, typename T18, typename T19, typename T20,
  297. typename T21, typename T22, typename T23, typename T24, typename T25,
  298. typename T26, typename T27>
  299. struct Types27 {
  300. typedef T1 Head;
  301. typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  302. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
  303. };
  304. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  305. typename T6, typename T7, typename T8, typename T9, typename T10,
  306. typename T11, typename T12, typename T13, typename T14, typename T15,
  307. typename T16, typename T17, typename T18, typename T19, typename T20,
  308. typename T21, typename T22, typename T23, typename T24, typename T25,
  309. typename T26, typename T27, typename T28>
  310. struct Types28 {
  311. typedef T1 Head;
  312. typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  313. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
  314. };
  315. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  316. typename T6, typename T7, typename T8, typename T9, typename T10,
  317. typename T11, typename T12, typename T13, typename T14, typename T15,
  318. typename T16, typename T17, typename T18, typename T19, typename T20,
  319. typename T21, typename T22, typename T23, typename T24, typename T25,
  320. typename T26, typename T27, typename T28, typename T29>
  321. struct Types29 {
  322. typedef T1 Head;
  323. typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  324. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
  325. T29> Tail;
  326. };
  327. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  328. typename T6, typename T7, typename T8, typename T9, typename T10,
  329. typename T11, typename T12, typename T13, typename T14, typename T15,
  330. typename T16, typename T17, typename T18, typename T19, typename T20,
  331. typename T21, typename T22, typename T23, typename T24, typename T25,
  332. typename T26, typename T27, typename T28, typename T29, typename T30>
  333. struct Types30 {
  334. typedef T1 Head;
  335. typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  336. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  337. T30> Tail;
  338. };
  339. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  340. typename T6, typename T7, typename T8, typename T9, typename T10,
  341. typename T11, typename T12, typename T13, typename T14, typename T15,
  342. typename T16, typename T17, typename T18, typename T19, typename T20,
  343. typename T21, typename T22, typename T23, typename T24, typename T25,
  344. typename T26, typename T27, typename T28, typename T29, typename T30,
  345. typename T31>
  346. struct Types31 {
  347. typedef T1 Head;
  348. typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  349. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  350. T30, T31> Tail;
  351. };
  352. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  353. typename T6, typename T7, typename T8, typename T9, typename T10,
  354. typename T11, typename T12, typename T13, typename T14, typename T15,
  355. typename T16, typename T17, typename T18, typename T19, typename T20,
  356. typename T21, typename T22, typename T23, typename T24, typename T25,
  357. typename T26, typename T27, typename T28, typename T29, typename T30,
  358. typename T31, typename T32>
  359. struct Types32 {
  360. typedef T1 Head;
  361. typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  362. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  363. T30, T31, T32> Tail;
  364. };
  365. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  366. typename T6, typename T7, typename T8, typename T9, typename T10,
  367. typename T11, typename T12, typename T13, typename T14, typename T15,
  368. typename T16, typename T17, typename T18, typename T19, typename T20,
  369. typename T21, typename T22, typename T23, typename T24, typename T25,
  370. typename T26, typename T27, typename T28, typename T29, typename T30,
  371. typename T31, typename T32, typename T33>
  372. struct Types33 {
  373. typedef T1 Head;
  374. typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  375. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  376. T30, T31, T32, T33> Tail;
  377. };
  378. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  379. typename T6, typename T7, typename T8, typename T9, typename T10,
  380. typename T11, typename T12, typename T13, typename T14, typename T15,
  381. typename T16, typename T17, typename T18, typename T19, typename T20,
  382. typename T21, typename T22, typename T23, typename T24, typename T25,
  383. typename T26, typename T27, typename T28, typename T29, typename T30,
  384. typename T31, typename T32, typename T33, typename T34>
  385. struct Types34 {
  386. typedef T1 Head;
  387. typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  388. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  389. T30, T31, T32, T33, T34> Tail;
  390. };
  391. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  392. typename T6, typename T7, typename T8, typename T9, typename T10,
  393. typename T11, typename T12, typename T13, typename T14, typename T15,
  394. typename T16, typename T17, typename T18, typename T19, typename T20,
  395. typename T21, typename T22, typename T23, typename T24, typename T25,
  396. typename T26, typename T27, typename T28, typename T29, typename T30,
  397. typename T31, typename T32, typename T33, typename T34, typename T35>
  398. struct Types35 {
  399. typedef T1 Head;
  400. typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  401. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  402. T30, T31, T32, T33, T34, T35> Tail;
  403. };
  404. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  405. typename T6, typename T7, typename T8, typename T9, typename T10,
  406. typename T11, typename T12, typename T13, typename T14, typename T15,
  407. typename T16, typename T17, typename T18, typename T19, typename T20,
  408. typename T21, typename T22, typename T23, typename T24, typename T25,
  409. typename T26, typename T27, typename T28, typename T29, typename T30,
  410. typename T31, typename T32, typename T33, typename T34, typename T35,
  411. typename T36>
  412. struct Types36 {
  413. typedef T1 Head;
  414. typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  415. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  416. T30, T31, T32, T33, T34, T35, T36> Tail;
  417. };
  418. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  419. typename T6, typename T7, typename T8, typename T9, typename T10,
  420. typename T11, typename T12, typename T13, typename T14, typename T15,
  421. typename T16, typename T17, typename T18, typename T19, typename T20,
  422. typename T21, typename T22, typename T23, typename T24, typename T25,
  423. typename T26, typename T27, typename T28, typename T29, typename T30,
  424. typename T31, typename T32, typename T33, typename T34, typename T35,
  425. typename T36, typename T37>
  426. struct Types37 {
  427. typedef T1 Head;
  428. typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  429. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  430. T30, T31, T32, T33, T34, T35, T36, T37> Tail;
  431. };
  432. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  433. typename T6, typename T7, typename T8, typename T9, typename T10,
  434. typename T11, typename T12, typename T13, typename T14, typename T15,
  435. typename T16, typename T17, typename T18, typename T19, typename T20,
  436. typename T21, typename T22, typename T23, typename T24, typename T25,
  437. typename T26, typename T27, typename T28, typename T29, typename T30,
  438. typename T31, typename T32, typename T33, typename T34, typename T35,
  439. typename T36, typename T37, typename T38>
  440. struct Types38 {
  441. typedef T1 Head;
  442. typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  443. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  444. T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
  445. };
  446. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  447. typename T6, typename T7, typename T8, typename T9, typename T10,
  448. typename T11, typename T12, typename T13, typename T14, typename T15,
  449. typename T16, typename T17, typename T18, typename T19, typename T20,
  450. typename T21, typename T22, typename T23, typename T24, typename T25,
  451. typename T26, typename T27, typename T28, typename T29, typename T30,
  452. typename T31, typename T32, typename T33, typename T34, typename T35,
  453. typename T36, typename T37, typename T38, typename T39>
  454. struct Types39 {
  455. typedef T1 Head;
  456. typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  457. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  458. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
  459. };
  460. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  461. typename T6, typename T7, typename T8, typename T9, typename T10,
  462. typename T11, typename T12, typename T13, typename T14, typename T15,
  463. typename T16, typename T17, typename T18, typename T19, typename T20,
  464. typename T21, typename T22, typename T23, typename T24, typename T25,
  465. typename T26, typename T27, typename T28, typename T29, typename T30,
  466. typename T31, typename T32, typename T33, typename T34, typename T35,
  467. typename T36, typename T37, typename T38, typename T39, typename T40>
  468. struct Types40 {
  469. typedef T1 Head;
  470. typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  471. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  472. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
  473. };
  474. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  475. typename T6, typename T7, typename T8, typename T9, typename T10,
  476. typename T11, typename T12, typename T13, typename T14, typename T15,
  477. typename T16, typename T17, typename T18, typename T19, typename T20,
  478. typename T21, typename T22, typename T23, typename T24, typename T25,
  479. typename T26, typename T27, typename T28, typename T29, typename T30,
  480. typename T31, typename T32, typename T33, typename T34, typename T35,
  481. typename T36, typename T37, typename T38, typename T39, typename T40,
  482. typename T41>
  483. struct Types41 {
  484. typedef T1 Head;
  485. typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  486. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  487. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
  488. };
  489. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  490. typename T6, typename T7, typename T8, typename T9, typename T10,
  491. typename T11, typename T12, typename T13, typename T14, typename T15,
  492. typename T16, typename T17, typename T18, typename T19, typename T20,
  493. typename T21, typename T22, typename T23, typename T24, typename T25,
  494. typename T26, typename T27, typename T28, typename T29, typename T30,
  495. typename T31, typename T32, typename T33, typename T34, typename T35,
  496. typename T36, typename T37, typename T38, typename T39, typename T40,
  497. typename T41, typename T42>
  498. struct Types42 {
  499. typedef T1 Head;
  500. typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  501. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  502. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
  503. };
  504. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  505. typename T6, typename T7, typename T8, typename T9, typename T10,
  506. typename T11, typename T12, typename T13, typename T14, typename T15,
  507. typename T16, typename T17, typename T18, typename T19, typename T20,
  508. typename T21, typename T22, typename T23, typename T24, typename T25,
  509. typename T26, typename T27, typename T28, typename T29, typename T30,
  510. typename T31, typename T32, typename T33, typename T34, typename T35,
  511. typename T36, typename T37, typename T38, typename T39, typename T40,
  512. typename T41, typename T42, typename T43>
  513. struct Types43 {
  514. typedef T1 Head;
  515. typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  516. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  517. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
  518. T43> Tail;
  519. };
  520. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  521. typename T6, typename T7, typename T8, typename T9, typename T10,
  522. typename T11, typename T12, typename T13, typename T14, typename T15,
  523. typename T16, typename T17, typename T18, typename T19, typename T20,
  524. typename T21, typename T22, typename T23, typename T24, typename T25,
  525. typename T26, typename T27, typename T28, typename T29, typename T30,
  526. typename T31, typename T32, typename T33, typename T34, typename T35,
  527. typename T36, typename T37, typename T38, typename T39, typename T40,
  528. typename T41, typename T42, typename T43, typename T44>
  529. struct Types44 {
  530. typedef T1 Head;
  531. typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  532. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  533. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  534. T44> Tail;
  535. };
  536. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  537. typename T6, typename T7, typename T8, typename T9, typename T10,
  538. typename T11, typename T12, typename T13, typename T14, typename T15,
  539. typename T16, typename T17, typename T18, typename T19, typename T20,
  540. typename T21, typename T22, typename T23, typename T24, typename T25,
  541. typename T26, typename T27, typename T28, typename T29, typename T30,
  542. typename T31, typename T32, typename T33, typename T34, typename T35,
  543. typename T36, typename T37, typename T38, typename T39, typename T40,
  544. typename T41, typename T42, typename T43, typename T44, typename T45>
  545. struct Types45 {
  546. typedef T1 Head;
  547. typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  548. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  549. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  550. T44, T45> Tail;
  551. };
  552. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  553. typename T6, typename T7, typename T8, typename T9, typename T10,
  554. typename T11, typename T12, typename T13, typename T14, typename T15,
  555. typename T16, typename T17, typename T18, typename T19, typename T20,
  556. typename T21, typename T22, typename T23, typename T24, typename T25,
  557. typename T26, typename T27, typename T28, typename T29, typename T30,
  558. typename T31, typename T32, typename T33, typename T34, typename T35,
  559. typename T36, typename T37, typename T38, typename T39, typename T40,
  560. typename T41, typename T42, typename T43, typename T44, typename T45,
  561. typename T46>
  562. struct Types46 {
  563. typedef T1 Head;
  564. typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  565. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  566. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  567. T44, T45, T46> Tail;
  568. };
  569. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  570. typename T6, typename T7, typename T8, typename T9, typename T10,
  571. typename T11, typename T12, typename T13, typename T14, typename T15,
  572. typename T16, typename T17, typename T18, typename T19, typename T20,
  573. typename T21, typename T22, typename T23, typename T24, typename T25,
  574. typename T26, typename T27, typename T28, typename T29, typename T30,
  575. typename T31, typename T32, typename T33, typename T34, typename T35,
  576. typename T36, typename T37, typename T38, typename T39, typename T40,
  577. typename T41, typename T42, typename T43, typename T44, typename T45,
  578. typename T46, typename T47>
  579. struct Types47 {
  580. typedef T1 Head;
  581. typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  582. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  583. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  584. T44, T45, T46, T47> Tail;
  585. };
  586. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  587. typename T6, typename T7, typename T8, typename T9, typename T10,
  588. typename T11, typename T12, typename T13, typename T14, typename T15,
  589. typename T16, typename T17, typename T18, typename T19, typename T20,
  590. typename T21, typename T22, typename T23, typename T24, typename T25,
  591. typename T26, typename T27, typename T28, typename T29, typename T30,
  592. typename T31, typename T32, typename T33, typename T34, typename T35,
  593. typename T36, typename T37, typename T38, typename T39, typename T40,
  594. typename T41, typename T42, typename T43, typename T44, typename T45,
  595. typename T46, typename T47, typename T48>
  596. struct Types48 {
  597. typedef T1 Head;
  598. typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  599. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  600. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  601. T44, T45, T46, T47, T48> Tail;
  602. };
  603. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  604. typename T6, typename T7, typename T8, typename T9, typename T10,
  605. typename T11, typename T12, typename T13, typename T14, typename T15,
  606. typename T16, typename T17, typename T18, typename T19, typename T20,
  607. typename T21, typename T22, typename T23, typename T24, typename T25,
  608. typename T26, typename T27, typename T28, typename T29, typename T30,
  609. typename T31, typename T32, typename T33, typename T34, typename T35,
  610. typename T36, typename T37, typename T38, typename T39, typename T40,
  611. typename T41, typename T42, typename T43, typename T44, typename T45,
  612. typename T46, typename T47, typename T48, typename T49>
  613. struct Types49 {
  614. typedef T1 Head;
  615. typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  616. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  617. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  618. T44, T45, T46, T47, T48, T49> Tail;
  619. };
  620. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  621. typename T6, typename T7, typename T8, typename T9, typename T10,
  622. typename T11, typename T12, typename T13, typename T14, typename T15,
  623. typename T16, typename T17, typename T18, typename T19, typename T20,
  624. typename T21, typename T22, typename T23, typename T24, typename T25,
  625. typename T26, typename T27, typename T28, typename T29, typename T30,
  626. typename T31, typename T32, typename T33, typename T34, typename T35,
  627. typename T36, typename T37, typename T38, typename T39, typename T40,
  628. typename T41, typename T42, typename T43, typename T44, typename T45,
  629. typename T46, typename T47, typename T48, typename T49, typename T50>
  630. struct Types50 {
  631. typedef T1 Head;
  632. typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  633. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  634. T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
  635. T44, T45, T46, T47, T48, T49, T50> Tail;
  636. };
  637. } // namespace internal
  638. // We don't want to require the users to write TypesN<...> directly,
  639. // as that would require them to count the length. Types<...> is much
  640. // easier to write, but generates horrible messages when there is a
  641. // compiler error, as gcc insists on printing out each template
  642. // argument, even if it has the default value (this means Types<int>
  643. // will appear as Types<int, None, None, ..., None> in the compiler
  644. // errors).
  645. //
  646. // Our solution is to combine the best part of the two approaches: a
  647. // user would write Types<T1, ..., TN>, and Google Test will translate
  648. // that to TypesN<T1, ..., TN> internally to make error messages
  649. // readable. The translation is done by the 'type' member of the
  650. // Types template.
  651. template <typename T1 = internal::None, typename T2 = internal::None,
  652. typename T3 = internal::None, typename T4 = internal::None,
  653. typename T5 = internal::None, typename T6 = internal::None,
  654. typename T7 = internal::None, typename T8 = internal::None,
  655. typename T9 = internal::None, typename T10 = internal::None,
  656. typename T11 = internal::None, typename T12 = internal::None,
  657. typename T13 = internal::None, typename T14 = internal::None,
  658. typename T15 = internal::None, typename T16 = internal::None,
  659. typename T17 = internal::None, typename T18 = internal::None,
  660. typename T19 = internal::None, typename T20 = internal::None,
  661. typename T21 = internal::None, typename T22 = internal::None,
  662. typename T23 = internal::None, typename T24 = internal::None,
  663. typename T25 = internal::None, typename T26 = internal::None,
  664. typename T27 = internal::None, typename T28 = internal::None,
  665. typename T29 = internal::None, typename T30 = internal::None,
  666. typename T31 = internal::None, typename T32 = internal::None,
  667. typename T33 = internal::None, typename T34 = internal::None,
  668. typename T35 = internal::None, typename T36 = internal::None,
  669. typename T37 = internal::None, typename T38 = internal::None,
  670. typename T39 = internal::None, typename T40 = internal::None,
  671. typename T41 = internal::None, typename T42 = internal::None,
  672. typename T43 = internal::None, typename T44 = internal::None,
  673. typename T45 = internal::None, typename T46 = internal::None,
  674. typename T47 = internal::None, typename T48 = internal::None,
  675. typename T49 = internal::None, typename T50 = internal::None>
  676. struct Types {
  677. typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  678. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
  679. T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
  680. T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
  681. };
  682. template <>
  683. struct Types<internal::None, internal::None, internal::None, internal::None,
  684. internal::None, internal::None, internal::None, internal::None,
  685. internal::None, internal::None, internal::None, internal::None,
  686. internal::None, internal::None, internal::None, internal::None,
  687. internal::None, internal::None, internal::None, internal::None,
  688. internal::None, internal::None, internal::None, internal::None,
  689. internal::None, internal::None, internal::None, internal::None,
  690. internal::None, internal::None, internal::None, internal::None,
  691. internal::None, internal::None, internal::None, internal::None,
  692. internal::None, internal::None, internal::None, internal::None,
  693. internal::None, internal::None, internal::None, internal::None,
  694. internal::None, internal::None, internal::None, internal::None,
  695. internal::None, internal::None> {
  696. typedef internal::Types0 type;
  697. };
  698. template <typename T1>
  699. struct Types<T1, internal::None, internal::None, internal::None,
  700. internal::None, internal::None, internal::None, internal::None,
  701. internal::None, internal::None, internal::None, internal::None,
  702. internal::None, internal::None, internal::None, internal::None,
  703. internal::None, internal::None, internal::None, internal::None,
  704. internal::None, internal::None, internal::None, internal::None,
  705. internal::None, internal::None, internal::None, internal::None,
  706. internal::None, internal::None, internal::None, internal::None,
  707. internal::None, internal::None, internal::None, internal::None,
  708. internal::None, internal::None, internal::None, internal::None,
  709. internal::None, internal::None, internal::None, internal::None,
  710. internal::None, internal::None, internal::None, internal::None,
  711. internal::None, internal::None> {
  712. typedef internal::Types1<T1> type;
  713. };
  714. template <typename T1, typename T2>
  715. struct Types<T1, T2, internal::None, internal::None, internal::None,
  716. internal::None, internal::None, internal::None, internal::None,
  717. internal::None, internal::None, internal::None, internal::None,
  718. internal::None, internal::None, internal::None, internal::None,
  719. internal::None, internal::None, internal::None, internal::None,
  720. internal::None, internal::None, internal::None, internal::None,
  721. internal::None, internal::None, internal::None, internal::None,
  722. internal::None, internal::None, internal::None, internal::None,
  723. internal::None, internal::None, internal::None, internal::None,
  724. internal::None, internal::None, internal::None, internal::None,
  725. internal::None, internal::None, internal::None, internal::None,
  726. internal::None, internal::None, internal::None, internal::None,
  727. internal::None> {
  728. typedef internal::Types2<T1, T2> type;
  729. };
  730. template <typename T1, typename T2, typename T3>
  731. struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
  732. internal::None, internal::None, internal::None, internal::None,
  733. internal::None, internal::None, internal::None, internal::None,
  734. internal::None, internal::None, internal::None, internal::None,
  735. internal::None, internal::None, internal::None, internal::None,
  736. internal::None, internal::None, internal::None, internal::None,
  737. internal::None, internal::None, internal::None, internal::None,
  738. internal::None, internal::None, internal::None, internal::None,
  739. internal::None, internal::None, internal::None, internal::None,
  740. internal::None, internal::None, internal::None, internal::None,
  741. internal::None, internal::None, internal::None, internal::None,
  742. internal::None, internal::None, internal::None, internal::None> {
  743. typedef internal::Types3<T1, T2, T3> type;
  744. };
  745. template <typename T1, typename T2, typename T3, typename T4>
  746. struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
  747. internal::None, internal::None, internal::None, internal::None,
  748. internal::None, internal::None, internal::None, internal::None,
  749. internal::None, internal::None, internal::None, internal::None,
  750. internal::None, internal::None, internal::None, internal::None,
  751. internal::None, internal::None, internal::None, internal::None,
  752. internal::None, internal::None, internal::None, internal::None,
  753. internal::None, internal::None, internal::None, internal::None,
  754. internal::None, internal::None, internal::None, internal::None,
  755. internal::None, internal::None, internal::None, internal::None,
  756. internal::None, internal::None, internal::None, internal::None,
  757. internal::None, internal::None, internal::None> {
  758. typedef internal::Types4<T1, T2, T3, T4> type;
  759. };
  760. template <typename T1, typename T2, typename T3, typename T4, typename T5>
  761. struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
  762. internal::None, internal::None, internal::None, internal::None,
  763. internal::None, internal::None, internal::None, internal::None,
  764. internal::None, internal::None, internal::None, internal::None,
  765. internal::None, internal::None, internal::None, internal::None,
  766. internal::None, internal::None, internal::None, internal::None,
  767. internal::None, internal::None, internal::None, internal::None,
  768. internal::None, internal::None, internal::None, internal::None,
  769. internal::None, internal::None, internal::None, internal::None,
  770. internal::None, internal::None, internal::None, internal::None,
  771. internal::None, internal::None, internal::None, internal::None,
  772. internal::None, internal::None, internal::None> {
  773. typedef internal::Types5<T1, T2, T3, T4, T5> type;
  774. };
  775. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  776. typename T6>
  777. struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
  778. internal::None, internal::None, internal::None, internal::None,
  779. internal::None, internal::None, internal::None, internal::None,
  780. internal::None, internal::None, internal::None, internal::None,
  781. internal::None, internal::None, internal::None, internal::None,
  782. internal::None, internal::None, internal::None, internal::None,
  783. internal::None, internal::None, internal::None, internal::None,
  784. internal::None, internal::None, internal::None, internal::None,
  785. internal::None, internal::None, internal::None, internal::None,
  786. internal::None, internal::None, internal::None, internal::None,
  787. internal::None, internal::None, internal::None, internal::None,
  788. internal::None, internal::None> {
  789. typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
  790. };
  791. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  792. typename T6, typename T7>
  793. struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
  794. internal::None, internal::None, internal::None, internal::None,
  795. internal::None, internal::None, internal::None, internal::None,
  796. internal::None, internal::None, internal::None, internal::None,
  797. internal::None, internal::None, internal::None, internal::None,
  798. internal::None, internal::None, internal::None, internal::None,
  799. internal::None, internal::None, internal::None, internal::None,
  800. internal::None, internal::None, internal::None, internal::None,
  801. internal::None, internal::None, internal::None, internal::None,
  802. internal::None, internal::None, internal::None, internal::None,
  803. internal::None, internal::None, internal::None, internal::None,
  804. internal::None> {
  805. typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
  806. };
  807. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  808. typename T6, typename T7, typename T8>
  809. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
  810. internal::None, internal::None, internal::None, internal::None,
  811. internal::None, internal::None, internal::None, internal::None,
  812. internal::None, internal::None, internal::None, internal::None,
  813. internal::None, internal::None, internal::None, internal::None,
  814. internal::None, internal::None, internal::None, internal::None,
  815. internal::None, internal::None, internal::None, internal::None,
  816. internal::None, internal::None, internal::None, internal::None,
  817. internal::None, internal::None, internal::None, internal::None,
  818. internal::None, internal::None, internal::None, internal::None,
  819. internal::None, internal::None, internal::None, internal::None> {
  820. typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
  821. };
  822. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  823. typename T6, typename T7, typename T8, typename T9>
  824. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
  825. internal::None, internal::None, internal::None, internal::None,
  826. internal::None, internal::None, internal::None, internal::None,
  827. internal::None, internal::None, internal::None, internal::None,
  828. internal::None, internal::None, internal::None, internal::None,
  829. internal::None, internal::None, internal::None, internal::None,
  830. internal::None, internal::None, internal::None, internal::None,
  831. internal::None, internal::None, internal::None, internal::None,
  832. internal::None, internal::None, internal::None, internal::None,
  833. internal::None, internal::None, internal::None, internal::None,
  834. internal::None, internal::None, internal::None, internal::None> {
  835. typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
  836. };
  837. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  838. typename T6, typename T7, typename T8, typename T9, typename T10>
  839. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
  840. internal::None, internal::None, internal::None, internal::None,
  841. internal::None, internal::None, internal::None, internal::None,
  842. internal::None, internal::None, internal::None, internal::None,
  843. internal::None, internal::None, internal::None, internal::None,
  844. internal::None, internal::None, internal::None, internal::None,
  845. internal::None, internal::None, internal::None, internal::None,
  846. internal::None, internal::None, internal::None, internal::None,
  847. internal::None, internal::None, internal::None, internal::None,
  848. internal::None, internal::None, internal::None, internal::None,
  849. internal::None, internal::None, internal::None> {
  850. typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
  851. };
  852. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  853. typename T6, typename T7, typename T8, typename T9, typename T10,
  854. typename T11>
  855. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
  856. internal::None, internal::None, internal::None, internal::None,
  857. internal::None, internal::None, internal::None, internal::None,
  858. internal::None, internal::None, internal::None, internal::None,
  859. internal::None, internal::None, internal::None, internal::None,
  860. internal::None, internal::None, internal::None, internal::None,
  861. internal::None, internal::None, internal::None, internal::None,
  862. internal::None, internal::None, internal::None, internal::None,
  863. internal::None, internal::None, internal::None, internal::None,
  864. internal::None, internal::None, internal::None, internal::None,
  865. internal::None, internal::None> {
  866. typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
  867. };
  868. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  869. typename T6, typename T7, typename T8, typename T9, typename T10,
  870. typename T11, typename T12>
  871. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
  872. internal::None, internal::None, internal::None, internal::None,
  873. internal::None, internal::None, internal::None, internal::None,
  874. internal::None, internal::None, internal::None, internal::None,
  875. internal::None, internal::None, internal::None, internal::None,
  876. internal::None, internal::None, internal::None, internal::None,
  877. internal::None, internal::None, internal::None, internal::None,
  878. internal::None, internal::None, internal::None, internal::None,
  879. internal::None, internal::None, internal::None, internal::None,
  880. internal::None, internal::None, internal::None, internal::None,
  881. internal::None> {
  882. typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
  883. T12> type;
  884. };
  885. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  886. typename T6, typename T7, typename T8, typename T9, typename T10,
  887. typename T11, typename T12, typename T13>
  888. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
  889. internal::None, internal::None, internal::None, internal::None,
  890. internal::None, internal::None, internal::None, internal::None,
  891. internal::None, internal::None, internal::None, internal::None,
  892. internal::None, internal::None, internal::None, internal::None,
  893. internal::None, internal::None, internal::None, internal::None,
  894. internal::None, internal::None, internal::None, internal::None,
  895. internal::None, internal::None, internal::None, internal::None,
  896. internal::None, internal::None, internal::None, internal::None,
  897. internal::None, internal::None, internal::None, internal::None,
  898. internal::None> {
  899. typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  900. T13> type;
  901. };
  902. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  903. typename T6, typename T7, typename T8, typename T9, typename T10,
  904. typename T11, typename T12, typename T13, typename T14>
  905. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
  906. internal::None, internal::None, internal::None, internal::None,
  907. internal::None, internal::None, internal::None, internal::None,
  908. internal::None, internal::None, internal::None, internal::None,
  909. internal::None, internal::None, internal::None, internal::None,
  910. internal::None, internal::None, internal::None, internal::None,
  911. internal::None, internal::None, internal::None, internal::None,
  912. internal::None, internal::None, internal::None, internal::None,
  913. internal::None, internal::None, internal::None, internal::None,
  914. internal::None, internal::None, internal::None, internal::None> {
  915. typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  916. T13, T14> type;
  917. };
  918. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  919. typename T6, typename T7, typename T8, typename T9, typename T10,
  920. typename T11, typename T12, typename T13, typename T14, typename T15>
  921. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  922. internal::None, internal::None, internal::None, internal::None,
  923. internal::None, internal::None, internal::None, internal::None,
  924. internal::None, internal::None, internal::None, internal::None,
  925. internal::None, internal::None, internal::None, internal::None,
  926. internal::None, internal::None, internal::None, internal::None,
  927. internal::None, internal::None, internal::None, internal::None,
  928. internal::None, internal::None, internal::None, internal::None,
  929. internal::None, internal::None, internal::None, internal::None,
  930. internal::None, internal::None, internal::None> {
  931. typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  932. T13, T14, T15> type;
  933. };
  934. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  935. typename T6, typename T7, typename T8, typename T9, typename T10,
  936. typename T11, typename T12, typename T13, typename T14, typename T15,
  937. typename T16>
  938. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  939. T16, internal::None, internal::None, internal::None, internal::None,
  940. internal::None, internal::None, internal::None, internal::None,
  941. internal::None, internal::None, internal::None, internal::None,
  942. internal::None, internal::None, internal::None, internal::None,
  943. internal::None, internal::None, internal::None, internal::None,
  944. internal::None, internal::None, internal::None, internal::None,
  945. internal::None, internal::None, internal::None, internal::None,
  946. internal::None, internal::None, internal::None, internal::None,
  947. internal::None, internal::None> {
  948. typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  949. T13, T14, T15, T16> type;
  950. };
  951. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  952. typename T6, typename T7, typename T8, typename T9, typename T10,
  953. typename T11, typename T12, typename T13, typename T14, typename T15,
  954. typename T16, typename T17>
  955. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  956. T16, T17, internal::None, internal::None, internal::None, internal::None,
  957. internal::None, internal::None, internal::None, internal::None,
  958. internal::None, internal::None, internal::None, internal::None,
  959. internal::None, internal::None, internal::None, internal::None,
  960. internal::None, internal::None, internal::None, internal::None,
  961. internal::None, internal::None, internal::None, internal::None,
  962. internal::None, internal::None, internal::None, internal::None,
  963. internal::None, internal::None, internal::None, internal::None,
  964. internal::None> {
  965. typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  966. T13, T14, T15, T16, T17> type;
  967. };
  968. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  969. typename T6, typename T7, typename T8, typename T9, typename T10,
  970. typename T11, typename T12, typename T13, typename T14, typename T15,
  971. typename T16, typename T17, typename T18>
  972. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  973. T16, T17, T18, internal::None, internal::None, internal::None,
  974. internal::None, internal::None, internal::None, internal::None,
  975. internal::None, internal::None, internal::None, internal::None,
  976. internal::None, internal::None, internal::None, internal::None,
  977. internal::None, internal::None, internal::None, internal::None,
  978. internal::None, internal::None, internal::None, internal::None,
  979. internal::None, internal::None, internal::None, internal::None,
  980. internal::None, internal::None, internal::None, internal::None,
  981. internal::None> {
  982. typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  983. T13, T14, T15, T16, T17, T18> type;
  984. };
  985. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  986. typename T6, typename T7, typename T8, typename T9, typename T10,
  987. typename T11, typename T12, typename T13, typename T14, typename T15,
  988. typename T16, typename T17, typename T18, typename T19>
  989. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  990. T16, T17, T18, T19, internal::None, internal::None, internal::None,
  991. internal::None, internal::None, internal::None, internal::None,
  992. internal::None, internal::None, internal::None, internal::None,
  993. internal::None, internal::None, internal::None, internal::None,
  994. internal::None, internal::None, internal::None, internal::None,
  995. internal::None, internal::None, internal::None, internal::None,
  996. internal::None, internal::None, internal::None, internal::None,
  997. internal::None, internal::None, internal::None, internal::None> {
  998. typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  999. T13, T14, T15, T16, T17, T18, T19> type;
  1000. };
  1001. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1002. typename T6, typename T7, typename T8, typename T9, typename T10,
  1003. typename T11, typename T12, typename T13, typename T14, typename T15,
  1004. typename T16, typename T17, typename T18, typename T19, typename T20>
  1005. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1006. T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
  1007. internal::None, internal::None, internal::None, internal::None,
  1008. internal::None, internal::None, internal::None, internal::None,
  1009. internal::None, internal::None, internal::None, internal::None,
  1010. internal::None, internal::None, internal::None, internal::None,
  1011. internal::None, internal::None, internal::None, internal::None,
  1012. internal::None, internal::None, internal::None, internal::None,
  1013. internal::None, internal::None, internal::None> {
  1014. typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1015. T13, T14, T15, T16, T17, T18, T19, T20> type;
  1016. };
  1017. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1018. typename T6, typename T7, typename T8, typename T9, typename T10,
  1019. typename T11, typename T12, typename T13, typename T14, typename T15,
  1020. typename T16, typename T17, typename T18, typename T19, typename T20,
  1021. typename T21>
  1022. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1023. T16, T17, T18, T19, T20, T21, internal::None, internal::None,
  1024. internal::None, internal::None, internal::None, internal::None,
  1025. internal::None, internal::None, internal::None, internal::None,
  1026. internal::None, internal::None, internal::None, internal::None,
  1027. internal::None, internal::None, internal::None, internal::None,
  1028. internal::None, internal::None, internal::None, internal::None,
  1029. internal::None, internal::None, internal::None, internal::None,
  1030. internal::None, internal::None, internal::None> {
  1031. typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1032. T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
  1033. };
  1034. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1035. typename T6, typename T7, typename T8, typename T9, typename T10,
  1036. typename T11, typename T12, typename T13, typename T14, typename T15,
  1037. typename T16, typename T17, typename T18, typename T19, typename T20,
  1038. typename T21, typename T22>
  1039. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1040. T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
  1041. internal::None, internal::None, internal::None, internal::None,
  1042. internal::None, internal::None, internal::None, internal::None,
  1043. internal::None, internal::None, internal::None, internal::None,
  1044. internal::None, internal::None, internal::None, internal::None,
  1045. internal::None, internal::None, internal::None, internal::None,
  1046. internal::None, internal::None, internal::None, internal::None,
  1047. internal::None, internal::None> {
  1048. typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1049. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
  1050. };
  1051. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1052. typename T6, typename T7, typename T8, typename T9, typename T10,
  1053. typename T11, typename T12, typename T13, typename T14, typename T15,
  1054. typename T16, typename T17, typename T18, typename T19, typename T20,
  1055. typename T21, typename T22, typename T23>
  1056. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1057. T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
  1058. internal::None, internal::None, internal::None, internal::None,
  1059. internal::None, internal::None, internal::None, internal::None,
  1060. internal::None, internal::None, internal::None, internal::None,
  1061. internal::None, internal::None, internal::None, internal::None,
  1062. internal::None, internal::None, internal::None, internal::None,
  1063. internal::None, internal::None, internal::None, internal::None,
  1064. internal::None> {
  1065. typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1066. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
  1067. };
  1068. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1069. typename T6, typename T7, typename T8, typename T9, typename T10,
  1070. typename T11, typename T12, typename T13, typename T14, typename T15,
  1071. typename T16, typename T17, typename T18, typename T19, typename T20,
  1072. typename T21, typename T22, typename T23, typename T24>
  1073. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1074. T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
  1075. internal::None, internal::None, internal::None, internal::None,
  1076. internal::None, internal::None, internal::None, internal::None,
  1077. internal::None, internal::None, internal::None, internal::None,
  1078. internal::None, internal::None, internal::None, internal::None,
  1079. internal::None, internal::None, internal::None, internal::None,
  1080. internal::None, internal::None, internal::None, internal::None,
  1081. internal::None> {
  1082. typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1083. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
  1084. };
  1085. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1086. typename T6, typename T7, typename T8, typename T9, typename T10,
  1087. typename T11, typename T12, typename T13, typename T14, typename T15,
  1088. typename T16, typename T17, typename T18, typename T19, typename T20,
  1089. typename T21, typename T22, typename T23, typename T24, typename T25>
  1090. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1091. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
  1092. internal::None, internal::None, internal::None, internal::None,
  1093. internal::None, internal::None, internal::None, internal::None,
  1094. internal::None, internal::None, internal::None, internal::None,
  1095. internal::None, internal::None, internal::None, internal::None,
  1096. internal::None, internal::None, internal::None, internal::None,
  1097. internal::None, internal::None, internal::None, internal::None> {
  1098. typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1099. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
  1100. };
  1101. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1102. typename T6, typename T7, typename T8, typename T9, typename T10,
  1103. typename T11, typename T12, typename T13, typename T14, typename T15,
  1104. typename T16, typename T17, typename T18, typename T19, typename T20,
  1105. typename T21, typename T22, typename T23, typename T24, typename T25,
  1106. typename T26>
  1107. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1108. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
  1109. internal::None, internal::None, internal::None, internal::None,
  1110. internal::None, internal::None, internal::None, internal::None,
  1111. internal::None, internal::None, internal::None, internal::None,
  1112. internal::None, internal::None, internal::None, internal::None,
  1113. internal::None, internal::None, internal::None, internal::None,
  1114. internal::None, internal::None, internal::None> {
  1115. typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1116. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
  1117. T26> type;
  1118. };
  1119. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1120. typename T6, typename T7, typename T8, typename T9, typename T10,
  1121. typename T11, typename T12, typename T13, typename T14, typename T15,
  1122. typename T16, typename T17, typename T18, typename T19, typename T20,
  1123. typename T21, typename T22, typename T23, typename T24, typename T25,
  1124. typename T26, typename T27>
  1125. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1126. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
  1127. internal::None, internal::None, internal::None, internal::None,
  1128. internal::None, internal::None, internal::None, internal::None,
  1129. internal::None, internal::None, internal::None, internal::None,
  1130. internal::None, internal::None, internal::None, internal::None,
  1131. internal::None, internal::None, internal::None, internal::None,
  1132. internal::None, internal::None> {
  1133. typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1134. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
  1135. T27> type;
  1136. };
  1137. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1138. typename T6, typename T7, typename T8, typename T9, typename T10,
  1139. typename T11, typename T12, typename T13, typename T14, typename T15,
  1140. typename T16, typename T17, typename T18, typename T19, typename T20,
  1141. typename T21, typename T22, typename T23, typename T24, typename T25,
  1142. typename T26, typename T27, typename T28>
  1143. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1144. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
  1145. internal::None, internal::None, internal::None, internal::None,
  1146. internal::None, internal::None, internal::None, internal::None,
  1147. internal::None, internal::None, internal::None, internal::None,
  1148. internal::None, internal::None, internal::None, internal::None,
  1149. internal::None, internal::None, internal::None, internal::None,
  1150. internal::None, internal::None> {
  1151. typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1152. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
  1153. T27, T28> type;
  1154. };
  1155. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1156. typename T6, typename T7, typename T8, typename T9, typename T10,
  1157. typename T11, typename T12, typename T13, typename T14, typename T15,
  1158. typename T16, typename T17, typename T18, typename T19, typename T20,
  1159. typename T21, typename T22, typename T23, typename T24, typename T25,
  1160. typename T26, typename T27, typename T28, typename T29>
  1161. struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
  1162. T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
  1163. internal::None, internal::None, internal::None, internal::None,
  1164. internal::None, internal::None, internal::None, internal::None,
  1165. internal::None, internal::None, internal::None, internal::None,
  1166. internal::None, internal::None, internal::None, internal::None,
  1167. internal::None, internal::None, internal::None, internal::None,
  1168. internal::None> {
  1169. typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
  1170. T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
  1171. T27, T28, T29> type;
  1172. };
  1173. template <typename T1, typename T2, typename T3, typename T4, typename T5,
  1174. typename T6, typename T7, typename T8, typename T9, typename T10,
  1175. typename T11, typename T12, typename T13, typename T14, typename T15,
  1176. typename T16, typename T17, typename T18, typename T19, typename T20,
  1177. typename T21, typename T22, typename T23, typename T24, typename T25,
  1178. typenam