Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
eed64b5f
Commit
eed64b5f
authored
Aug 08, 2019
by
Krystian Kuzniarek
Browse files
replace autogenerated TypesX classes by variadic ones
parent
37f32278
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
102 additions
and
1651 deletions
+102
-1651
googletest/include/gtest/gtest-typed-test.h
googletest/include/gtest/gtest-typed-test.h
+8
-10
googletest/include/gtest/internal/gtest-internal.h
googletest/include/gtest/internal/gtest-internal.h
+2
-2
googletest/include/gtest/internal/gtest-type-util.h
googletest/include/gtest/internal/gtest-type-util.h
+45
-1545
googletest/include/gtest/internal/gtest-type-util.h.pump
googletest/include/gtest/internal/gtest-type-util.h.pump
+42
-90
googletest/test/gtest-unittest-api_test.cc
googletest/test/gtest-unittest-api_test.cc
+5
-4
No files found.
googletest/include/gtest/gtest-typed-test.h
View file @
eed64b5f
...
@@ -27,7 +27,6 @@
...
@@ -27,7 +27,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// GOOGLETEST_CM0001 DO NOT DELETE
// GOOGLETEST_CM0001 DO NOT DELETE
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
...
@@ -188,13 +187,13 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
...
@@ -188,13 +187,13 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
#define GTEST_NAME_GENERATOR_(TestSuiteName) \
#define GTEST_NAME_GENERATOR_(TestSuiteName) \
gtest_type_params_##TestSuiteName##_NameGenerator
gtest_type_params_##TestSuiteName##_NameGenerator
#define TYPED_TEST_SUITE(CaseName, Types, ...)
\
#define TYPED_TEST_SUITE(CaseName, Types, ...) \
typedef ::testing::internal::TypeList<Types>::type
GTEST_TYPE_PARAMS_(
\
typedef ::testing::internal::
Generate
TypeList<Types>::type
\
CaseName);
\
GTEST_TYPE_PARAMS_(CaseName);
\
typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type
\
typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \
GTEST_NAME_GENERATOR_(CaseName)
GTEST_NAME_GENERATOR_(CaseName)
#
define TYPED_TEST(CaseName, TestName) \
#define TYPED_TEST(CaseName, TestName)
\
template <typename gtest_TypeParam_> \
template <typename gtest_TypeParam_> \
class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
: public CaseName<gtest_TypeParam_> { \
: public CaseName<gtest_TypeParam_> { \
...
@@ -204,8 +203,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
...
@@ -204,8 +203,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
void TestBody() override; \
void TestBody() override; \
}; \
}; \
static bool gtest_##CaseName##_##TestName##_registered_ \
static bool gtest_##CaseName##_##TestName##_registered_ \
GTEST_ATTRIBUTE_UNUSED_ = \
GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \
::testing::internal::TypeParameterizedTest< \
CaseName, \
CaseName, \
::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \
::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \
TestName)>, \
TestName)>, \
...
@@ -307,7 +305,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
...
@@ -307,7 +305,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \
static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \
::testing::internal::TypeParameterizedTestSuite< \
::testing::internal::TypeParameterizedTestSuite< \
SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \
SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \
::testing::internal::TypeList<Types>::type>::
\
::testing::internal::
Generate
TypeList<Types>::type>:: \
Register(#Prefix, \
Register(#Prefix, \
::testing::internal::CodeLocation(__FILE__, __LINE__), \
::testing::internal::CodeLocation(__FILE__, __LINE__), \
>EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \
>EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \
...
@@ -315,7 +313,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
...
@@ -315,7 +313,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
::testing::internal::GenerateNames< \
::testing::internal::GenerateNames< \
::testing::internal::NameGeneratorSelector< \
::testing::internal::NameGeneratorSelector< \
__VA_ARGS__>::type, \
__VA_ARGS__>::type, \
::testing::internal::TypeList<Types>::type>())
::testing::internal::
Generate
TypeList<Types>::type>())
// Legacy API is deprecated but still available
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
...
...
googletest/include/gtest/internal/gtest-internal.h
View file @
eed64b5f
...
@@ -662,7 +662,7 @@ struct NameGeneratorSelector {
...
@@ -662,7 +662,7 @@ struct NameGeneratorSelector {
};
};
template
<
typename
NameGenerator
>
template
<
typename
NameGenerator
>
void
GenerateNamesRecursively
(
Types0
,
std
::
vector
<
std
::
string
>*
,
int
)
{}
void
GenerateNamesRecursively
(
internal
::
None
,
std
::
vector
<
std
::
string
>*
,
int
)
{}
template
<
typename
NameGenerator
,
typename
Types
>
template
<
typename
NameGenerator
,
typename
Types
>
void
GenerateNamesRecursively
(
Types
,
std
::
vector
<
std
::
string
>*
result
,
int
i
)
{
void
GenerateNamesRecursively
(
Types
,
std
::
vector
<
std
::
string
>*
result
,
int
i
)
{
...
@@ -729,7 +729,7 @@ class TypeParameterizedTest {
...
@@ -729,7 +729,7 @@ class TypeParameterizedTest {
// The base case for the compile time recursion.
// The base case for the compile time recursion.
template
<
GTEST_TEMPLATE_
Fixture
,
class
TestSel
>
template
<
GTEST_TEMPLATE_
Fixture
,
class
TestSel
>
class
TypeParameterizedTest
<
Fixture
,
TestSel
,
Types0
>
{
class
TypeParameterizedTest
<
Fixture
,
TestSel
,
internal
::
None
>
{
public:
public:
static
bool
Register
(
const
char
*
/*prefix*/
,
const
CodeLocation
&
,
static
bool
Register
(
const
char
*
/*prefix*/
,
const
CodeLocation
&
,
const
char
*
/*case_name*/
,
const
char
*
/*test_names*/
,
const
char
*
/*case_name*/
,
const
char
*
/*test_names*/
,
...
...
googletest/include/gtest/internal/gtest-type-util.h
View file @
eed64b5f
...
@@ -31,11 +31,12 @@
...
@@ -31,11 +31,12 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Type utilities needed for implementing typed and type-parameterized
// Type utilities needed for implementing typed and type-parameterized
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
//
// Currently we support at most 50 type
s in a list, and at most 50
// Currently we support at most 50 type
-parameterized tests
//
type-parameterized tests
in one type-parameterized test suite.
// in one type-parameterized test suite.
// Please contact googletestframework@googlegroups.com if you need
// Please contact googletestframework@googlegroups.com if you need
// more.
// more.
...
@@ -105,1524 +106,6 @@ std::string GetTypeName() {
...
@@ -105,1524 +106,6 @@ std::string GetTypeName() {
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
// A unique type used as the default value for the arguments of class
// template Types. This allows us to simulate variadic templates
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
// support directly.
struct
None
{};
// The following family of struct and struct templates are used to
// represent type lists. In particular, TypesN<T1, T2, ..., TN>
// represents a type list with N types (T1, T2, ..., and TN) in it.
// Except for Types0, every struct in the family has two member types:
// Head for the first type in the list, and Tail for the rest of the
// list.
// The empty type list.
struct
Types0
{};
// Type lists of length 1, 2, 3, and so on.
template
<
typename
T1
>
struct
Types1
{
typedef
T1
Head
;
typedef
Types0
Tail
;
};
template
<
typename
T1
,
typename
T2
>
struct
Types2
{
typedef
T1
Head
;
typedef
Types1
<
T2
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
>
struct
Types3
{
typedef
T1
Head
;
typedef
Types2
<
T2
,
T3
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
>
struct
Types4
{
typedef
T1
Head
;
typedef
Types3
<
T2
,
T3
,
T4
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
>
struct
Types5
{
typedef
T1
Head
;
typedef
Types4
<
T2
,
T3
,
T4
,
T5
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
>
struct
Types6
{
typedef
T1
Head
;
typedef
Types5
<
T2
,
T3
,
T4
,
T5
,
T6
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
>
struct
Types7
{
typedef
T1
Head
;
typedef
Types6
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
>
struct
Types8
{
typedef
T1
Head
;
typedef
Types7
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
Types9
{
typedef
T1
Head
;
typedef
Types8
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
>
struct
Types10
{
typedef
T1
Head
;
typedef
Types9
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
>
struct
Types11
{
typedef
T1
Head
;
typedef
Types10
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
>
struct
Types12
{
typedef
T1
Head
;
typedef
Types11
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
>
struct
Types13
{
typedef
T1
Head
;
typedef
Types12
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
>
struct
Types14
{
typedef
T1
Head
;
typedef
Types13
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
>
struct
Types15
{
typedef
T1
Head
;
typedef
Types14
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
>
struct
Types16
{
typedef
T1
Head
;
typedef
Types15
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
>
struct
Types17
{
typedef
T1
Head
;
typedef
Types16
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
>
struct
Types18
{
typedef
T1
Head
;
typedef
Types17
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
>
struct
Types19
{
typedef
T1
Head
;
typedef
Types18
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
>
struct
Types20
{
typedef
T1
Head
;
typedef
Types19
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
>
struct
Types21
{
typedef
T1
Head
;
typedef
Types20
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
>
struct
Types22
{
typedef
T1
Head
;
typedef
Types21
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
>
struct
Types23
{
typedef
T1
Head
;
typedef
Types22
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
>
struct
Types24
{
typedef
T1
Head
;
typedef
Types23
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
>
struct
Types25
{
typedef
T1
Head
;
typedef
Types24
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
>
struct
Types26
{
typedef
T1
Head
;
typedef
Types25
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
>
struct
Types27
{
typedef
T1
Head
;
typedef
Types26
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
>
struct
Types28
{
typedef
T1
Head
;
typedef
Types27
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
>
struct
Types29
{
typedef
T1
Head
;
typedef
Types28
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
>
struct
Types30
{
typedef
T1
Head
;
typedef
Types29
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
>
struct
Types31
{
typedef
T1
Head
;
typedef
Types30
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
>
struct
Types32
{
typedef
T1
Head
;
typedef
Types31
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
>
struct
Types33
{
typedef
T1
Head
;
typedef
Types32
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
>
struct
Types34
{
typedef
T1
Head
;
typedef
Types33
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
>
struct
Types35
{
typedef
T1
Head
;
typedef
Types34
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
>
struct
Types36
{
typedef
T1
Head
;
typedef
Types35
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
>
struct
Types37
{
typedef
T1
Head
;
typedef
Types36
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
>
struct
Types38
{
typedef
T1
Head
;
typedef
Types37
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
>
struct
Types39
{
typedef
T1
Head
;
typedef
Types38
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
>
struct
Types40
{
typedef
T1
Head
;
typedef
Types39
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
>
struct
Types41
{
typedef
T1
Head
;
typedef
Types40
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
>
struct
Types42
{
typedef
T1
Head
;
typedef
Types41
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
>
struct
Types43
{
typedef
T1
Head
;
typedef
Types42
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
>
struct
Types44
{
typedef
T1
Head
;
typedef
Types43
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
>
struct
Types45
{
typedef
T1
Head
;
typedef
Types44
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
>
struct
Types46
{
typedef
T1
Head
;
typedef
Types45
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
>
struct
Types47
{
typedef
T1
Head
;
typedef
Types46
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
,
typename
T48
>
struct
Types48
{
typedef
T1
Head
;
typedef
Types47
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
,
typename
T48
,
typename
T49
>
struct
Types49
{
typedef
T1
Head
;
typedef
Types48
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
>
Tail
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
,
typename
T48
,
typename
T49
,
typename
T50
>
struct
Types50
{
typedef
T1
Head
;
typedef
Types49
<
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
,
T50
>
Tail
;
};
}
// namespace internal
// We don't want to require the users to write TypesN<...> directly,
// as that would require them to count the length. Types<...> is much
// easier to write, but generates horrible messages when there is a
// compiler error, as gcc insists on printing out each template
// argument, even if it has the default value (this means Types<int>
// will appear as Types<int, None, None, ..., None> in the compiler
// errors).
//
// Our solution is to combine the best part of the two approaches: a
// user would write Types<T1, ..., TN>, and Google Test will translate
// that to TypesN<T1, ..., TN> internally to make error messages
// readable. The translation is done by the 'type' member of the
// Types template.
template
<
typename
T1
=
internal
::
None
,
typename
T2
=
internal
::
None
,
typename
T3
=
internal
::
None
,
typename
T4
=
internal
::
None
,
typename
T5
=
internal
::
None
,
typename
T6
=
internal
::
None
,
typename
T7
=
internal
::
None
,
typename
T8
=
internal
::
None
,
typename
T9
=
internal
::
None
,
typename
T10
=
internal
::
None
,
typename
T11
=
internal
::
None
,
typename
T12
=
internal
::
None
,
typename
T13
=
internal
::
None
,
typename
T14
=
internal
::
None
,
typename
T15
=
internal
::
None
,
typename
T16
=
internal
::
None
,
typename
T17
=
internal
::
None
,
typename
T18
=
internal
::
None
,
typename
T19
=
internal
::
None
,
typename
T20
=
internal
::
None
,
typename
T21
=
internal
::
None
,
typename
T22
=
internal
::
None
,
typename
T23
=
internal
::
None
,
typename
T24
=
internal
::
None
,
typename
T25
=
internal
::
None
,
typename
T26
=
internal
::
None
,
typename
T27
=
internal
::
None
,
typename
T28
=
internal
::
None
,
typename
T29
=
internal
::
None
,
typename
T30
=
internal
::
None
,
typename
T31
=
internal
::
None
,
typename
T32
=
internal
::
None
,
typename
T33
=
internal
::
None
,
typename
T34
=
internal
::
None
,
typename
T35
=
internal
::
None
,
typename
T36
=
internal
::
None
,
typename
T37
=
internal
::
None
,
typename
T38
=
internal
::
None
,
typename
T39
=
internal
::
None
,
typename
T40
=
internal
::
None
,
typename
T41
=
internal
::
None
,
typename
T42
=
internal
::
None
,
typename
T43
=
internal
::
None
,
typename
T44
=
internal
::
None
,
typename
T45
=
internal
::
None
,
typename
T46
=
internal
::
None
,
typename
T47
=
internal
::
None
,
typename
T48
=
internal
::
None
,
typename
T49
=
internal
::
None
,
typename
T50
=
internal
::
None
>
struct
Types
{
typedef
internal
::
Types50
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
,
T50
>
type
;
};
template
<
>
struct
Types
<
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types0
type
;
};
template
<
typename
T1
>
struct
Types
<
T1
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types1
<
T1
>
type
;
};
template
<
typename
T1
,
typename
T2
>
struct
Types
<
T1
,
T2
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types2
<
T1
,
T2
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
>
struct
Types
<
T1
,
T2
,
T3
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types3
<
T1
,
T2
,
T3
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types4
<
T1
,
T2
,
T3
,
T4
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types5
<
T1
,
T2
,
T3
,
T4
,
T5
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types6
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types7
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types8
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types9
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types10
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types11
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types12
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types13
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types14
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types15
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types16
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types17
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types18
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types19
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types20
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types21
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types22
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types23
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types24
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types25
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types26
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types27
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types28
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types29
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types30
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types31
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types32
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types33
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types34
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types35
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types36
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types37
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types38
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types39
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types40
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types41
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types42
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types43
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types44
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types45
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
internal
::
None
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types46
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
internal
::
None
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types47
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
,
typename
T48
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
internal
::
None
,
internal
::
None
>
{
typedef
internal
::
Types48
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
>
type
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
,
typename
T48
,
typename
T49
>
struct
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
,
internal
::
None
>
{
typedef
internal
::
Types49
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
>
type
;
};
namespace
internal
{
# define GTEST_TEMPLATE_ template <typename T> class
# define GTEST_TEMPLATE_ template <typename T> class
// The template "selector" struct TemplateSel<Tmpl> is used to
// The template "selector" struct TemplateSel<Tmpl> is used to
...
@@ -3298,38 +1781,55 @@ struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
...
@@ -3298,38 +1781,55 @@ struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
>
type
;
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
>
type
;
};
};
// The TypeList template makes it possible to use either a single type
// A unique type indicating an empty node
// or a Types<...> list in TYPED_TEST_SUITE() and
struct
None
{};
// INSTANTIATE_TYPED_TEST_SUITE_P().
// Tuple-like type lists
template
<
typename
Head_
,
typename
...
Tail_
>
struct
Types
{
using
Head
=
Head_
;
using
Tail
=
Types
<
Tail_
...
>
;
};
template
<
typename
Head_
>
struct
Types
<
Head_
>
{
using
Head
=
Head_
;
using
Tail
=
None
;
};
// Helper metafunctions to tell apart a single type from types
// generated by ::testing::Types
template
<
typename
...
Ts
>
struct
ProxyTypeList
{
typedef
Types
<
Ts
...
>
type
;
};
template
<
typename
>
struct
is_proxy_type_list
:
std
::
false_type
{};
template
<
typename
...
Ts
>
struct
is_proxy_type_list
<
ProxyTypeList
<
Ts
...
>>
:
std
::
true_type
{};
// Generator which conditionally creates type lists.
// It recognizes if a requested type list should be created
// and prevents creating a new type list nested within another one.
template
<
typename
T
>
template
<
typename
T
>
struct
TypeList
{
struct
GenerateTypeList
{
typedef
Types1
<
T
>
type
;
private:
};
using
proxy
=
typename
std
::
conditional
<
is_proxy_type_list
<
T
>::
value
,
T
,
ProxyTypeList
<
T
>>::
type
;
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
,
typename
T10
,
public:
typename
T11
,
typename
T12
,
typename
T13
,
typename
T14
,
typename
T15
,
using
type
=
typename
proxy
::
type
;
typename
T16
,
typename
T17
,
typename
T18
,
typename
T19
,
typename
T20
,
typename
T21
,
typename
T22
,
typename
T23
,
typename
T24
,
typename
T25
,
typename
T26
,
typename
T27
,
typename
T28
,
typename
T29
,
typename
T30
,
typename
T31
,
typename
T32
,
typename
T33
,
typename
T34
,
typename
T35
,
typename
T36
,
typename
T37
,
typename
T38
,
typename
T39
,
typename
T40
,
typename
T41
,
typename
T42
,
typename
T43
,
typename
T44
,
typename
T45
,
typename
T46
,
typename
T47
,
typename
T48
,
typename
T49
,
typename
T50
>
struct
TypeList
<
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
,
T50
>
>
{
typedef
typename
Types
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
,
T10
,
T11
,
T12
,
T13
,
T14
,
T15
,
T16
,
T17
,
T18
,
T19
,
T20
,
T21
,
T22
,
T23
,
T24
,
T25
,
T26
,
T27
,
T28
,
T29
,
T30
,
T31
,
T32
,
T33
,
T34
,
T35
,
T36
,
T37
,
T38
,
T39
,
T40
,
T41
,
T42
,
T43
,
T44
,
T45
,
T46
,
T47
,
T48
,
T49
,
T50
>::
type
type
;
};
};
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
}
// namespace internal
}
// namespace internal
template
<
typename
...
Ts
>
using
Types
=
internal
::
ProxyTypeList
<
Ts
...
>
;
}
// namespace testing
}
// namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
googletest/include/gtest/internal/gtest-type-util.h.pump
View file @
eed64b5f
...
@@ -33,8 +33,8 @@ $var n = 50 $$ Maximum length of type lists we want to support.
...
@@ -33,8 +33,8 @@ $var n = 50 $$ Maximum length of type lists we want to support.
// Type utilities needed for implementing typed and type-parameterized
// Type utilities needed for implementing typed and type-parameterized
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
//
// Currently we support at most $n type
s in a list, and at most $n
// Currently we support at most $n type
-parameterized tests
//
type-parameterized tests
in one type-parameterized test suite.
// in one type-parameterized test suite.
// Please contact googletestframework@googlegroups.com if you need
// Please contact googletestframework@googlegroups.com if you need
// more.
// more.
...
@@ -104,84 +104,6 @@ std::string GetTypeName() {
...
@@ -104,84 +104,6 @@ std::string GetTypeName() {
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
// A unique type used as the default value for the arguments of class
// template Types. This allows us to simulate variadic templates
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
// support directly.
struct
None
{};
// The following family of struct and struct templates are used to
// represent type lists. In particular, TypesN<T1, T2, ..., TN>
// represents a type list with N types (T1, T2, ..., and TN) in it.
// Except for Types0, every struct in the family has two member types:
// Head for the first type in the list, and Tail for the rest of the
// list.
// The empty type list.
struct
Types0
{};
// Type lists of length 1, 2, 3, and so on.
template
<
typename
T1
>
struct
Types1
{
typedef
T1
Head
;
typedef
Types0
Tail
;
};
$
range
i
2.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
range
k
2.
.
i
template
<
$
for
j
,
[[
typename
T
$
j
]]>
struct
Types
$
i
{
typedef
T1
Head
;
typedef
Types
$
(
i
-
1
)
<
$
for
k
,
[[
T
$
k
]]
>
Tail
;
};
]]
}
// namespace internal
// We don't want to require the users to write TypesN<...> directly,
// as that would require them to count the length. Types<...> is much
// easier to write, but generates horrible messages when there is a
// compiler error, as gcc insists on printing out each template
// argument, even if it has the default value (this means Types<int>
// will appear as Types<int, None, None, ..., None> in the compiler
// errors).
//
// Our solution is to combine the best part of the two approaches: a
// user would write Types<T1, ..., TN>, and Google Test will translate
// that to TypesN<T1, ..., TN> internally to make error messages
// readable. The translation is done by the 'type' member of the
// Types template.
$
range
i
1.
.
n
template
<
$
for
i
,
[[
typename
T
$
i
=
internal
::
None
]]>
struct
Types
{
typedef
internal
::
Types
$
n
<
$
for
i
,
[[
T
$
i
]]
>
type
;
};
template
<
>
struct
Types
<
$
for
i
,
[[
internal
::
None
]]
>
{
typedef
internal
::
Types0
type
;
};
$
range
i
1.
.
n
-
1
$
for
i
[[
$
range
j
1.
.
i
$
range
k
i
+
1.
.
n
template
<
$
for
j
,
[[
typename
T
$
j
]]>
struct
Types
<
$
for
j
,
[[
T
$
j
]]
$
for
k
[[,
internal
::
None
]]
>
{
typedef
internal
::
Types
$
i
<
$
for
j
,
[[
T
$
j
]]
>
type
;
};
]]
namespace
internal
{
# define GTEST_TEMPLATE_ template <typename T> class
# define GTEST_TEMPLATE_ template <typename T> class
// The template "selector" struct TemplateSel<Tmpl> is used to
// The template "selector" struct TemplateSel<Tmpl> is used to
...
@@ -278,25 +200,55 @@ struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
...
@@ -278,25 +200,55 @@ struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
]]
]]
// The TypeList template makes it possible to use either a single type
// A unique type indicating an empty node
// or a Types<...> list in TYPED_TEST_SUITE() and
struct
None
{};
// INSTANTIATE_TYPED_TEST_SUITE_P().
template
<
typename
T
>
// Tuple-like type lists
struct
TypeList
{
template
<
typename
Head_
,
typename
...
Tail_
>
typedef
Types1
<
T
>
type
;
struct
Types
{
using
Head
=
Head_
;
using
Tail
=
Types
<
Tail_
...
>
;
};
};
template
<
typename
Head_
>
struct
Types
<
Head_
>
{
using
Head
=
Head_
;
using
Tail
=
None
;
};
$
range
i
1.
.
n
// Helper metafunctions to tell apart a single type from types
template
<
$
for
i
,
[[
typename
T
$
i
]]>
// generated by ::testing::Types
struct
TypeList
<
Types
<
$
for
i
,
[[
T
$
i
]]
>
>
{
template
<
typename
...
Ts
>
typedef
typename
Types
<
$
for
i
,
[[
T
$
i
]]
>::
type
type
;
struct
ProxyTypeList
{
typedef
Types
<
Ts
...
>
type
;
};
template
<
typename
>
struct
is_proxy_type_list
:
std
::
false_type
{};
template
<
typename
...
Ts
>
struct
is_proxy_type_list
<
ProxyTypeList
<
Ts
...
>>
:
std
::
true_type
{};
// Generator which conditionally creates type lists.
// It recognizes if a requested type list should be created
// and prevents creating a new type list nested within another one.
template
<
typename
T
>
struct
GenerateTypeList
{
private:
using
proxy
=
typename
std
::
conditional
<
is_proxy_type_list
<
T
>::
value
,
T
,
ProxyTypeList
<
T
>>::
type
;
public:
using
type
=
typename
proxy
::
type
;
};
};
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
}
// namespace internal
}
// namespace internal
template
<
typename
...
Ts
>
using
Types
=
internal
::
ProxyTypeList
<
Ts
...
>
;
}
// namespace testing
}
// namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
googletest/test/gtest-unittest-api_test.cc
View file @
eed64b5f
...
@@ -188,7 +188,7 @@ TEST(ApiTest, TestSuiteImmutableAccessorsWork) {
...
@@ -188,7 +188,7 @@ TEST(ApiTest, TestSuiteImmutableAccessorsWork) {
ASSERT_TRUE
(
test_suite
!=
nullptr
);
ASSERT_TRUE
(
test_suite
!=
nullptr
);
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
test_suite
->
name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
test_suite
->
name
());
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
test_suite
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>
>
().
c_str
(),
test_suite
->
type_param
());
EXPECT_TRUE
(
test_suite
->
should_run
());
EXPECT_TRUE
(
test_suite
->
should_run
());
EXPECT_EQ
(
0
,
test_suite
->
disabled_test_count
());
EXPECT_EQ
(
0
,
test_suite
->
disabled_test_count
());
EXPECT_EQ
(
1
,
test_suite
->
test_to_run_count
());
EXPECT_EQ
(
1
,
test_suite
->
test_to_run_count
());
...
@@ -199,7 +199,7 @@ TEST(ApiTest, TestSuiteImmutableAccessorsWork) {
...
@@ -199,7 +199,7 @@ TEST(ApiTest, TestSuiteImmutableAccessorsWork) {
EXPECT_STREQ
(
"Dummy"
,
tests
[
0
]
->
name
());
EXPECT_STREQ
(
"Dummy"
,
tests
[
0
]
->
name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
tests
[
0
]
->
test_suite_name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
tests
[
0
]
->
test_suite_name
());
EXPECT_TRUE
(
IsNull
(
tests
[
0
]
->
value_param
()));
EXPECT_TRUE
(
IsNull
(
tests
[
0
]
->
value_param
()));
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_TRUE
(
tests
[
0
]
->
should_run
());
EXPECT_TRUE
(
tests
[
0
]
->
should_run
());
delete
[]
tests
;
delete
[]
tests
;
...
@@ -265,7 +265,8 @@ class FinalSuccessChecker : public Environment {
...
@@ -265,7 +265,8 @@ class FinalSuccessChecker : public Environment {
#if GTEST_HAS_TYPED_TEST
#if GTEST_HAS_TYPED_TEST
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
test_suites
[
2
]
->
name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
test_suites
[
2
]
->
name
());
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
test_suites
[
2
]
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>>
().
c_str
(),
test_suites
[
2
]
->
type_param
());
EXPECT_TRUE
(
test_suites
[
2
]
->
should_run
());
EXPECT_TRUE
(
test_suites
[
2
]
->
should_run
());
EXPECT_EQ
(
0
,
test_suites
[
2
]
->
disabled_test_count
());
EXPECT_EQ
(
0
,
test_suites
[
2
]
->
disabled_test_count
());
ASSERT_EQ
(
1
,
test_suites
[
2
]
->
total_test_count
());
ASSERT_EQ
(
1
,
test_suites
[
2
]
->
total_test_count
());
...
@@ -317,7 +318,7 @@ class FinalSuccessChecker : public Environment {
...
@@ -317,7 +318,7 @@ class FinalSuccessChecker : public Environment {
EXPECT_STREQ
(
"Dummy"
,
tests
[
0
]
->
name
());
EXPECT_STREQ
(
"Dummy"
,
tests
[
0
]
->
name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
tests
[
0
]
->
test_suite_name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
tests
[
0
]
->
test_suite_name
());
EXPECT_TRUE
(
IsNull
(
tests
[
0
]
->
value_param
()));
EXPECT_TRUE
(
IsNull
(
tests
[
0
]
->
value_param
()));
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_TRUE
(
tests
[
0
]
->
should_run
());
EXPECT_TRUE
(
tests
[
0
]
->
should_run
());
EXPECT_TRUE
(
tests
[
0
]
->
result
()
->
Passed
());
EXPECT_TRUE
(
tests
[
0
]
->
result
()
->
Passed
());
EXPECT_EQ
(
0
,
tests
[
0
]
->
result
()
->
test_property_count
());
EXPECT_EQ
(
0
,
tests
[
0
]
->
result
()
->
test_property_count
());
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment