146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This file was GENERATED by command:
246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     pump.py gtest-param-test.h.pump
346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// DO NOT EDIT BY HAND!!!
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008, Google Inc.
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved.
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Authors: vladl@google.com (Vlad Losev)
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Macros and functions for implementing parameterized tests
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in Google C++ Testing Framework (Google Test)
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Value-parameterized tests allow you to test your code with different
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// parameters without writing multiple copies of the same test.
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Here is how you use value-parameterized tests:
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if 0
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// To write value-parameterized tests, first you should define a fixture
5346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// class. It is usually derived from testing::TestWithParam<T> (see below for
5446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// another inheritance scheme that's sometimes useful in more complicated
5546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// class hierarchies), where the type of your parameter values.
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// TestWithParam<T> is itself derived from testing::Test. T can be any
5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// copyable type. If it's a raw pointer, you are responsible for managing the
5846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// lifespan of the pointed values.
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass FooTest : public ::testing::TestWithParam<const char*> {
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // You can implement all the usual class fixture members here.
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Then, use the TEST_P macro to define as many parameterized tests
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// for this fixture as you want. The _P suffix is for "parameterized"
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// or "pattern", whichever you prefer to think.
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_P(FooTest, DoesBlah) {
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Inside a test, access the test parameter with the GetParam() method
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // of the TestWithParam<T> class:
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(foo.Blah(GetParam()));
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ...
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_P(FooTest, HasBlahBlah) {
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ...
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// case with any set of parameters you want. Google Test defines a number
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of functions for generating test parameters. They return what we call
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (surprise!) parameter generators. Here is a  summary of them, which
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// are all in the testing namespace:
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//  Range(begin, end [, step]) - Yields values {begin, begin+step,
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                               begin+step+step, ...}. The values do not
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                               include end. step defaults to 1.
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//  ValuesIn(container)        - Yields values from a C-style array, an STL
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//  Bool()                     - Yields sequence {false, true}.
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                               for the math savvy) of the values generated
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                               by the N generators.
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For more details, see comments at the definitions of these functions below
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in this file.
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The following statement will instantiate tests from the FooTest test case
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// each with parameter values "meeny", "miny", and "moe".
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TEST_CASE_P(InstantiationName,
104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                        FooTest,
105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                        Values("meeny", "miny", "moe"));
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// To distinguish different instances of the pattern, (yes, you
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// can instantiate it more then once) the first argument to the
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// actual test case name. Remember to pick unique prefixes for different
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// instantiations. The tests from the instantiation above will have
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// these names:
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// You can use these names in --gtest_filter.
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This statement will instantiate all tests from FooTest again, each
124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// with parameter values "cat" and "dog":
125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterconst char* pets[] = {"cat", "dog"};
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The tests from the instantiation above will have these names:
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the given test case, whether their definitions come before or
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// AFTER the INSTANTIATE_TEST_CASE_P statement.
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
14046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Please also note that generator expressions (including parameters to the
14146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// generators) are evaluated in InitGoogleTest(), after main() has started.
14246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This allows the user on one hand, to adjust generator parameters in order
14346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// to dynamically determine a set of tests to run and on the other hand,
14446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// give the user a chance to inspect the generated tests with Google Test
14546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// reflection API before RUN_ALL_TESTS() is executed.
146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// for more examples.
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// In the future, we plan to publish the API for defining new parameter
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// generators. But for now this interface remains part of the internal
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// implementation and is subject to change.
15346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
15446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
15546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A parameterized test fixture must be derived from testing::Test and from
15646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// testing::WithParamInterface<T>, where T is the type of the parameter
15746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// values. Inheriting from TestWithParam<T> satisfies that requirement because
15846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// TestWithParam<T> inherits from both Test and WithParamInterface. In more
15946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// complicated hierarchies, however, it is occasionally useful to inherit
16046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// separately from Test and WithParamInterface. For example:
16146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass BaseTest : public ::testing::Test {
16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // You can inherit all the usual members for a non-parameterized test
16446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // fixture here.
16546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
16846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The usual test fixture members go here too.
16946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
17046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
17146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST_F(BaseTest, HasFoo) {
17246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // This is an ordinary non-parameterized test.
17346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
17446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
17546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST_P(DerivedTest, DoesBlah) {
17646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // GetParam works just the same here as if you inherit from TestWithParam.
17746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(foo.Blah(GetParam()));
17846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // 0
181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
18246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-port.h"
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
18446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if !GTEST_OS_SYMBIAN
18546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <utility>
18646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
18846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// scripts/fuse_gtest.py depends on gtest's own header being #included
18946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// *unconditionally*.  Therefore these #includes cannot be moved
19046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// inside #if GTEST_HAS_PARAM_TEST.
19146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-internal.h"
19246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-param-util.h"
19346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-param-util-generated.h"
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_PARAM_TEST
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Functions producing parameter generators.
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Test uses these generators to produce parameters for value-
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// parameterized tests. When a parameterized test case is instantiated
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// with a particular generator, Google Test creates and runs tests
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// for each element in the sequence produced by the generator.
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// In the following sample, tests from test case FooTest are instantiated
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// each three times with parameter values 3, 5, and 8:
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// class FooTest : public TestWithParam<int> { ... };
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TEST_P(FooTest, TestThis) {
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// }
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TEST_P(FooTest, TestThat) {
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// }
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Range() returns generators providing sequences of values in a range.
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Synopsis:
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Range(start, end)
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing a sequence of values {start, start+1,
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     start+2, ..., }.
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Range(start, end, step)
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing a sequence of values {start, start+step,
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     start+step+step, ..., }.
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Notes:
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   * The generated sequences never include end. For example, Range(1, 5)
229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     returns a generator producing {1, 3, 5, 7}.
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   * start and end must have the same type. That type may be any integral or
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     floating-point type or a user defined type satisfying these conditions:
233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * It must be assignable (have operator=() defined).
234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * It must have operator+() (operator+(int-compatible type) for
235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//       two-operand version).
236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * It must have operator<() defined.
237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     Elements in the resulting sequences will also have that type.
238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   * Condition start < end must be satisfied in order for resulting sequences
239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     to contain any elements.
240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T, typename IncrementT>
242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ParamGenerator<T>(
244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      new internal::RangeGenerator<T, IncrementT>(start, end, step));
245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T>
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ParamGenerator<T> Range(T start, T end) {
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return Range(start, end, 1);
250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ValuesIn() function allows generation of tests with parameters coming from
253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a container.
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Synopsis:
256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ValuesIn(const T (&array)[N])
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing sequences with elements from
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     a C-style array.
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ValuesIn(const Container& container)
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing sequences with elements from
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     an STL-style container.
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ValuesIn(Iterator begin, Iterator end)
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing sequences with elements from
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     a range [begin, end) defined by a pair of STL-style iterators. These
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     iterators can also be plain C pointers.
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Please note that ValuesIn copies the values from the containers
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// passed in and keeps them to generate tests in RUN_ALL_TESTS().
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Examples:
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This instantiates tests from test case StringTest
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// each with C-string values of "foo", "bar", and "baz":
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// const char* strings[] = {"foo", "bar", "baz"};
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This instantiates tests from test case StlStringTest
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// each with STL strings with values "a" and "b":
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ::std::vector< ::std::string> GetParameterStrings() {
282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   ::std::vector< ::std::string> v;
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   v.push_back("a");
284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   v.push_back("b");
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   return v;
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// }
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(CharSequence,
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                         StlStringTest,
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                         ValuesIn(GetParameterStrings()));
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This will also instantiate tests from CharTest
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// each with parameter values 'a' and 'b':
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ::std::list<char> GetParameterChars() {
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   ::std::list<char> list;
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   list.push_back('a');
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   list.push_back('b');
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   return list;
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// }
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ::std::list<char> l = GetParameterChars();
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(CharSequence2,
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                         CharTest,
305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                         ValuesIn(l.begin(), l.end()));
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename ForwardIterator>
308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ParamGenerator<
30946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
31046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanValuesIn(ForwardIterator begin, ForwardIterator end) {
31146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
31246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::value_type ParamType;
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ParamGenerator<ParamType>(
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T, size_t N>
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return ValuesIn(array, array + N);
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Container>
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ParamGenerator<typename Container::value_type> ValuesIn(
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Container& container) {
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return ValuesIn(container.begin(), container.end());
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Values() allows generating tests from explicitly specified list of
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// parameters.
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Synopsis:
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Values(T v1, T v2, ..., T vN)
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing sequences with elements v1, v2, ..., vN.
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For example, this instantiates tests from test case BarTest each
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// with values "one", "two", and "three":
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The exact type of values will depend on the type of parameter in BazTest.
342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Currently, Values() supports from 1 to 50 parameters.
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1>
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray1<T1> Values(T1 v1) {
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray1<T1>(v1);
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2>
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray2<T1, T2>(v1, v2);
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3>
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4>
363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5 v5) {
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6>
375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T4 v4, T5 v5, T6 v6) {
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7>
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T4 v4, T5 v5, T6 v6, T7 v7) {
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v6, v7);
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8>
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5, v6, v7, v8);
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9>
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4, v5, v6, v7, v8, v9);
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10>
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2, v3, v4, v5, v6, v7, v8, v9, v10);
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11>
415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11) {
418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12>
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12) {
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13>
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13) {
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14>
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14);
451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15>
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13, v14, v15);
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16>
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16) {
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12, v13, v14, v15, v16);
475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17>
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17) {
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11, v12, v13, v14, v15, v16, v17);
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18>
494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18) {
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10, v11, v12, v13, v14, v15, v16, v17, v18);
501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19>
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20>
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21>
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22>
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T21 v21, T22 v22) {
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20, v21, v22);
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23>
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T21 v21, T22 v22, T23 v23) {
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20, v21, v22, v23);
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24>
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T21 v21, T22 v22, T23 v23, T24 v24) {
585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v19, v20, v21, v22, v23, v24);
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25>
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v18, v19, v20, v21, v22, v23, v24, v25);
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26>
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26) {
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27>
631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27) {
637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28>
649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27, T28 v28) {
655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v28);
660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29>
668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27, T28 v28, T29 v29) {
674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27, v28, v29);
679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30>
687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v26, v27, v28, v29, v30);
698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31>
707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v25, v26, v27, v28, v29, v30, v31);
718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32>
727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T32 v32) {
734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24, v25, v26, v27, v28, v29, v30, v31, v32);
739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33>
748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T32 v32, T33 v33) {
755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34>
769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T31 v31, T32 v32, T33 v33, T34 v34) {
776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35>
790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36>
812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v34, v35, v36);
825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37>
835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T37 v37) {
843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v34, v35, v36, v37);
849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38>
859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T37 v37, T38 v38) {
867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33, v34, v35, v36, v37, v38);
873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
875dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
878dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39>
883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T37 v37, T38 v38, T39 v39) {
891dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v32, v33, v34, v35, v36, v37, v38, v39);
897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40>
907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41>
932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42>
957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T42 v42) {
966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v42);
973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43>
984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T42 v42, T43 v43) {
993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v41, v42, v43);
1000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44>
1011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
1019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T42 v42, T43 v43, T44 v44) {
1020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
1024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
1025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
1026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v40, v41, v42, v43, v44);
1027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1033dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45>
1038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
1042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
1043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
1044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
1046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
1047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
1051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
1052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
1053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v39, v40, v41, v42, v43, v44, v45);
1054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
1065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46>
1066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
1070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
1075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
1079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
1080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
1081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v38, v39, v40, v41, v42, v43, v44, v45, v46);
1082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
1093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47>
1094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
1098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
1103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
1107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
1108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
1109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
1110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
1121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47, typename T48>
1122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
1126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
1131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T48 v48) {
1132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
1136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
1137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
1138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
1139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
1150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47, typename T48, typename T49>
1151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
1155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
1156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
1157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
1158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
1159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
1160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T47 v47, T48 v48, T49 v49) {
1161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
1165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
1166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
1167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
1168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
1178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
1179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47, typename T48, typename T49, typename T50>
1180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
1184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
1185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
1186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
1187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
1188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
1189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
1190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
1194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
1195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
1196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
1197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v48, v49, v50);
1198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Bool() allows generating tests with parameters in a set of (false, true).
1201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Synopsis:
1203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Bool()
1204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing sequences with elements {false, true}.
1205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// It is useful when testing code that depends on Boolean flags. Combinations
1207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of multiple flags can be tested when several Bool()'s are combined using
1208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Combine() function.
1209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// In the following example all tests in the test case FlagDependentTest
1211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// will be instantiated twice with parameters false and true.
1212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// class FlagDependentTest : public testing::TestWithParam<bool> {
1214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   virtual void SetUp() {
1215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     external_flag = GetParam();
1216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   }
1217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// }
1218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
1219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ParamGenerator<bool> Bool() {
1221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return Values(false, true);
1222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
122446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# if GTEST_HAS_COMBINE
1225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Combine() allows the user to combine two or more sequences to produce
1226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// values of a Cartesian product of those sequences' elements.
1227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Synopsis:
1229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Combine(gen1, gen2, ..., genN)
1230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   - returns a generator producing sequences with elements coming from
1231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     the Cartesian product of elements from the sequences generated by
1232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     gen1, gen2, ..., genN. The sequence elements will have a type of
1233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
1234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     of elements from sequences produces by gen1, gen2, ..., genN.
1235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Combine can have up to 10 arguments. This number is currently limited
1237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// by the maximum number of elements in the tuple implementation used by Google
1238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Test.
1239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Example:
1241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This will instantiate tests in test case AnimalTest each one with
1243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
1244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// tuple("dog", BLACK), and tuple("dog", WHITE):
1245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// enum Color { BLACK, GRAY, WHITE };
1247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// class AnimalTest
1248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
1249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TEST_P(AnimalTest, AnimalLooksNice) {...}
1251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
1253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                         Combine(Values("cat", "dog"),
1254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                                 Values(BLACK, WHITE)));
1255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This will instantiate tests in FlagDependentTest with all variations of two
1257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Boolean flags:
1258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// class FlagDependentTest
126046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     : public testing::TestWithParam<tuple<bool, bool> > {
1261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   virtual void SetUp() {
1262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
1263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     tie(external_flag_1, external_flag_2) = GetParam();
1264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   }
1265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// };
1266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TEST_P(FlagDependentTest, TestFeature1) {
1268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   // Test your code using external_flag_1 and external_flag_2 here.
1269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// }
1270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
1271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//                         Combine(Bool(), Bool()));
1272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2>
1274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder2<Generator1, Generator2> Combine(
1275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2) {
1276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder2<Generator1, Generator2>(
1277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2);
1278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3>
1281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
1282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
1283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
1284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3);
1285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4>
1289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
1290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4> Combine(
1291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4) {
1293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
1294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4>(
1295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4);
1296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4, typename Generator5>
1300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
1301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4, Generator5> Combine(
1302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4, const Generator5& g5) {
1304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
1305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4, Generator5>(
1306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4, g5);
1307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4, typename Generator5, typename Generator6>
1311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
1312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4, Generator5, Generator6> Combine(
1313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
1315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
1316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4, Generator5, Generator6>(
1317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4, g5, g6);
1318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4, typename Generator5, typename Generator6,
1322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator7>
1323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
1324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4, Generator5, Generator6, Generator7> Combine(
1325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator7& g7) {
1328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
1329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4, Generator5, Generator6, Generator7>(
1330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4, g5, g6, g7);
1331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4, typename Generator5, typename Generator6,
1335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator7, typename Generator8>
1336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
1337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
1338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator7& g7, const Generator8& g8) {
1341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
1342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4, Generator5, Generator6, Generator7, Generator8>(
1343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4, g5, g6, g7, g8);
1344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4, typename Generator5, typename Generator6,
1348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator7, typename Generator8, typename Generator9>
1349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
1350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4, Generator5, Generator6, Generator7, Generator8,
1351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator9> Combine(
1352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
1355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
1356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
1357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4, g5, g6, g7, g8, g9);
1358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename Generator1, typename Generator2, typename Generator3,
1361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator4, typename Generator5, typename Generator6,
1362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator7, typename Generator8, typename Generator9,
1363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename Generator10>
1364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
1365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
1366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Generator10> Combine(
1367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
1368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
1369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator7& g7, const Generator8& g8, const Generator9& g9,
1370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        const Generator10& g10) {
1371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
1372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
1373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Generator10>(
1374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
1375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
137646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif  // GTEST_HAS_COMBINE
1377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
138046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# define TEST_P(test_case_name, test_name) \
1381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
1382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : public test_case_name { \
1383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public: \
1384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
1385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void TestBody(); \
1386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private: \
1387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    static int AddToRegistry() { \
1388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          GetTestCasePatternHolder<test_case_name>(\
1390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
1391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                  #test_case_name, \
1392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                  #test_name, \
1393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                  new ::testing::internal::TestMetaFactory< \
1394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
1395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return 0; \
1396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    } \
1397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    static int gtest_registering_dummy_; \
1398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
1399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
1400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }; \
1401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int GTEST_TEST_CLASS_NAME_(test_case_name, \
1402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                             test_name)::gtest_registering_dummy_ = \
1403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
1404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
1405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
140646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
1407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
1408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
1409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int gtest_##prefix##test_case_name##_dummy_ = \
1410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          GetTestCasePatternHolder<test_case_name>(\
1412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
1413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                  #prefix, \
1414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
1415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                  __FILE__, __LINE__)
1416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
1418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_HAS_PARAM_TEST
1420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1422