119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file was GENERATED by command:
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//     pump.py gtest-param-test.h.pump
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// DO NOT EDIT BY HAND!!!
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Copyright 2008, Google Inc.
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// All rights reserved.
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Redistribution and use in source and binary forms, with or without
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// modification, are permitted provided that the following conditions are
10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// met:
11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Redistributions of source code must retain the above copyright
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// notice, this list of conditions and the following disclaimer.
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Redistributions in binary form must reproduce the above
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// copyright notice, this list of conditions and the following disclaimer
16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// in the documentation and/or other materials provided with the
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// distribution.
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Neither the name of Google Inc. nor the names of its
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// contributors may be used to endorse or promote products derived from
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// this software without specific prior written permission.
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Authors: vladl@google.com (Vlad Losev)
35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Macros and functions for implementing parameterized tests
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// in Google C++ Testing Framework (Google Test)
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
43894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Value-parameterized tests allow you to test your code with different
46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// parameters without writing multiple copies of the same test.
47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Here is how you use value-parameterized tests:
49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#if 0
51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// To write value-parameterized tests, first you should define a fixture
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// class. It is usually derived from testing::TestWithParam<T> (see below for
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// another inheritance scheme that's sometimes useful in more complicated
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// class hierarchies), where the type of your parameter values.
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// TestWithParam<T> is itself derived from testing::Test. T can be any
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// copyable type. If it's a raw pointer, you are responsible for managing the
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// lifespan of the pointed values.
59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass FooTest : public ::testing::TestWithParam<const char*> {
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // You can implement all the usual class fixture members here.
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Then, use the TEST_P macro to define as many parameterized tests
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// for this fixture as you want. The _P suffix is for "parameterized"
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// or "pattern", whichever you prefer to think.
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanTEST_P(FooTest, DoesBlah) {
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // Inside a test, access the test parameter with the GetParam() method
70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // of the TestWithParam<T> class:
71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  EXPECT_TRUE(foo.Blah(GetParam()));
72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ...
73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanTEST_P(FooTest, HasBlahBlah) {
76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ...
77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// case with any set of parameters you want. Google Test defines a number
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// of functions for generating test parameters. They return what we call
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// (surprise!) parameter generators. Here is a  summary of them, which
83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// are all in the testing namespace:
84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//  Range(begin, end [, step]) - Yields values {begin, begin+step,
87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                               begin+step+step, ...}. The values do not
88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                               include end. step defaults to 1.
89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//  ValuesIn(container)        - Yields values from a C-style array, an STL
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//  Bool()                     - Yields sequence {false, true}.
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                               for the math savvy) of the values generated
95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                               by the N generators.
96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// For more details, see comments at the definitions of these functions below
98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// in this file.
99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The following statement will instantiate tests from the FooTest test case
101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// each with parameter values "meeny", "miny", and "moe".
102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINSTANTIATE_TEST_CASE_P(InstantiationName,
104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                        FooTest,
105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                        Values("meeny", "miny", "moe"));
106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// To distinguish different instances of the pattern, (yes, you
108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// can instantiate it more then once) the first argument to the
109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// actual test case name. Remember to pick unique prefixes for different
111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// instantiations. The tests from the instantiation above will have
112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// these names:
113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// You can use these names in --gtest_filter.
122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This statement will instantiate all tests from FooTest again, each
124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// with parameter values "cat" and "dog":
125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanconst char* pets[] = {"cat", "dog"};
127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The tests from the instantiation above will have these names:
130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// in the given test case, whether their definitions come before or
138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// AFTER the INSTANTIATE_TEST_CASE_P statement.
139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Please also note that generator expressions (including parameters to the
141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// generators) are evaluated in InitGoogleTest(), after main() has started.
142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This allows the user on one hand, to adjust generator parameters in order
143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// to dynamically determine a set of tests to run and on the other hand,
144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// give the user a chance to inspect the generated tests with Google Test
145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// reflection API before RUN_ALL_TESTS() is executed.
146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// for more examples.
149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// In the future, we plan to publish the API for defining new parameter
151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// generators. But for now this interface remains part of the internal
152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// implementation and is subject to change.
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// A parameterized test fixture must be derived from testing::Test and from
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// testing::WithParamInterface<T>, where T is the type of the parameter
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// values. Inheriting from TestWithParam<T> satisfies that requirement because
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// TestWithParam<T> inherits from both Test and WithParamInterface. In more
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// complicated hierarchies, however, it is occasionally useful to inherit
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// separately from Test and WithParamInterface. For example:
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass BaseTest : public ::testing::Test {
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // You can inherit all the usual members for a non-parameterized test
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // fixture here.
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // The usual test fixture members go here too.
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanTEST_F(BaseTest, HasFoo) {
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // This is an ordinary non-parameterized test.
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanTEST_P(DerivedTest, DoesBlah) {
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // GetParam works just the same here as if you inherit from TestWithParam.
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EXPECT_TRUE(foo.Blah(GetParam()));
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif  // 0
181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "gtest/internal/gtest-port.h"
183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#if !GTEST_OS_SYMBIAN
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# include <utility>
186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif
187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// scripts/fuse_gtest.py depends on gtest's own header being #included
189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// *unconditionally*.  Therefore these #includes cannot be moved
190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// inside #if GTEST_HAS_PARAM_TEST.
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "gtest/internal/gtest-internal.h"
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "gtest/internal/gtest-param-util.h"
193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#if GTEST_HAS_PARAM_TEST
195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace testing {
197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Functions producing parameter generators.
199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Google Test uses these generators to produce parameters for value-
201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// parameterized tests. When a parameterized test case is instantiated
202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// with a particular generator, Google Test creates and runs tests
203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// for each element in the sequence produced by the generator.
204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// In the following sample, tests from test case FooTest are instantiated
206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// each three times with parameter values 3, 5, and 8:
207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// class FooTest : public TestWithParam<int> { ... };
209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// TEST_P(FooTest, TestThis) {
211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// }
212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// TEST_P(FooTest, TestThat) {
213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// }
214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Range() returns generators providing sequences of values in a range.
218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Synopsis:
220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Range(start, end)
221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing a sequence of values {start, start+1,
222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     start+2, ..., }.
223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Range(start, end, step)
224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing a sequence of values {start, start+step,
225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     start+step+step, ..., }.
226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Notes:
227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   * The generated sequences never include end. For example, Range(1, 5)
228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     returns a generator producing {1, 3, 5, 7}.
230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   * start and end must have the same type. That type may be any integral or
231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     floating-point type or a user defined type satisfying these conditions:
232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * It must be assignable (have operator=() defined).
233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * It must have operator+() (operator+(int-compatible type) for
234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//       two-operand version).
235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * It must have operator<() defined.
236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     Elements in the resulting sequences will also have that type.
237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   * Condition start < end must be satisfied in order for resulting sequences
238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     to contain any elements.
239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T, typename IncrementT>
241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ParamGenerator<T>(
243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      new internal::RangeGenerator<T, IncrementT>(start, end, step));
244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T>
247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<T> Range(T start, T end) {
248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return Range(start, end, 1);
249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ValuesIn() function allows generation of tests with parameters coming from
252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// a container.
253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Synopsis:
255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ValuesIn(const T (&array)[N])
256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing sequences with elements from
257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     a C-style array.
258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ValuesIn(const Container& container)
259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing sequences with elements from
260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     an STL-style container.
261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ValuesIn(Iterator begin, Iterator end)
262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing sequences with elements from
263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     a range [begin, end) defined by a pair of STL-style iterators. These
264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     iterators can also be plain C pointers.
265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Please note that ValuesIn copies the values from the containers
267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// passed in and keeps them to generate tests in RUN_ALL_TESTS().
268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Examples:
270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This instantiates tests from test case StringTest
272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// each with C-string values of "foo", "bar", and "baz":
273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// const char* strings[] = {"foo", "bar", "baz"};
275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This instantiates tests from test case StlStringTest
278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// each with STL strings with values "a" and "b":
279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ::std::vector< ::std::string> GetParameterStrings() {
281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   ::std::vector< ::std::string> v;
282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   v.push_back("a");
283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   v.push_back("b");
284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   return v;
285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// }
286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(CharSequence,
288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                         StlStringTest,
289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                         ValuesIn(GetParameterStrings()));
290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This will also instantiate tests from CharTest
293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// each with parameter values 'a' and 'b':
294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ::std::list<char> GetParameterChars() {
296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   ::std::list<char> list;
297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   list.push_back('a');
298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   list.push_back('b');
299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   return list;
300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// }
301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ::std::list<char> l = GetParameterChars();
302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(CharSequence2,
303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                         CharTest,
304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                         ValuesIn(l.begin(), l.end()));
305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename ForwardIterator>
307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<
30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanValuesIn(ForwardIterator begin, ForwardIterator end) {
31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ::value_type ParamType;
312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ParamGenerator<ParamType>(
313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T, size_t N>
317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return ValuesIn(array, array + N);
319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Container>
322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<typename Container::value_type> ValuesIn(
323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Container& container) {
324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return ValuesIn(container.begin(), container.end());
325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} // namespace testing
328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <gtest/internal/gtest-param-util-generated.h>
330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace testing {
332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Values() allows generating tests from explicitly specified list of
334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// parameters.
335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Synopsis:
337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Values(T v1, T v2, ..., T vN)
338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing sequences with elements v1, v2, ..., vN.
339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// For example, this instantiates tests from test case BarTest each
341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// with values "one", "two", and "three":
342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The exact type of values will depend on the type of parameter in BazTest.
347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Currently, Values() supports from 1 to 50 parameters.
351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1>
353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray1<T1> Values(T1 v1) {
354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray1<T1>(v1);
355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2>
358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray2<T1, T2>(v1, v2);
360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3>
363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4>
368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T5 v5) {
375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6>
380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T4 v4, T5 v5, T6 v6) {
382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7>
387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T4 v4, T5 v5, T6 v6, T7 v7) {
389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v6, v7);
391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8>
395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5, v6, v7, v8);
399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9>
403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4, v5, v6, v7, v8, v9);
407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10>
411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2, v3, v4, v5, v6, v7, v8, v9, v10);
415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11>
420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11) {
423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12>
430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12) {
433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13>
440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13) {
443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14>
450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14);
456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15>
461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13, v14, v15);
467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16>
473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16) {
477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12, v13, v14, v15, v16);
480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17>
486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17) {
490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11, v12, v13, v14, v15, v16, v17);
493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18>
499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18) {
503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10, v11, v12, v13, v14, v15, v16, v17, v18);
506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19>
512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20>
525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21>
539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22>
553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T21 v21, T22 v22) {
558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20, v21, v22);
562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23>
569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T21 v21, T22 v22, T23 v23) {
574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20, v21, v22, v23);
578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24>
585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T21 v21, T22 v22, T23 v23, T24 v24) {
590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v19, v20, v21, v22, v23, v24);
594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25>
601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v18, v19, v20, v21, v22, v23, v24, v25);
610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26>
618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26) {
624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27>
636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27) {
642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28>
654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27, T28 v28) {
660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v28);
665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29>
673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27, T28 v28, T29 v29) {
679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27, v28, v29);
684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30>
692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v26, v27, v28, v29, v30);
703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31>
712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v25, v26, v27, v28, v29, v30, v31);
723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32>
732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T32 v32) {
739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24, v25, v26, v27, v28, v29, v30, v31, v32);
744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33>
753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T32 v32, T33 v33) {
760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34>
774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T31 v31, T32 v32, T33 v33, T34 v34) {
781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35>
795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36>
817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v34, v35, v36);
830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
831894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37>
840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T37 v37) {
848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v34, v35, v36, v37);
854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38>
864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
868894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
869894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
870894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
871894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T37 v37, T38 v38) {
872894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
873894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
877894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33, v34, v35, v36, v37, v38);
878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39>
888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T37 v37, T38 v38, T39 v39) {
896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
898894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
899894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v32, v33, v34, v35, v36, v37, v38, v39);
902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40>
912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
914894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
915894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
919894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41>
937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
951894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
952894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
956894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42>
962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
968894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
969894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
970894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T42 v42) {
971894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
972894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
973894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
974894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
975894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
976894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
977894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v42);
978894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
979894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
980894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
981894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
982894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
983894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
984894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
985894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
986894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
987894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
988894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43>
989894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
990894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
991894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
992894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
993894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
994894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
995894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
996894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
997894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T42 v42, T43 v43) {
998894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
999894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1000894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1001894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
1002894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
1003894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
1004894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v41, v42, v43);
1005894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1006894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1007894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1008894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1009894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1010894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1011894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1012894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1013894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1014894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1015894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44>
1016894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1017894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1018894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1019894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1020894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1021894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1022894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1023894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
1024894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T42 v42, T43 v43, T44 v44) {
1025894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1026894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1027894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1028894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
1029894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
1030894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
1031894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v40, v41, v42, v43, v44);
1032894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1033894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1034894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1035894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1036894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1037894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1038894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1039894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1040894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1041894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1042894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45>
1043894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1044894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1045894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1046894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
1047894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
1048894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
1049894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1050894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
1051894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
1052894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1053894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1054894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1055894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
1056894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
1057894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
1058894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v39, v40, v41, v42, v43, v44, v45);
1059894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1060894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1061894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1062894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1063894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1064894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1065894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1066894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1067894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1068894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1069894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
1070894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46>
1071894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1072894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1073894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1074894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
1075894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1076894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1077894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1078894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1079894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
1080894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1081894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1082894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1083894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
1084894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
1085894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
1086894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v38, v39, v40, v41, v42, v43, v44, v45, v46);
1087894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1088894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1089894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1090894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1091894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1092894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1093894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1094894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1095894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1096894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1097894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
1098894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47>
1099894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
1103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
1108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
1112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
1113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
1114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
1115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
1126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47, typename T48>
1127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
1131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
1136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T48 v48) {
1137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
1141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
1142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
1143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
1144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
1155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47, typename T48, typename T49>
1156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
1160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
1161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
1162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
1163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
1164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
1165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T47 v47, T48 v48, T49 v49) {
1166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
1170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
1171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
1172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
1173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
1184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47, typename T48, typename T49, typename T50>
1185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
1189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
1190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
1191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
1192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
1193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
1194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
1195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
1199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
1200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
1201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
1202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v48, v49, v50);
1203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Bool() allows generating tests with parameters in a set of (false, true).
1206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Synopsis:
1208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Bool()
1209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing sequences with elements {false, true}.
1210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// It is useful when testing code that depends on Boolean flags. Combinations
1212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// of multiple flags can be tested when several Bool()'s are combined using
1213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Combine() function.
1214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// In the following example all tests in the test case FlagDependentTest
1216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// will be instantiated twice with parameters false and true.
1217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// class FlagDependentTest : public testing::TestWithParam<bool> {
1219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   virtual void SetUp() {
1220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     external_flag = GetParam();
1221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   }
1222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// }
1223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
1224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline internal::ParamGenerator<bool> Bool() {
1226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return Values(false, true);
1227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
122919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# if GTEST_HAS_COMBINE
1230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Combine() allows the user to combine two or more sequences to produce
1231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// values of a Cartesian product of those sequences' elements.
1232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Synopsis:
1234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Combine(gen1, gen2, ..., genN)
1235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   - returns a generator producing sequences with elements coming from
1236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     the Cartesian product of elements from the sequences generated by
1237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     gen1, gen2, ..., genN. The sequence elements will have a type of
1238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
1239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     of elements from sequences produces by gen1, gen2, ..., genN.
1240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Combine can have up to 10 arguments. This number is currently limited
1242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// by the maximum number of elements in the tuple implementation used by Google
1243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Test.
1244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Example:
1246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This will instantiate tests in test case AnimalTest each one with
1248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
1249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// tuple("dog", BLACK), and tuple("dog", WHITE):
1250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// enum Color { BLACK, GRAY, WHITE };
1252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// class AnimalTest
1253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
1254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// TEST_P(AnimalTest, AnimalLooksNice) {...}
1256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
1258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                         Combine(Values("cat", "dog"),
1259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                                 Values(BLACK, WHITE)));
1260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This will instantiate tests in FlagDependentTest with all variations of two
1262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Boolean flags:
1263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// class FlagDependentTest
1265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     : public testing::TestWithParam<tuple(bool, bool)> > {
1266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   virtual void SetUp() {
1267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
1268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     tie(external_flag_1, external_flag_2) = GetParam();
1269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   }
1270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// };
1271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// TEST_P(FlagDependentTest, TestFeature1) {
1273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   // Test your code using external_flag_1 and external_flag_2 here.
1274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// }
1275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
1276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                         Combine(Bool(), Bool()));
1277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2>
1279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder2<Generator1, Generator2> Combine(
1280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2) {
1281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder2<Generator1, Generator2>(
1282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2);
1283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3>
1286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
1287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
1288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
1289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3);
1290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4>
1294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
1295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4> Combine(
1296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4) {
1298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
1299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4>(
1300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4);
1301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4, typename Generator5>
1305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
1306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4, Generator5> Combine(
1307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4, const Generator5& g5) {
1309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
1310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4, Generator5>(
1311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4, g5);
1312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4, typename Generator5, typename Generator6>
1316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
1317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4, Generator5, Generator6> Combine(
1318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
1320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
1321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4, Generator5, Generator6>(
1322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4, g5, g6);
1323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4, typename Generator5, typename Generator6,
1327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator7>
1328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
1329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4, Generator5, Generator6, Generator7> Combine(
1330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator7& g7) {
1333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
1334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4, Generator5, Generator6, Generator7>(
1335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4, g5, g6, g7);
1336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4, typename Generator5, typename Generator6,
1340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator7, typename Generator8>
1341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
1342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
1343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator7& g7, const Generator8& g8) {
1346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
1347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4, Generator5, Generator6, Generator7, Generator8>(
1348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4, g5, g6, g7, g8);
1349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4, typename Generator5, typename Generator6,
1353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator7, typename Generator8, typename Generator9>
1354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
1355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4, Generator5, Generator6, Generator7, Generator8,
1356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator9> Combine(
1357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
1360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
1361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
1362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4, g5, g6, g7, g8, g9);
1363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
1364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Generator1, typename Generator2, typename Generator3,
1366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator4, typename Generator5, typename Generator6,
1367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator7, typename Generator8, typename Generator9,
1368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename Generator10>
1369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
1370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
1371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Generator10> Combine(
1372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator7& g7, const Generator8& g8, const Generator9& g9,
1375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        const Generator10& g10) {
1376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
1377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
1378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Generator10>(
1379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
1380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
138119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# endif  // GTEST_HAS_COMBINE
1382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
138519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# define TEST_P(test_case_name, test_name) \
1386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
1387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : public test_case_name { \
1388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public: \
1389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
1390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void TestBody(); \
1391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private: \
1392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    static int AddToRegistry() { \
1393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          GetTestCasePatternHolder<test_case_name>(\
1395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
1396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                  #test_case_name, \
1397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                  #test_name, \
1398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                  new ::testing::internal::TestMetaFactory< \
1399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
1400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return 0; \
1401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    } \
1402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    static int gtest_registering_dummy_; \
1403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
1404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
1405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }; \
1406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  int GTEST_TEST_CLASS_NAME_(test_case_name, \
1407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                             test_name)::gtest_registering_dummy_ = \
1408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
1409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
1410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
141119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
1412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
1413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
1414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  int gtest_##prefix##test_case_name##_dummy_ = \
1415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          GetTestCasePatternHolder<test_case_name>(\
1417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
1418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                  #prefix, \
1419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
1420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                  __FILE__, __LINE__)
1421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace testing
1423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif  // GTEST_HAS_PARAM_TEST
1425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1427