10a39d0a697ff3603e8c100300fda363658e10b23James Zern// This file was GENERATED by command:
20a39d0a697ff3603e8c100300fda363658e10b23James Zern//     pump.py gtest-param-test.h.pump
30a39d0a697ff3603e8c100300fda363658e10b23James Zern// DO NOT EDIT BY HAND!!!
40a39d0a697ff3603e8c100300fda363658e10b23James Zern
50a39d0a697ff3603e8c100300fda363658e10b23James Zern// Copyright 2008, Google Inc.
60a39d0a697ff3603e8c100300fda363658e10b23James Zern// All rights reserved.
70a39d0a697ff3603e8c100300fda363658e10b23James Zern//
80a39d0a697ff3603e8c100300fda363658e10b23James Zern// Redistribution and use in source and binary forms, with or without
90a39d0a697ff3603e8c100300fda363658e10b23James Zern// modification, are permitted provided that the following conditions are
100a39d0a697ff3603e8c100300fda363658e10b23James Zern// met:
110a39d0a697ff3603e8c100300fda363658e10b23James Zern//
120a39d0a697ff3603e8c100300fda363658e10b23James Zern//     * Redistributions of source code must retain the above copyright
130a39d0a697ff3603e8c100300fda363658e10b23James Zern// notice, this list of conditions and the following disclaimer.
140a39d0a697ff3603e8c100300fda363658e10b23James Zern//     * Redistributions in binary form must reproduce the above
150a39d0a697ff3603e8c100300fda363658e10b23James Zern// copyright notice, this list of conditions and the following disclaimer
160a39d0a697ff3603e8c100300fda363658e10b23James Zern// in the documentation and/or other materials provided with the
170a39d0a697ff3603e8c100300fda363658e10b23James Zern// distribution.
180a39d0a697ff3603e8c100300fda363658e10b23James Zern//     * Neither the name of Google Inc. nor the names of its
190a39d0a697ff3603e8c100300fda363658e10b23James Zern// contributors may be used to endorse or promote products derived from
200a39d0a697ff3603e8c100300fda363658e10b23James Zern// this software without specific prior written permission.
210a39d0a697ff3603e8c100300fda363658e10b23James Zern//
220a39d0a697ff3603e8c100300fda363658e10b23James Zern// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
230a39d0a697ff3603e8c100300fda363658e10b23James Zern// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
240a39d0a697ff3603e8c100300fda363658e10b23James Zern// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
250a39d0a697ff3603e8c100300fda363658e10b23James Zern// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
260a39d0a697ff3603e8c100300fda363658e10b23James Zern// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
270a39d0a697ff3603e8c100300fda363658e10b23James Zern// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
280a39d0a697ff3603e8c100300fda363658e10b23James Zern// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
290a39d0a697ff3603e8c100300fda363658e10b23James Zern// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
300a39d0a697ff3603e8c100300fda363658e10b23James Zern// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
310a39d0a697ff3603e8c100300fda363658e10b23James Zern// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
320a39d0a697ff3603e8c100300fda363658e10b23James Zern// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
330a39d0a697ff3603e8c100300fda363658e10b23James Zern//
340a39d0a697ff3603e8c100300fda363658e10b23James Zern// Authors: vladl@google.com (Vlad Losev)
350a39d0a697ff3603e8c100300fda363658e10b23James Zern//
360a39d0a697ff3603e8c100300fda363658e10b23James Zern// Macros and functions for implementing parameterized tests
370a39d0a697ff3603e8c100300fda363658e10b23James Zern// in Google C++ Testing Framework (Google Test)
380a39d0a697ff3603e8c100300fda363658e10b23James Zern//
390a39d0a697ff3603e8c100300fda363658e10b23James Zern// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
400a39d0a697ff3603e8c100300fda363658e10b23James Zern//
410a39d0a697ff3603e8c100300fda363658e10b23James Zern#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
420a39d0a697ff3603e8c100300fda363658e10b23James Zern#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
430a39d0a697ff3603e8c100300fda363658e10b23James Zern
440a39d0a697ff3603e8c100300fda363658e10b23James Zern
450a39d0a697ff3603e8c100300fda363658e10b23James Zern// Value-parameterized tests allow you to test your code with different
460a39d0a697ff3603e8c100300fda363658e10b23James Zern// parameters without writing multiple copies of the same test.
470a39d0a697ff3603e8c100300fda363658e10b23James Zern//
480a39d0a697ff3603e8c100300fda363658e10b23James Zern// Here is how you use value-parameterized tests:
490a39d0a697ff3603e8c100300fda363658e10b23James Zern
500a39d0a697ff3603e8c100300fda363658e10b23James Zern#if 0
510a39d0a697ff3603e8c100300fda363658e10b23James Zern
520a39d0a697ff3603e8c100300fda363658e10b23James Zern// To write value-parameterized tests, first you should define a fixture
530a39d0a697ff3603e8c100300fda363658e10b23James Zern// class. It is usually derived from testing::TestWithParam<T> (see below for
540a39d0a697ff3603e8c100300fda363658e10b23James Zern// another inheritance scheme that's sometimes useful in more complicated
550a39d0a697ff3603e8c100300fda363658e10b23James Zern// class hierarchies), where the type of your parameter values.
560a39d0a697ff3603e8c100300fda363658e10b23James Zern// TestWithParam<T> is itself derived from testing::Test. T can be any
570a39d0a697ff3603e8c100300fda363658e10b23James Zern// copyable type. If it's a raw pointer, you are responsible for managing the
580a39d0a697ff3603e8c100300fda363658e10b23James Zern// lifespan of the pointed values.
590a39d0a697ff3603e8c100300fda363658e10b23James Zern
600a39d0a697ff3603e8c100300fda363658e10b23James Zernclass FooTest : public ::testing::TestWithParam<const char*> {
610a39d0a697ff3603e8c100300fda363658e10b23James Zern  // You can implement all the usual class fixture members here.
620a39d0a697ff3603e8c100300fda363658e10b23James Zern};
630a39d0a697ff3603e8c100300fda363658e10b23James Zern
640a39d0a697ff3603e8c100300fda363658e10b23James Zern// Then, use the TEST_P macro to define as many parameterized tests
650a39d0a697ff3603e8c100300fda363658e10b23James Zern// for this fixture as you want. The _P suffix is for "parameterized"
660a39d0a697ff3603e8c100300fda363658e10b23James Zern// or "pattern", whichever you prefer to think.
670a39d0a697ff3603e8c100300fda363658e10b23James Zern
680a39d0a697ff3603e8c100300fda363658e10b23James ZernTEST_P(FooTest, DoesBlah) {
690a39d0a697ff3603e8c100300fda363658e10b23James Zern  // Inside a test, access the test parameter with the GetParam() method
700a39d0a697ff3603e8c100300fda363658e10b23James Zern  // of the TestWithParam<T> class:
710a39d0a697ff3603e8c100300fda363658e10b23James Zern  EXPECT_TRUE(foo.Blah(GetParam()));
720a39d0a697ff3603e8c100300fda363658e10b23James Zern  ...
730a39d0a697ff3603e8c100300fda363658e10b23James Zern}
740a39d0a697ff3603e8c100300fda363658e10b23James Zern
750a39d0a697ff3603e8c100300fda363658e10b23James ZernTEST_P(FooTest, HasBlahBlah) {
760a39d0a697ff3603e8c100300fda363658e10b23James Zern  ...
770a39d0a697ff3603e8c100300fda363658e10b23James Zern}
780a39d0a697ff3603e8c100300fda363658e10b23James Zern
790a39d0a697ff3603e8c100300fda363658e10b23James Zern// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
800a39d0a697ff3603e8c100300fda363658e10b23James Zern// case with any set of parameters you want. Google Test defines a number
810a39d0a697ff3603e8c100300fda363658e10b23James Zern// of functions for generating test parameters. They return what we call
820a39d0a697ff3603e8c100300fda363658e10b23James Zern// (surprise!) parameter generators. Here is a  summary of them, which
830a39d0a697ff3603e8c100300fda363658e10b23James Zern// are all in the testing namespace:
840a39d0a697ff3603e8c100300fda363658e10b23James Zern//
850a39d0a697ff3603e8c100300fda363658e10b23James Zern//
860a39d0a697ff3603e8c100300fda363658e10b23James Zern//  Range(begin, end [, step]) - Yields values {begin, begin+step,
870a39d0a697ff3603e8c100300fda363658e10b23James Zern//                               begin+step+step, ...}. The values do not
880a39d0a697ff3603e8c100300fda363658e10b23James Zern//                               include end. step defaults to 1.
890a39d0a697ff3603e8c100300fda363658e10b23James Zern//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
900a39d0a697ff3603e8c100300fda363658e10b23James Zern//  ValuesIn(container)        - Yields values from a C-style array, an STL
910a39d0a697ff3603e8c100300fda363658e10b23James Zern//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
920a39d0a697ff3603e8c100300fda363658e10b23James Zern//  Bool()                     - Yields sequence {false, true}.
930a39d0a697ff3603e8c100300fda363658e10b23James Zern//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
940a39d0a697ff3603e8c100300fda363658e10b23James Zern//                               for the math savvy) of the values generated
950a39d0a697ff3603e8c100300fda363658e10b23James Zern//                               by the N generators.
960a39d0a697ff3603e8c100300fda363658e10b23James Zern//
970a39d0a697ff3603e8c100300fda363658e10b23James Zern// For more details, see comments at the definitions of these functions below
980a39d0a697ff3603e8c100300fda363658e10b23James Zern// in this file.
990a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1000a39d0a697ff3603e8c100300fda363658e10b23James Zern// The following statement will instantiate tests from the FooTest test case
1010a39d0a697ff3603e8c100300fda363658e10b23James Zern// each with parameter values "meeny", "miny", and "moe".
1020a39d0a697ff3603e8c100300fda363658e10b23James Zern
1030a39d0a697ff3603e8c100300fda363658e10b23James ZernINSTANTIATE_TEST_CASE_P(InstantiationName,
1040a39d0a697ff3603e8c100300fda363658e10b23James Zern                        FooTest,
1050a39d0a697ff3603e8c100300fda363658e10b23James Zern                        Values("meeny", "miny", "moe"));
1060a39d0a697ff3603e8c100300fda363658e10b23James Zern
1070a39d0a697ff3603e8c100300fda363658e10b23James Zern// To distinguish different instances of the pattern, (yes, you
1080a39d0a697ff3603e8c100300fda363658e10b23James Zern// can instantiate it more then once) the first argument to the
1090a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
1100a39d0a697ff3603e8c100300fda363658e10b23James Zern// actual test case name. Remember to pick unique prefixes for different
1110a39d0a697ff3603e8c100300fda363658e10b23James Zern// instantiations. The tests from the instantiation above will have
1120a39d0a697ff3603e8c100300fda363658e10b23James Zern// these names:
1130a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1140a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
1150a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
1160a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
1170a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
1180a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
1190a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
1200a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1210a39d0a697ff3603e8c100300fda363658e10b23James Zern// You can use these names in --gtest_filter.
1220a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1230a39d0a697ff3603e8c100300fda363658e10b23James Zern// This statement will instantiate all tests from FooTest again, each
1240a39d0a697ff3603e8c100300fda363658e10b23James Zern// with parameter values "cat" and "dog":
1250a39d0a697ff3603e8c100300fda363658e10b23James Zern
1260a39d0a697ff3603e8c100300fda363658e10b23James Zernconst char* pets[] = {"cat", "dog"};
1270a39d0a697ff3603e8c100300fda363658e10b23James ZernINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
1280a39d0a697ff3603e8c100300fda363658e10b23James Zern
1290a39d0a697ff3603e8c100300fda363658e10b23James Zern// The tests from the instantiation above will have these names:
1300a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1310a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
1320a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
1330a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
1340a39d0a697ff3603e8c100300fda363658e10b23James Zern//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
1350a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1360a39d0a697ff3603e8c100300fda363658e10b23James Zern// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
1370a39d0a697ff3603e8c100300fda363658e10b23James Zern// in the given test case, whether their definitions come before or
1380a39d0a697ff3603e8c100300fda363658e10b23James Zern// AFTER the INSTANTIATE_TEST_CASE_P statement.
1390a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1400a39d0a697ff3603e8c100300fda363658e10b23James Zern// Please also note that generator expressions (including parameters to the
1410a39d0a697ff3603e8c100300fda363658e10b23James Zern// generators) are evaluated in InitGoogleTest(), after main() has started.
1420a39d0a697ff3603e8c100300fda363658e10b23James Zern// This allows the user on one hand, to adjust generator parameters in order
1430a39d0a697ff3603e8c100300fda363658e10b23James Zern// to dynamically determine a set of tests to run and on the other hand,
1440a39d0a697ff3603e8c100300fda363658e10b23James Zern// give the user a chance to inspect the generated tests with Google Test
1450a39d0a697ff3603e8c100300fda363658e10b23James Zern// reflection API before RUN_ALL_TESTS() is executed.
1460a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1470a39d0a697ff3603e8c100300fda363658e10b23James Zern// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
1480a39d0a697ff3603e8c100300fda363658e10b23James Zern// for more examples.
1490a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1500a39d0a697ff3603e8c100300fda363658e10b23James Zern// In the future, we plan to publish the API for defining new parameter
1510a39d0a697ff3603e8c100300fda363658e10b23James Zern// generators. But for now this interface remains part of the internal
1520a39d0a697ff3603e8c100300fda363658e10b23James Zern// implementation and is subject to change.
1530a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1540a39d0a697ff3603e8c100300fda363658e10b23James Zern//
1550a39d0a697ff3603e8c100300fda363658e10b23James Zern// A parameterized test fixture must be derived from testing::Test and from
1560a39d0a697ff3603e8c100300fda363658e10b23James Zern// testing::WithParamInterface<T>, where T is the type of the parameter
1570a39d0a697ff3603e8c100300fda363658e10b23James Zern// values. Inheriting from TestWithParam<T> satisfies that requirement because
1580a39d0a697ff3603e8c100300fda363658e10b23James Zern// TestWithParam<T> inherits from both Test and WithParamInterface. In more
1590a39d0a697ff3603e8c100300fda363658e10b23James Zern// complicated hierarchies, however, it is occasionally useful to inherit
1600a39d0a697ff3603e8c100300fda363658e10b23James Zern// separately from Test and WithParamInterface. For example:
1610a39d0a697ff3603e8c100300fda363658e10b23James Zern
1620a39d0a697ff3603e8c100300fda363658e10b23James Zernclass BaseTest : public ::testing::Test {
1630a39d0a697ff3603e8c100300fda363658e10b23James Zern  // You can inherit all the usual members for a non-parameterized test
1640a39d0a697ff3603e8c100300fda363658e10b23James Zern  // fixture here.
1650a39d0a697ff3603e8c100300fda363658e10b23James Zern};
1660a39d0a697ff3603e8c100300fda363658e10b23James Zern
1670a39d0a697ff3603e8c100300fda363658e10b23James Zernclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
1680a39d0a697ff3603e8c100300fda363658e10b23James Zern  // The usual test fixture members go here too.
1690a39d0a697ff3603e8c100300fda363658e10b23James Zern};
1700a39d0a697ff3603e8c100300fda363658e10b23James Zern
1710a39d0a697ff3603e8c100300fda363658e10b23James ZernTEST_F(BaseTest, HasFoo) {
1720a39d0a697ff3603e8c100300fda363658e10b23James Zern  // This is an ordinary non-parameterized test.
1730a39d0a697ff3603e8c100300fda363658e10b23James Zern}
1740a39d0a697ff3603e8c100300fda363658e10b23James Zern
1750a39d0a697ff3603e8c100300fda363658e10b23James ZernTEST_P(DerivedTest, DoesBlah) {
1760a39d0a697ff3603e8c100300fda363658e10b23James Zern  // GetParam works just the same here as if you inherit from TestWithParam.
1770a39d0a697ff3603e8c100300fda363658e10b23James Zern  EXPECT_TRUE(foo.Blah(GetParam()));
1780a39d0a697ff3603e8c100300fda363658e10b23James Zern}
1790a39d0a697ff3603e8c100300fda363658e10b23James Zern
1800a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif  // 0
1810a39d0a697ff3603e8c100300fda363658e10b23James Zern
1820a39d0a697ff3603e8c100300fda363658e10b23James Zern#include "gtest/internal/gtest-port.h"
1830a39d0a697ff3603e8c100300fda363658e10b23James Zern
1840a39d0a697ff3603e8c100300fda363658e10b23James Zern#if !GTEST_OS_SYMBIAN
1850a39d0a697ff3603e8c100300fda363658e10b23James Zern# include <utility>
1860a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif
1870a39d0a697ff3603e8c100300fda363658e10b23James Zern
1880a39d0a697ff3603e8c100300fda363658e10b23James Zern// scripts/fuse_gtest.py depends on gtest's own header being #included
1890a39d0a697ff3603e8c100300fda363658e10b23James Zern// *unconditionally*.  Therefore these #includes cannot be moved
1900a39d0a697ff3603e8c100300fda363658e10b23James Zern// inside #if GTEST_HAS_PARAM_TEST.
1910a39d0a697ff3603e8c100300fda363658e10b23James Zern#include "gtest/internal/gtest-internal.h"
1920a39d0a697ff3603e8c100300fda363658e10b23James Zern#include "gtest/internal/gtest-param-util.h"
1930a39d0a697ff3603e8c100300fda363658e10b23James Zern#include "gtest/internal/gtest-param-util-generated.h"
1940a39d0a697ff3603e8c100300fda363658e10b23James Zern
1950a39d0a697ff3603e8c100300fda363658e10b23James Zern#if GTEST_HAS_PARAM_TEST
1960a39d0a697ff3603e8c100300fda363658e10b23James Zern
1970a39d0a697ff3603e8c100300fda363658e10b23James Zernnamespace testing {
1980a39d0a697ff3603e8c100300fda363658e10b23James Zern
1990a39d0a697ff3603e8c100300fda363658e10b23James Zern// Functions producing parameter generators.
2000a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2010a39d0a697ff3603e8c100300fda363658e10b23James Zern// Google Test uses these generators to produce parameters for value-
2020a39d0a697ff3603e8c100300fda363658e10b23James Zern// parameterized tests. When a parameterized test case is instantiated
2030a39d0a697ff3603e8c100300fda363658e10b23James Zern// with a particular generator, Google Test creates and runs tests
2040a39d0a697ff3603e8c100300fda363658e10b23James Zern// for each element in the sequence produced by the generator.
2050a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2060a39d0a697ff3603e8c100300fda363658e10b23James Zern// In the following sample, tests from test case FooTest are instantiated
2070a39d0a697ff3603e8c100300fda363658e10b23James Zern// each three times with parameter values 3, 5, and 8:
2080a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2090a39d0a697ff3603e8c100300fda363658e10b23James Zern// class FooTest : public TestWithParam<int> { ... };
2100a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2110a39d0a697ff3603e8c100300fda363658e10b23James Zern// TEST_P(FooTest, TestThis) {
2120a39d0a697ff3603e8c100300fda363658e10b23James Zern// }
2130a39d0a697ff3603e8c100300fda363658e10b23James Zern// TEST_P(FooTest, TestThat) {
2140a39d0a697ff3603e8c100300fda363658e10b23James Zern// }
2150a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
2160a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2170a39d0a697ff3603e8c100300fda363658e10b23James Zern
2180a39d0a697ff3603e8c100300fda363658e10b23James Zern// Range() returns generators providing sequences of values in a range.
2190a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2200a39d0a697ff3603e8c100300fda363658e10b23James Zern// Synopsis:
2210a39d0a697ff3603e8c100300fda363658e10b23James Zern// Range(start, end)
2220a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing a sequence of values {start, start+1,
2230a39d0a697ff3603e8c100300fda363658e10b23James Zern//     start+2, ..., }.
2240a39d0a697ff3603e8c100300fda363658e10b23James Zern// Range(start, end, step)
2250a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing a sequence of values {start, start+step,
2260a39d0a697ff3603e8c100300fda363658e10b23James Zern//     start+step+step, ..., }.
2270a39d0a697ff3603e8c100300fda363658e10b23James Zern// Notes:
2280a39d0a697ff3603e8c100300fda363658e10b23James Zern//   * The generated sequences never include end. For example, Range(1, 5)
2290a39d0a697ff3603e8c100300fda363658e10b23James Zern//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
2300a39d0a697ff3603e8c100300fda363658e10b23James Zern//     returns a generator producing {1, 3, 5, 7}.
2310a39d0a697ff3603e8c100300fda363658e10b23James Zern//   * start and end must have the same type. That type may be any integral or
2320a39d0a697ff3603e8c100300fda363658e10b23James Zern//     floating-point type or a user defined type satisfying these conditions:
2330a39d0a697ff3603e8c100300fda363658e10b23James Zern//     * It must be assignable (have operator=() defined).
2340a39d0a697ff3603e8c100300fda363658e10b23James Zern//     * It must have operator+() (operator+(int-compatible type) for
2350a39d0a697ff3603e8c100300fda363658e10b23James Zern//       two-operand version).
2360a39d0a697ff3603e8c100300fda363658e10b23James Zern//     * It must have operator<() defined.
2370a39d0a697ff3603e8c100300fda363658e10b23James Zern//     Elements in the resulting sequences will also have that type.
2380a39d0a697ff3603e8c100300fda363658e10b23James Zern//   * Condition start < end must be satisfied in order for resulting sequences
2390a39d0a697ff3603e8c100300fda363658e10b23James Zern//     to contain any elements.
2400a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2410a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T, typename IncrementT>
2420a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
2430a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ParamGenerator<T>(
2440a39d0a697ff3603e8c100300fda363658e10b23James Zern      new internal::RangeGenerator<T, IncrementT>(start, end, step));
2450a39d0a697ff3603e8c100300fda363658e10b23James Zern}
2460a39d0a697ff3603e8c100300fda363658e10b23James Zern
2470a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T>
2480a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ParamGenerator<T> Range(T start, T end) {
2490a39d0a697ff3603e8c100300fda363658e10b23James Zern  return Range(start, end, 1);
2500a39d0a697ff3603e8c100300fda363658e10b23James Zern}
2510a39d0a697ff3603e8c100300fda363658e10b23James Zern
2520a39d0a697ff3603e8c100300fda363658e10b23James Zern// ValuesIn() function allows generation of tests with parameters coming from
2530a39d0a697ff3603e8c100300fda363658e10b23James Zern// a container.
2540a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2550a39d0a697ff3603e8c100300fda363658e10b23James Zern// Synopsis:
2560a39d0a697ff3603e8c100300fda363658e10b23James Zern// ValuesIn(const T (&array)[N])
2570a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing sequences with elements from
2580a39d0a697ff3603e8c100300fda363658e10b23James Zern//     a C-style array.
2590a39d0a697ff3603e8c100300fda363658e10b23James Zern// ValuesIn(const Container& container)
2600a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing sequences with elements from
2610a39d0a697ff3603e8c100300fda363658e10b23James Zern//     an STL-style container.
2620a39d0a697ff3603e8c100300fda363658e10b23James Zern// ValuesIn(Iterator begin, Iterator end)
2630a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing sequences with elements from
2640a39d0a697ff3603e8c100300fda363658e10b23James Zern//     a range [begin, end) defined by a pair of STL-style iterators. These
2650a39d0a697ff3603e8c100300fda363658e10b23James Zern//     iterators can also be plain C pointers.
2660a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2670a39d0a697ff3603e8c100300fda363658e10b23James Zern// Please note that ValuesIn copies the values from the containers
2680a39d0a697ff3603e8c100300fda363658e10b23James Zern// passed in and keeps them to generate tests in RUN_ALL_TESTS().
2690a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2700a39d0a697ff3603e8c100300fda363658e10b23James Zern// Examples:
2710a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2720a39d0a697ff3603e8c100300fda363658e10b23James Zern// This instantiates tests from test case StringTest
2730a39d0a697ff3603e8c100300fda363658e10b23James Zern// each with C-string values of "foo", "bar", and "baz":
2740a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2750a39d0a697ff3603e8c100300fda363658e10b23James Zern// const char* strings[] = {"foo", "bar", "baz"};
2760a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
2770a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2780a39d0a697ff3603e8c100300fda363658e10b23James Zern// This instantiates tests from test case StlStringTest
2790a39d0a697ff3603e8c100300fda363658e10b23James Zern// each with STL strings with values "a" and "b":
2800a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2810a39d0a697ff3603e8c100300fda363658e10b23James Zern// ::std::vector< ::std::string> GetParameterStrings() {
2820a39d0a697ff3603e8c100300fda363658e10b23James Zern//   ::std::vector< ::std::string> v;
2830a39d0a697ff3603e8c100300fda363658e10b23James Zern//   v.push_back("a");
2840a39d0a697ff3603e8c100300fda363658e10b23James Zern//   v.push_back("b");
2850a39d0a697ff3603e8c100300fda363658e10b23James Zern//   return v;
2860a39d0a697ff3603e8c100300fda363658e10b23James Zern// }
2870a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2880a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(CharSequence,
2890a39d0a697ff3603e8c100300fda363658e10b23James Zern//                         StlStringTest,
2900a39d0a697ff3603e8c100300fda363658e10b23James Zern//                         ValuesIn(GetParameterStrings()));
2910a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2920a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2930a39d0a697ff3603e8c100300fda363658e10b23James Zern// This will also instantiate tests from CharTest
2940a39d0a697ff3603e8c100300fda363658e10b23James Zern// each with parameter values 'a' and 'b':
2950a39d0a697ff3603e8c100300fda363658e10b23James Zern//
2960a39d0a697ff3603e8c100300fda363658e10b23James Zern// ::std::list<char> GetParameterChars() {
2970a39d0a697ff3603e8c100300fda363658e10b23James Zern//   ::std::list<char> list;
2980a39d0a697ff3603e8c100300fda363658e10b23James Zern//   list.push_back('a');
2990a39d0a697ff3603e8c100300fda363658e10b23James Zern//   list.push_back('b');
3000a39d0a697ff3603e8c100300fda363658e10b23James Zern//   return list;
3010a39d0a697ff3603e8c100300fda363658e10b23James Zern// }
3020a39d0a697ff3603e8c100300fda363658e10b23James Zern// ::std::list<char> l = GetParameterChars();
3030a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(CharSequence2,
3040a39d0a697ff3603e8c100300fda363658e10b23James Zern//                         CharTest,
3050a39d0a697ff3603e8c100300fda363658e10b23James Zern//                         ValuesIn(l.begin(), l.end()));
3060a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3070a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename ForwardIterator>
3080a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ParamGenerator<
3090a39d0a697ff3603e8c100300fda363658e10b23James Zern  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
3100a39d0a697ff3603e8c100300fda363658e10b23James ZernValuesIn(ForwardIterator begin, ForwardIterator end) {
3110a39d0a697ff3603e8c100300fda363658e10b23James Zern  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
3120a39d0a697ff3603e8c100300fda363658e10b23James Zern      ::value_type ParamType;
3130a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ParamGenerator<ParamType>(
3140a39d0a697ff3603e8c100300fda363658e10b23James Zern      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
3150a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3160a39d0a697ff3603e8c100300fda363658e10b23James Zern
3170a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T, size_t N>
3180a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
3190a39d0a697ff3603e8c100300fda363658e10b23James Zern  return ValuesIn(array, array + N);
3200a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3210a39d0a697ff3603e8c100300fda363658e10b23James Zern
3220a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <class Container>
3230a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ParamGenerator<typename Container::value_type> ValuesIn(
3240a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Container& container) {
3250a39d0a697ff3603e8c100300fda363658e10b23James Zern  return ValuesIn(container.begin(), container.end());
3260a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3270a39d0a697ff3603e8c100300fda363658e10b23James Zern
3280a39d0a697ff3603e8c100300fda363658e10b23James Zern// Values() allows generating tests from explicitly specified list of
3290a39d0a697ff3603e8c100300fda363658e10b23James Zern// parameters.
3300a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3310a39d0a697ff3603e8c100300fda363658e10b23James Zern// Synopsis:
3320a39d0a697ff3603e8c100300fda363658e10b23James Zern// Values(T v1, T v2, ..., T vN)
3330a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing sequences with elements v1, v2, ..., vN.
3340a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3350a39d0a697ff3603e8c100300fda363658e10b23James Zern// For example, this instantiates tests from test case BarTest each
3360a39d0a697ff3603e8c100300fda363658e10b23James Zern// with values "one", "two", and "three":
3370a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3380a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
3390a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3400a39d0a697ff3603e8c100300fda363658e10b23James Zern// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
3410a39d0a697ff3603e8c100300fda363658e10b23James Zern// The exact type of values will depend on the type of parameter in BazTest.
3420a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3430a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
3440a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3450a39d0a697ff3603e8c100300fda363658e10b23James Zern// Currently, Values() supports from 1 to 50 parameters.
3460a39d0a697ff3603e8c100300fda363658e10b23James Zern//
3470a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1>
3480a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray1<T1> Values(T1 v1) {
3490a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray1<T1>(v1);
3500a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3510a39d0a697ff3603e8c100300fda363658e10b23James Zern
3520a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2>
3530a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
3540a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray2<T1, T2>(v1, v2);
3550a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3560a39d0a697ff3603e8c100300fda363658e10b23James Zern
3570a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3>
3580a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
3590a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
3600a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3610a39d0a697ff3603e8c100300fda363658e10b23James Zern
3620a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4>
3630a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
3640a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
3650a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3660a39d0a697ff3603e8c100300fda363658e10b23James Zern
3670a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3680a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
3690a39d0a697ff3603e8c100300fda363658e10b23James Zern    T5 v5) {
3700a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
3710a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3720a39d0a697ff3603e8c100300fda363658e10b23James Zern
3730a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3740a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6>
3750a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
3760a39d0a697ff3603e8c100300fda363658e10b23James Zern    T4 v4, T5 v5, T6 v6) {
3770a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
3780a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3790a39d0a697ff3603e8c100300fda363658e10b23James Zern
3800a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3810a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7>
3820a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
3830a39d0a697ff3603e8c100300fda363658e10b23James Zern    T4 v4, T5 v5, T6 v6, T7 v7) {
3840a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
3850a39d0a697ff3603e8c100300fda363658e10b23James Zern      v6, v7);
3860a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3870a39d0a697ff3603e8c100300fda363658e10b23James Zern
3880a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3890a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8>
3900a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
3910a39d0a697ff3603e8c100300fda363658e10b23James Zern    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
3920a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
3930a39d0a697ff3603e8c100300fda363658e10b23James Zern      v5, v6, v7, v8);
3940a39d0a697ff3603e8c100300fda363658e10b23James Zern}
3950a39d0a697ff3603e8c100300fda363658e10b23James Zern
3960a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3970a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9>
3980a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
3990a39d0a697ff3603e8c100300fda363658e10b23James Zern    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
4000a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
4010a39d0a697ff3603e8c100300fda363658e10b23James Zern      v4, v5, v6, v7, v8, v9);
4020a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4030a39d0a697ff3603e8c100300fda363658e10b23James Zern
4040a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4050a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10>
4060a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
4070a39d0a697ff3603e8c100300fda363658e10b23James Zern    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
4080a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
4090a39d0a697ff3603e8c100300fda363658e10b23James Zern      v2, v3, v4, v5, v6, v7, v8, v9, v10);
4100a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4110a39d0a697ff3603e8c100300fda363658e10b23James Zern
4120a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4130a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4140a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11>
4150a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4160a39d0a697ff3603e8c100300fda363658e10b23James Zern    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4170a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11) {
4180a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4190a39d0a697ff3603e8c100300fda363658e10b23James Zern      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
4200a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4210a39d0a697ff3603e8c100300fda363658e10b23James Zern
4220a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4230a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4240a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12>
4250a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4260a39d0a697ff3603e8c100300fda363658e10b23James Zern    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4270a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12) {
4280a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4290a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
4300a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4310a39d0a697ff3603e8c100300fda363658e10b23James Zern
4320a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4330a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4340a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13>
4350a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4360a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4370a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13) {
4380a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4390a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
4400a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4410a39d0a697ff3603e8c100300fda363658e10b23James Zern
4420a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4430a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4440a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14>
4450a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4460a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4470a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
4480a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4490a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
4500a39d0a697ff3603e8c100300fda363658e10b23James Zern      v14);
4510a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4520a39d0a697ff3603e8c100300fda363658e10b23James Zern
4530a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4540a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4550a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15>
4560a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4570a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
4580a39d0a697ff3603e8c100300fda363658e10b23James Zern    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
4590a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4600a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
4610a39d0a697ff3603e8c100300fda363658e10b23James Zern      v13, v14, v15);
4620a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4630a39d0a697ff3603e8c100300fda363658e10b23James Zern
4640a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4650a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4660a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
4670a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16>
4680a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4690a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4700a39d0a697ff3603e8c100300fda363658e10b23James Zern    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4710a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16) {
4720a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4730a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
4740a39d0a697ff3603e8c100300fda363658e10b23James Zern      v12, v13, v14, v15, v16);
4750a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4760a39d0a697ff3603e8c100300fda363658e10b23James Zern
4770a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4780a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4790a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
4800a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17>
4810a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4820a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4830a39d0a697ff3603e8c100300fda363658e10b23James Zern    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4840a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17) {
4850a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4860a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
4870a39d0a697ff3603e8c100300fda363658e10b23James Zern      v11, v12, v13, v14, v15, v16, v17);
4880a39d0a697ff3603e8c100300fda363658e10b23James Zern}
4890a39d0a697ff3603e8c100300fda363658e10b23James Zern
4900a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4910a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
4920a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
4930a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18>
4940a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4950a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
4960a39d0a697ff3603e8c100300fda363658e10b23James Zern    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4970a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18) {
4980a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4990a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
5000a39d0a697ff3603e8c100300fda363658e10b23James Zern      v10, v11, v12, v13, v14, v15, v16, v17, v18);
5010a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5020a39d0a697ff3603e8c100300fda363658e10b23James Zern
5030a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5040a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5050a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5060a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19>
5070a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5080a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
5090a39d0a697ff3603e8c100300fda363658e10b23James Zern    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
5100a39d0a697ff3603e8c100300fda363658e10b23James Zern    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
5110a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5120a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
5130a39d0a697ff3603e8c100300fda363658e10b23James Zern      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
5140a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5150a39d0a697ff3603e8c100300fda363658e10b23James Zern
5160a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5170a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5180a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5190a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20>
5200a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5210a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5220a39d0a697ff3603e8c100300fda363658e10b23James Zern    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5230a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
5240a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5250a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
5260a39d0a697ff3603e8c100300fda363658e10b23James Zern      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
5270a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5280a39d0a697ff3603e8c100300fda363658e10b23James Zern
5290a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5300a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5310a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5320a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
5330a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21>
5340a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5350a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5360a39d0a697ff3603e8c100300fda363658e10b23James Zern    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5370a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
5380a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5390a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
5400a39d0a697ff3603e8c100300fda363658e10b23James Zern      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
5410a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5420a39d0a697ff3603e8c100300fda363658e10b23James Zern
5430a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5440a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5450a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5460a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
5470a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22>
5480a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5490a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
5500a39d0a697ff3603e8c100300fda363658e10b23James Zern    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5510a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5520a39d0a697ff3603e8c100300fda363658e10b23James Zern    T21 v21, T22 v22) {
5530a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5540a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
5550a39d0a697ff3603e8c100300fda363658e10b23James Zern      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5560a39d0a697ff3603e8c100300fda363658e10b23James Zern      v20, v21, v22);
5570a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5580a39d0a697ff3603e8c100300fda363658e10b23James Zern
5590a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5600a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5610a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5620a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
5630a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23>
5640a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5650a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
5660a39d0a697ff3603e8c100300fda363658e10b23James Zern    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5670a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5680a39d0a697ff3603e8c100300fda363658e10b23James Zern    T21 v21, T22 v22, T23 v23) {
5690a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5700a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
5710a39d0a697ff3603e8c100300fda363658e10b23James Zern      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5720a39d0a697ff3603e8c100300fda363658e10b23James Zern      v20, v21, v22, v23);
5730a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5740a39d0a697ff3603e8c100300fda363658e10b23James Zern
5750a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5760a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5770a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5780a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
5790a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24>
5800a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5810a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
5820a39d0a697ff3603e8c100300fda363658e10b23James Zern    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5830a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5840a39d0a697ff3603e8c100300fda363658e10b23James Zern    T21 v21, T22 v22, T23 v23, T24 v24) {
5850a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5860a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
5870a39d0a697ff3603e8c100300fda363658e10b23James Zern      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
5880a39d0a697ff3603e8c100300fda363658e10b23James Zern      v19, v20, v21, v22, v23, v24);
5890a39d0a697ff3603e8c100300fda363658e10b23James Zern}
5900a39d0a697ff3603e8c100300fda363658e10b23James Zern
5910a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5920a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
5930a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
5940a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
5950a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25>
5960a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5970a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
5980a39d0a697ff3603e8c100300fda363658e10b23James Zern    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
5990a39d0a697ff3603e8c100300fda363658e10b23James Zern    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
6000a39d0a697ff3603e8c100300fda363658e10b23James Zern    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
6010a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6020a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
6030a39d0a697ff3603e8c100300fda363658e10b23James Zern      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
6040a39d0a697ff3603e8c100300fda363658e10b23James Zern      v18, v19, v20, v21, v22, v23, v24, v25);
6050a39d0a697ff3603e8c100300fda363658e10b23James Zern}
6060a39d0a697ff3603e8c100300fda363658e10b23James Zern
6070a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6080a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
6090a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
6100a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
6110a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
6120a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26>
6130a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6140a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6150a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6160a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6170a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6180a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26) {
6190a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6200a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6210a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
6220a39d0a697ff3603e8c100300fda363658e10b23James Zern      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
6230a39d0a697ff3603e8c100300fda363658e10b23James Zern}
6240a39d0a697ff3603e8c100300fda363658e10b23James Zern
6250a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6260a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
6270a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
6280a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
6290a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
6300a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27>
6310a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6320a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6330a39d0a697ff3603e8c100300fda363658e10b23James Zern    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6340a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6350a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6360a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27) {
6370a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6380a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6390a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
6400a39d0a697ff3603e8c100300fda363658e10b23James Zern      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
6410a39d0a697ff3603e8c100300fda363658e10b23James Zern}
6420a39d0a697ff3603e8c100300fda363658e10b23James Zern
6430a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6440a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
6450a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
6460a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
6470a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
6480a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28>
6490a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6500a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6510a39d0a697ff3603e8c100300fda363658e10b23James Zern    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6520a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6530a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6540a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27, T28 v28) {
6550a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6560a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6570a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
6580a39d0a697ff3603e8c100300fda363658e10b23James Zern      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
6590a39d0a697ff3603e8c100300fda363658e10b23James Zern      v28);
6600a39d0a697ff3603e8c100300fda363658e10b23James Zern}
6610a39d0a697ff3603e8c100300fda363658e10b23James Zern
6620a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6630a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
6640a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
6650a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
6660a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
6670a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29>
6680a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6690a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6700a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6710a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6720a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6730a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27, T28 v28, T29 v29) {
6740a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6750a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6760a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
6770a39d0a697ff3603e8c100300fda363658e10b23James Zern      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
6780a39d0a697ff3603e8c100300fda363658e10b23James Zern      v27, v28, v29);
6790a39d0a697ff3603e8c100300fda363658e10b23James Zern}
6800a39d0a697ff3603e8c100300fda363658e10b23James Zern
6810a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6820a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
6830a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
6840a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
6850a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
6860a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30>
6870a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6880a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6890a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
6900a39d0a697ff3603e8c100300fda363658e10b23James Zern    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
6910a39d0a697ff3603e8c100300fda363658e10b23James Zern    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
6920a39d0a697ff3603e8c100300fda363658e10b23James Zern    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
6930a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6940a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6950a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
6960a39d0a697ff3603e8c100300fda363658e10b23James Zern      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
6970a39d0a697ff3603e8c100300fda363658e10b23James Zern      v26, v27, v28, v29, v30);
6980a39d0a697ff3603e8c100300fda363658e10b23James Zern}
6990a39d0a697ff3603e8c100300fda363658e10b23James Zern
7000a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7010a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
7020a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
7030a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
7040a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
7050a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
7060a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31>
7070a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7080a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7090a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7100a39d0a697ff3603e8c100300fda363658e10b23James Zern    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7110a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7120a39d0a697ff3603e8c100300fda363658e10b23James Zern    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
7130a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7140a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7150a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
7160a39d0a697ff3603e8c100300fda363658e10b23James Zern      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
7170a39d0a697ff3603e8c100300fda363658e10b23James Zern      v25, v26, v27, v28, v29, v30, v31);
7180a39d0a697ff3603e8c100300fda363658e10b23James Zern}
7190a39d0a697ff3603e8c100300fda363658e10b23James Zern
7200a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7210a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
7220a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
7230a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
7240a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
7250a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
7260a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32>
7270a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7280a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7290a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7300a39d0a697ff3603e8c100300fda363658e10b23James Zern    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7310a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7320a39d0a697ff3603e8c100300fda363658e10b23James Zern    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7330a39d0a697ff3603e8c100300fda363658e10b23James Zern    T32 v32) {
7340a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7350a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7360a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
7370a39d0a697ff3603e8c100300fda363658e10b23James Zern      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7380a39d0a697ff3603e8c100300fda363658e10b23James Zern      v24, v25, v26, v27, v28, v29, v30, v31, v32);
7390a39d0a697ff3603e8c100300fda363658e10b23James Zern}
7400a39d0a697ff3603e8c100300fda363658e10b23James Zern
7410a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7420a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
7430a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
7440a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
7450a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
7460a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
7470a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33>
7480a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7490a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7500a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
7510a39d0a697ff3603e8c100300fda363658e10b23James Zern    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7520a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7530a39d0a697ff3603e8c100300fda363658e10b23James Zern    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7540a39d0a697ff3603e8c100300fda363658e10b23James Zern    T32 v32, T33 v33) {
7550a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7560a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7570a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
7580a39d0a697ff3603e8c100300fda363658e10b23James Zern      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7590a39d0a697ff3603e8c100300fda363658e10b23James Zern      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
7600a39d0a697ff3603e8c100300fda363658e10b23James Zern}
7610a39d0a697ff3603e8c100300fda363658e10b23James Zern
7620a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7630a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
7640a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
7650a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
7660a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
7670a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
7680a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34>
7690a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7700a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7710a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
7720a39d0a697ff3603e8c100300fda363658e10b23James Zern    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
7730a39d0a697ff3603e8c100300fda363658e10b23James Zern    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
7740a39d0a697ff3603e8c100300fda363658e10b23James Zern    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
7750a39d0a697ff3603e8c100300fda363658e10b23James Zern    T31 v31, T32 v32, T33 v33, T34 v34) {
7760a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7770a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7780a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
7790a39d0a697ff3603e8c100300fda363658e10b23James Zern      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
7800a39d0a697ff3603e8c100300fda363658e10b23James Zern      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
7810a39d0a697ff3603e8c100300fda363658e10b23James Zern}
7820a39d0a697ff3603e8c100300fda363658e10b23James Zern
7830a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7840a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
7850a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
7860a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
7870a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
7880a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
7890a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35>
7900a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7910a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7920a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
7930a39d0a697ff3603e8c100300fda363658e10b23James Zern    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
7940a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
7950a39d0a697ff3603e8c100300fda363658e10b23James Zern    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
7960a39d0a697ff3603e8c100300fda363658e10b23James Zern    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
7970a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7980a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7990a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
8000a39d0a697ff3603e8c100300fda363658e10b23James Zern      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
8010a39d0a697ff3603e8c100300fda363658e10b23James Zern      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
8020a39d0a697ff3603e8c100300fda363658e10b23James Zern}
8030a39d0a697ff3603e8c100300fda363658e10b23James Zern
8040a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8050a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
8060a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
8070a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
8080a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
8090a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
8100a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
8110a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36>
8120a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8130a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8140a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
8150a39d0a697ff3603e8c100300fda363658e10b23James Zern    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
8160a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
8170a39d0a697ff3603e8c100300fda363658e10b23James Zern    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
8180a39d0a697ff3603e8c100300fda363658e10b23James Zern    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
8190a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8200a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8210a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
8220a39d0a697ff3603e8c100300fda363658e10b23James Zern      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8230a39d0a697ff3603e8c100300fda363658e10b23James Zern      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8240a39d0a697ff3603e8c100300fda363658e10b23James Zern      v34, v35, v36);
8250a39d0a697ff3603e8c100300fda363658e10b23James Zern}
8260a39d0a697ff3603e8c100300fda363658e10b23James Zern
8270a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8280a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
8290a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
8300a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
8310a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
8320a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
8330a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
8340a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37>
8350a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8360a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8370a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
8380a39d0a697ff3603e8c100300fda363658e10b23James Zern    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8390a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8400a39d0a697ff3603e8c100300fda363658e10b23James Zern    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8410a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8420a39d0a697ff3603e8c100300fda363658e10b23James Zern    T37 v37) {
8430a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8440a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8450a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
8460a39d0a697ff3603e8c100300fda363658e10b23James Zern      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8470a39d0a697ff3603e8c100300fda363658e10b23James Zern      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8480a39d0a697ff3603e8c100300fda363658e10b23James Zern      v34, v35, v36, v37);
8490a39d0a697ff3603e8c100300fda363658e10b23James Zern}
8500a39d0a697ff3603e8c100300fda363658e10b23James Zern
8510a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8520a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
8530a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
8540a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
8550a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
8560a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
8570a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
8580a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38>
8590a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8600a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8610a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
8620a39d0a697ff3603e8c100300fda363658e10b23James Zern    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8630a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8640a39d0a697ff3603e8c100300fda363658e10b23James Zern    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8650a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8660a39d0a697ff3603e8c100300fda363658e10b23James Zern    T37 v37, T38 v38) {
8670a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8680a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8690a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
8700a39d0a697ff3603e8c100300fda363658e10b23James Zern      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
8710a39d0a697ff3603e8c100300fda363658e10b23James Zern      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
8720a39d0a697ff3603e8c100300fda363658e10b23James Zern      v33, v34, v35, v36, v37, v38);
8730a39d0a697ff3603e8c100300fda363658e10b23James Zern}
8740a39d0a697ff3603e8c100300fda363658e10b23James Zern
8750a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8760a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
8770a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
8780a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
8790a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
8800a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
8810a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
8820a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39>
8830a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8840a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8850a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
8860a39d0a697ff3603e8c100300fda363658e10b23James Zern    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8870a39d0a697ff3603e8c100300fda363658e10b23James Zern    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8880a39d0a697ff3603e8c100300fda363658e10b23James Zern    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8890a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8900a39d0a697ff3603e8c100300fda363658e10b23James Zern    T37 v37, T38 v38, T39 v39) {
8910a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8920a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8930a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
8940a39d0a697ff3603e8c100300fda363658e10b23James Zern      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
8950a39d0a697ff3603e8c100300fda363658e10b23James Zern      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
8960a39d0a697ff3603e8c100300fda363658e10b23James Zern      v32, v33, v34, v35, v36, v37, v38, v39);
8970a39d0a697ff3603e8c100300fda363658e10b23James Zern}
8980a39d0a697ff3603e8c100300fda363658e10b23James Zern
8990a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9000a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
9010a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
9020a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
9030a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
9040a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
9050a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
9060a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40>
9070a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9080a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9090a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
9100a39d0a697ff3603e8c100300fda363658e10b23James Zern    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
9110a39d0a697ff3603e8c100300fda363658e10b23James Zern    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
9120a39d0a697ff3603e8c100300fda363658e10b23James Zern    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
9130a39d0a697ff3603e8c100300fda363658e10b23James Zern    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
9140a39d0a697ff3603e8c100300fda363658e10b23James Zern    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
9150a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9160a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9170a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9180a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
9190a39d0a697ff3603e8c100300fda363658e10b23James Zern      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
9200a39d0a697ff3603e8c100300fda363658e10b23James Zern      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
9210a39d0a697ff3603e8c100300fda363658e10b23James Zern}
9220a39d0a697ff3603e8c100300fda363658e10b23James Zern
9230a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9240a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
9250a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
9260a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
9270a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
9280a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
9290a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
9300a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
9310a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41>
9320a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9330a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9340a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
9350a39d0a697ff3603e8c100300fda363658e10b23James Zern    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9360a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9370a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9380a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9390a39d0a697ff3603e8c100300fda363658e10b23James Zern    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
9400a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9410a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9420a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9430a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
9440a39d0a697ff3603e8c100300fda363658e10b23James Zern      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
9450a39d0a697ff3603e8c100300fda363658e10b23James Zern      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
9460a39d0a697ff3603e8c100300fda363658e10b23James Zern}
9470a39d0a697ff3603e8c100300fda363658e10b23James Zern
9480a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9490a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
9500a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
9510a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
9520a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
9530a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
9540a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
9550a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
9560a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42>
9570a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9580a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9590a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
9600a39d0a697ff3603e8c100300fda363658e10b23James Zern    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9610a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9620a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9630a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9640a39d0a697ff3603e8c100300fda363658e10b23James Zern    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9650a39d0a697ff3603e8c100300fda363658e10b23James Zern    T42 v42) {
9660a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9670a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9680a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9690a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
9700a39d0a697ff3603e8c100300fda363658e10b23James Zern      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
9710a39d0a697ff3603e8c100300fda363658e10b23James Zern      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
9720a39d0a697ff3603e8c100300fda363658e10b23James Zern      v42);
9730a39d0a697ff3603e8c100300fda363658e10b23James Zern}
9740a39d0a697ff3603e8c100300fda363658e10b23James Zern
9750a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9760a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
9770a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
9780a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
9790a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
9800a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
9810a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
9820a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
9830a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43>
9840a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9850a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9860a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
9870a39d0a697ff3603e8c100300fda363658e10b23James Zern    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9880a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9890a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9900a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9910a39d0a697ff3603e8c100300fda363658e10b23James Zern    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9920a39d0a697ff3603e8c100300fda363658e10b23James Zern    T42 v42, T43 v43) {
9930a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9940a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9950a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9960a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
9970a39d0a697ff3603e8c100300fda363658e10b23James Zern      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
9980a39d0a697ff3603e8c100300fda363658e10b23James Zern      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
9990a39d0a697ff3603e8c100300fda363658e10b23James Zern      v41, v42, v43);
10000a39d0a697ff3603e8c100300fda363658e10b23James Zern}
10010a39d0a697ff3603e8c100300fda363658e10b23James Zern
10020a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10030a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
10040a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
10050a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
10060a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
10070a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
10080a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
10090a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
10100a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44>
10110a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10120a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10130a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10140a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10150a39d0a697ff3603e8c100300fda363658e10b23James Zern    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10160a39d0a697ff3603e8c100300fda363658e10b23James Zern    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10170a39d0a697ff3603e8c100300fda363658e10b23James Zern    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
10180a39d0a697ff3603e8c100300fda363658e10b23James Zern    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
10190a39d0a697ff3603e8c100300fda363658e10b23James Zern    T42 v42, T43 v43, T44 v44) {
10200a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10210a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10220a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10230a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
10240a39d0a697ff3603e8c100300fda363658e10b23James Zern      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
10250a39d0a697ff3603e8c100300fda363658e10b23James Zern      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
10260a39d0a697ff3603e8c100300fda363658e10b23James Zern      v40, v41, v42, v43, v44);
10270a39d0a697ff3603e8c100300fda363658e10b23James Zern}
10280a39d0a697ff3603e8c100300fda363658e10b23James Zern
10290a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10300a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
10310a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
10320a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
10330a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
10340a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
10350a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
10360a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
10370a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44, typename T45>
10380a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10390a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10400a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10410a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10420a39d0a697ff3603e8c100300fda363658e10b23James Zern    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
10430a39d0a697ff3603e8c100300fda363658e10b23James Zern    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
10440a39d0a697ff3603e8c100300fda363658e10b23James Zern    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
10450a39d0a697ff3603e8c100300fda363658e10b23James Zern    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
10460a39d0a697ff3603e8c100300fda363658e10b23James Zern    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
10470a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10480a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10490a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10500a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
10510a39d0a697ff3603e8c100300fda363658e10b23James Zern      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
10520a39d0a697ff3603e8c100300fda363658e10b23James Zern      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
10530a39d0a697ff3603e8c100300fda363658e10b23James Zern      v39, v40, v41, v42, v43, v44, v45);
10540a39d0a697ff3603e8c100300fda363658e10b23James Zern}
10550a39d0a697ff3603e8c100300fda363658e10b23James Zern
10560a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10570a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
10580a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
10590a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
10600a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
10610a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
10620a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
10630a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
10640a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44, typename T45,
10650a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T46>
10660a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10670a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10680a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10690a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10700a39d0a697ff3603e8c100300fda363658e10b23James Zern    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10710a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
10720a39d0a697ff3603e8c100300fda363658e10b23James Zern    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
10730a39d0a697ff3603e8c100300fda363658e10b23James Zern    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
10740a39d0a697ff3603e8c100300fda363658e10b23James Zern    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
10750a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10760a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10770a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10780a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
10790a39d0a697ff3603e8c100300fda363658e10b23James Zern      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
10800a39d0a697ff3603e8c100300fda363658e10b23James Zern      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
10810a39d0a697ff3603e8c100300fda363658e10b23James Zern      v38, v39, v40, v41, v42, v43, v44, v45, v46);
10820a39d0a697ff3603e8c100300fda363658e10b23James Zern}
10830a39d0a697ff3603e8c100300fda363658e10b23James Zern
10840a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10850a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
10860a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
10870a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
10880a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
10890a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
10900a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
10910a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
10920a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44, typename T45,
10930a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T46, typename T47>
10940a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10950a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10960a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10970a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10980a39d0a697ff3603e8c100300fda363658e10b23James Zern    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10990a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11000a39d0a697ff3603e8c100300fda363658e10b23James Zern    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11010a39d0a697ff3603e8c100300fda363658e10b23James Zern    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11020a39d0a697ff3603e8c100300fda363658e10b23James Zern    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
11030a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11040a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11050a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11060a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
11070a39d0a697ff3603e8c100300fda363658e10b23James Zern      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
11080a39d0a697ff3603e8c100300fda363658e10b23James Zern      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
11090a39d0a697ff3603e8c100300fda363658e10b23James Zern      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
11100a39d0a697ff3603e8c100300fda363658e10b23James Zern}
11110a39d0a697ff3603e8c100300fda363658e10b23James Zern
11120a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11130a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
11140a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
11150a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
11160a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
11170a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
11180a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
11190a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
11200a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44, typename T45,
11210a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T46, typename T47, typename T48>
11220a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11230a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11240a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11250a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
11260a39d0a697ff3603e8c100300fda363658e10b23James Zern    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
11270a39d0a697ff3603e8c100300fda363658e10b23James Zern    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11280a39d0a697ff3603e8c100300fda363658e10b23James Zern    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11290a39d0a697ff3603e8c100300fda363658e10b23James Zern    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11300a39d0a697ff3603e8c100300fda363658e10b23James Zern    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
11310a39d0a697ff3603e8c100300fda363658e10b23James Zern    T48 v48) {
11320a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11330a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11340a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11350a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
11360a39d0a697ff3603e8c100300fda363658e10b23James Zern      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
11370a39d0a697ff3603e8c100300fda363658e10b23James Zern      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
11380a39d0a697ff3603e8c100300fda363658e10b23James Zern      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
11390a39d0a697ff3603e8c100300fda363658e10b23James Zern}
11400a39d0a697ff3603e8c100300fda363658e10b23James Zern
11410a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11420a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
11430a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
11440a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
11450a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
11460a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
11470a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
11480a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
11490a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44, typename T45,
11500a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T46, typename T47, typename T48, typename T49>
11510a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11520a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11530a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11540a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
11550a39d0a697ff3603e8c100300fda363658e10b23James Zern    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
11560a39d0a697ff3603e8c100300fda363658e10b23James Zern    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
11570a39d0a697ff3603e8c100300fda363658e10b23James Zern    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
11580a39d0a697ff3603e8c100300fda363658e10b23James Zern    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
11590a39d0a697ff3603e8c100300fda363658e10b23James Zern    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
11600a39d0a697ff3603e8c100300fda363658e10b23James Zern    T47 v47, T48 v48, T49 v49) {
11610a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11620a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11630a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11640a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
11650a39d0a697ff3603e8c100300fda363658e10b23James Zern      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
11660a39d0a697ff3603e8c100300fda363658e10b23James Zern      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
11670a39d0a697ff3603e8c100300fda363658e10b23James Zern      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
11680a39d0a697ff3603e8c100300fda363658e10b23James Zern}
11690a39d0a697ff3603e8c100300fda363658e10b23James Zern
11700a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11710a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T6, typename T7, typename T8, typename T9, typename T10,
11720a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T11, typename T12, typename T13, typename T14, typename T15,
11730a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T16, typename T17, typename T18, typename T19, typename T20,
11740a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T21, typename T22, typename T23, typename T24, typename T25,
11750a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T26, typename T27, typename T28, typename T29, typename T30,
11760a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T31, typename T32, typename T33, typename T34, typename T35,
11770a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T36, typename T37, typename T38, typename T39, typename T40,
11780a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T41, typename T42, typename T43, typename T44, typename T45,
11790a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename T46, typename T47, typename T48, typename T49, typename T50>
11800a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11810a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11820a39d0a697ff3603e8c100300fda363658e10b23James Zern    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11830a39d0a697ff3603e8c100300fda363658e10b23James Zern    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
11840a39d0a697ff3603e8c100300fda363658e10b23James Zern    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
11850a39d0a697ff3603e8c100300fda363658e10b23James Zern    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
11860a39d0a697ff3603e8c100300fda363658e10b23James Zern    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
11870a39d0a697ff3603e8c100300fda363658e10b23James Zern    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
11880a39d0a697ff3603e8c100300fda363658e10b23James Zern    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
11890a39d0a697ff3603e8c100300fda363658e10b23James Zern    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
11900a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11910a39d0a697ff3603e8c100300fda363658e10b23James Zern      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11920a39d0a697ff3603e8c100300fda363658e10b23James Zern      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11930a39d0a697ff3603e8c100300fda363658e10b23James Zern      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
11940a39d0a697ff3603e8c100300fda363658e10b23James Zern      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
11950a39d0a697ff3603e8c100300fda363658e10b23James Zern      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
11960a39d0a697ff3603e8c100300fda363658e10b23James Zern      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
11970a39d0a697ff3603e8c100300fda363658e10b23James Zern      v48, v49, v50);
11980a39d0a697ff3603e8c100300fda363658e10b23James Zern}
11990a39d0a697ff3603e8c100300fda363658e10b23James Zern
12000a39d0a697ff3603e8c100300fda363658e10b23James Zern// Bool() allows generating tests with parameters in a set of (false, true).
12010a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12020a39d0a697ff3603e8c100300fda363658e10b23James Zern// Synopsis:
12030a39d0a697ff3603e8c100300fda363658e10b23James Zern// Bool()
12040a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing sequences with elements {false, true}.
12050a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12060a39d0a697ff3603e8c100300fda363658e10b23James Zern// It is useful when testing code that depends on Boolean flags. Combinations
12070a39d0a697ff3603e8c100300fda363658e10b23James Zern// of multiple flags can be tested when several Bool()'s are combined using
12080a39d0a697ff3603e8c100300fda363658e10b23James Zern// Combine() function.
12090a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12100a39d0a697ff3603e8c100300fda363658e10b23James Zern// In the following example all tests in the test case FlagDependentTest
12110a39d0a697ff3603e8c100300fda363658e10b23James Zern// will be instantiated twice with parameters false and true.
12120a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12130a39d0a697ff3603e8c100300fda363658e10b23James Zern// class FlagDependentTest : public testing::TestWithParam<bool> {
12140a39d0a697ff3603e8c100300fda363658e10b23James Zern//   virtual void SetUp() {
12150a39d0a697ff3603e8c100300fda363658e10b23James Zern//     external_flag = GetParam();
12160a39d0a697ff3603e8c100300fda363658e10b23James Zern//   }
12170a39d0a697ff3603e8c100300fda363658e10b23James Zern// }
12180a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
12190a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12200a39d0a697ff3603e8c100300fda363658e10b23James Zerninline internal::ParamGenerator<bool> Bool() {
12210a39d0a697ff3603e8c100300fda363658e10b23James Zern  return Values(false, true);
12220a39d0a697ff3603e8c100300fda363658e10b23James Zern}
12230a39d0a697ff3603e8c100300fda363658e10b23James Zern
12240a39d0a697ff3603e8c100300fda363658e10b23James Zern# if GTEST_HAS_COMBINE
12250a39d0a697ff3603e8c100300fda363658e10b23James Zern// Combine() allows the user to combine two or more sequences to produce
12260a39d0a697ff3603e8c100300fda363658e10b23James Zern// values of a Cartesian product of those sequences' elements.
12270a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12280a39d0a697ff3603e8c100300fda363658e10b23James Zern// Synopsis:
12290a39d0a697ff3603e8c100300fda363658e10b23James Zern// Combine(gen1, gen2, ..., genN)
12300a39d0a697ff3603e8c100300fda363658e10b23James Zern//   - returns a generator producing sequences with elements coming from
12310a39d0a697ff3603e8c100300fda363658e10b23James Zern//     the Cartesian product of elements from the sequences generated by
12320a39d0a697ff3603e8c100300fda363658e10b23James Zern//     gen1, gen2, ..., genN. The sequence elements will have a type of
12330a39d0a697ff3603e8c100300fda363658e10b23James Zern//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
12340a39d0a697ff3603e8c100300fda363658e10b23James Zern//     of elements from sequences produces by gen1, gen2, ..., genN.
12350a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12360a39d0a697ff3603e8c100300fda363658e10b23James Zern// Combine can have up to 10 arguments. This number is currently limited
12370a39d0a697ff3603e8c100300fda363658e10b23James Zern// by the maximum number of elements in the tuple implementation used by Google
12380a39d0a697ff3603e8c100300fda363658e10b23James Zern// Test.
12390a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12400a39d0a697ff3603e8c100300fda363658e10b23James Zern// Example:
12410a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12420a39d0a697ff3603e8c100300fda363658e10b23James Zern// This will instantiate tests in test case AnimalTest each one with
12430a39d0a697ff3603e8c100300fda363658e10b23James Zern// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
12440a39d0a697ff3603e8c100300fda363658e10b23James Zern// tuple("dog", BLACK), and tuple("dog", WHITE):
12450a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12460a39d0a697ff3603e8c100300fda363658e10b23James Zern// enum Color { BLACK, GRAY, WHITE };
12470a39d0a697ff3603e8c100300fda363658e10b23James Zern// class AnimalTest
12480a39d0a697ff3603e8c100300fda363658e10b23James Zern//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
12490a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12500a39d0a697ff3603e8c100300fda363658e10b23James Zern// TEST_P(AnimalTest, AnimalLooksNice) {...}
12510a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12520a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
12530a39d0a697ff3603e8c100300fda363658e10b23James Zern//                         Combine(Values("cat", "dog"),
12540a39d0a697ff3603e8c100300fda363658e10b23James Zern//                                 Values(BLACK, WHITE)));
12550a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12560a39d0a697ff3603e8c100300fda363658e10b23James Zern// This will instantiate tests in FlagDependentTest with all variations of two
12570a39d0a697ff3603e8c100300fda363658e10b23James Zern// Boolean flags:
12580a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12590a39d0a697ff3603e8c100300fda363658e10b23James Zern// class FlagDependentTest
12600a39d0a697ff3603e8c100300fda363658e10b23James Zern//     : public testing::TestWithParam<tuple<bool, bool> > {
12610a39d0a697ff3603e8c100300fda363658e10b23James Zern//   virtual void SetUp() {
12620a39d0a697ff3603e8c100300fda363658e10b23James Zern//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
12630a39d0a697ff3603e8c100300fda363658e10b23James Zern//     tie(external_flag_1, external_flag_2) = GetParam();
12640a39d0a697ff3603e8c100300fda363658e10b23James Zern//   }
12650a39d0a697ff3603e8c100300fda363658e10b23James Zern// };
12660a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12670a39d0a697ff3603e8c100300fda363658e10b23James Zern// TEST_P(FlagDependentTest, TestFeature1) {
12680a39d0a697ff3603e8c100300fda363658e10b23James Zern//   // Test your code using external_flag_1 and external_flag_2 here.
12690a39d0a697ff3603e8c100300fda363658e10b23James Zern// }
12700a39d0a697ff3603e8c100300fda363658e10b23James Zern// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
12710a39d0a697ff3603e8c100300fda363658e10b23James Zern//                         Combine(Bool(), Bool()));
12720a39d0a697ff3603e8c100300fda363658e10b23James Zern//
12730a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2>
12740a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder2<Generator1, Generator2> Combine(
12750a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2) {
12760a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder2<Generator1, Generator2>(
12770a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2);
12780a39d0a697ff3603e8c100300fda363658e10b23James Zern}
12790a39d0a697ff3603e8c100300fda363658e10b23James Zern
12800a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3>
12810a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
12820a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
12830a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
12840a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3);
12850a39d0a697ff3603e8c100300fda363658e10b23James Zern}
12860a39d0a697ff3603e8c100300fda363658e10b23James Zern
12870a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
12880a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4>
12890a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12900a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4> Combine(
12910a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
12920a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4) {
12930a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12940a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4>(
12950a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4);
12960a39d0a697ff3603e8c100300fda363658e10b23James Zern}
12970a39d0a697ff3603e8c100300fda363658e10b23James Zern
12980a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
12990a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4, typename Generator5>
13000a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13010a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4, Generator5> Combine(
13020a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13030a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4, const Generator5& g5) {
13040a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13050a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4, Generator5>(
13060a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4, g5);
13070a39d0a697ff3603e8c100300fda363658e10b23James Zern}
13080a39d0a697ff3603e8c100300fda363658e10b23James Zern
13090a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
13100a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4, typename Generator5, typename Generator6>
13110a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13120a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4, Generator5, Generator6> Combine(
13130a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13140a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
13150a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13160a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4, Generator5, Generator6>(
13170a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4, g5, g6);
13180a39d0a697ff3603e8c100300fda363658e10b23James Zern}
13190a39d0a697ff3603e8c100300fda363658e10b23James Zern
13200a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
13210a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4, typename Generator5, typename Generator6,
13220a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator7>
13230a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13240a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4, Generator5, Generator6, Generator7> Combine(
13250a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13260a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13270a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator7& g7) {
13280a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13290a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4, Generator5, Generator6, Generator7>(
13300a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4, g5, g6, g7);
13310a39d0a697ff3603e8c100300fda363658e10b23James Zern}
13320a39d0a697ff3603e8c100300fda363658e10b23James Zern
13330a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
13340a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4, typename Generator5, typename Generator6,
13350a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator7, typename Generator8>
13360a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13370a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
13380a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13390a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13400a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator7& g7, const Generator8& g8) {
13410a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13420a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4, Generator5, Generator6, Generator7, Generator8>(
13430a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4, g5, g6, g7, g8);
13440a39d0a697ff3603e8c100300fda363658e10b23James Zern}
13450a39d0a697ff3603e8c100300fda363658e10b23James Zern
13460a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
13470a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4, typename Generator5, typename Generator6,
13480a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator7, typename Generator8, typename Generator9>
13490a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13500a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4, Generator5, Generator6, Generator7, Generator8,
13510a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator9> Combine(
13520a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13530a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13540a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
13550a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13560a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
13570a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4, g5, g6, g7, g8, g9);
13580a39d0a697ff3603e8c100300fda363658e10b23James Zern}
13590a39d0a697ff3603e8c100300fda363658e10b23James Zern
13600a39d0a697ff3603e8c100300fda363658e10b23James Zerntemplate <typename Generator1, typename Generator2, typename Generator3,
13610a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator4, typename Generator5, typename Generator6,
13620a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator7, typename Generator8, typename Generator9,
13630a39d0a697ff3603e8c100300fda363658e10b23James Zern    typename Generator10>
13640a39d0a697ff3603e8c100300fda363658e10b23James Zerninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13650a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13660a39d0a697ff3603e8c100300fda363658e10b23James Zern    Generator10> Combine(
13670a39d0a697ff3603e8c100300fda363658e10b23James Zern    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13680a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13690a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator7& g7, const Generator8& g8, const Generator9& g9,
13700a39d0a697ff3603e8c100300fda363658e10b23James Zern        const Generator10& g10) {
13710a39d0a697ff3603e8c100300fda363658e10b23James Zern  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13720a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13730a39d0a697ff3603e8c100300fda363658e10b23James Zern      Generator10>(
13740a39d0a697ff3603e8c100300fda363658e10b23James Zern      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
13750a39d0a697ff3603e8c100300fda363658e10b23James Zern}
13760a39d0a697ff3603e8c100300fda363658e10b23James Zern# endif  // GTEST_HAS_COMBINE
13770a39d0a697ff3603e8c100300fda363658e10b23James Zern
13780a39d0a697ff3603e8c100300fda363658e10b23James Zern
13790a39d0a697ff3603e8c100300fda363658e10b23James Zern
13800a39d0a697ff3603e8c100300fda363658e10b23James Zern# define TEST_P(test_case_name, test_name) \
13810a39d0a697ff3603e8c100300fda363658e10b23James Zern  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
13820a39d0a697ff3603e8c100300fda363658e10b23James Zern      : public test_case_name { \
13830a39d0a697ff3603e8c100300fda363658e10b23James Zern   public: \
13840a39d0a697ff3603e8c100300fda363658e10b23James Zern    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
13850a39d0a697ff3603e8c100300fda363658e10b23James Zern    virtual void TestBody(); \
13860a39d0a697ff3603e8c100300fda363658e10b23James Zern   private: \
13870a39d0a697ff3603e8c100300fda363658e10b23James Zern    static int AddToRegistry() { \
13880a39d0a697ff3603e8c100300fda363658e10b23James Zern      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
13890a39d0a697ff3603e8c100300fda363658e10b23James Zern          GetTestCasePatternHolder<test_case_name>(\
13900a39d0a697ff3603e8c100300fda363658e10b23James Zern              #test_case_name, \
13910a39d0a697ff3603e8c100300fda363658e10b23James Zern              ::testing::internal::CodeLocation(\
13920a39d0a697ff3603e8c100300fda363658e10b23James Zern                  __FILE__, __LINE__))->AddTestPattern(\
13930a39d0a697ff3603e8c100300fda363658e10b23James Zern                      #test_case_name, \
13940a39d0a697ff3603e8c100300fda363658e10b23James Zern                      #test_name, \
13950a39d0a697ff3603e8c100300fda363658e10b23James Zern                      new ::testing::internal::TestMetaFactory< \
13960a39d0a697ff3603e8c100300fda363658e10b23James Zern                          GTEST_TEST_CLASS_NAME_(\
13970a39d0a697ff3603e8c100300fda363658e10b23James Zern                              test_case_name, test_name)>()); \
13980a39d0a697ff3603e8c100300fda363658e10b23James Zern      return 0; \
13990a39d0a697ff3603e8c100300fda363658e10b23James Zern    } \
14000a39d0a697ff3603e8c100300fda363658e10b23James Zern    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
14010a39d0a697ff3603e8c100300fda363658e10b23James Zern    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
14020a39d0a697ff3603e8c100300fda363658e10b23James Zern        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
14030a39d0a697ff3603e8c100300fda363658e10b23James Zern  }; \
14040a39d0a697ff3603e8c100300fda363658e10b23James Zern  int GTEST_TEST_CLASS_NAME_(test_case_name, \
14050a39d0a697ff3603e8c100300fda363658e10b23James Zern                             test_name)::gtest_registering_dummy_ = \
14060a39d0a697ff3603e8c100300fda363658e10b23James Zern      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
14070a39d0a697ff3603e8c100300fda363658e10b23James Zern  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
14080a39d0a697ff3603e8c100300fda363658e10b23James Zern
14090a39d0a697ff3603e8c100300fda363658e10b23James Zern// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user
14100a39d0a697ff3603e8c100300fda363658e10b23James Zern// to specify a function or functor that generates custom test name suffixes
14110a39d0a697ff3603e8c100300fda363658e10b23James Zern// based on the test parameters. The function should accept one argument of
14120a39d0a697ff3603e8c100300fda363658e10b23James Zern// type testing::TestParamInfo<class ParamType>, and return std::string.
14130a39d0a697ff3603e8c100300fda363658e10b23James Zern//
14140a39d0a697ff3603e8c100300fda363658e10b23James Zern// testing::PrintToStringParamName is a builtin test suffix generator that
14150a39d0a697ff3603e8c100300fda363658e10b23James Zern// returns the value of testing::PrintToString(GetParam()). It does not work
14160a39d0a697ff3603e8c100300fda363658e10b23James Zern// for std::string or C strings.
14170a39d0a697ff3603e8c100300fda363658e10b23James Zern//
14180a39d0a697ff3603e8c100300fda363658e10b23James Zern// Note: test names must be non-empty, unique, and may only contain ASCII
14190a39d0a697ff3603e8c100300fda363658e10b23James Zern// alphanumeric characters or underscore.
14200a39d0a697ff3603e8c100300fda363658e10b23James Zern
14210a39d0a697ff3603e8c100300fda363658e10b23James Zern# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \
14220a39d0a697ff3603e8c100300fda363658e10b23James Zern  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
14230a39d0a697ff3603e8c100300fda363658e10b23James Zern      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
14240a39d0a697ff3603e8c100300fda363658e10b23James Zern  ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \
14250a39d0a697ff3603e8c100300fda363658e10b23James Zern      const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \
14260a39d0a697ff3603e8c100300fda363658e10b23James Zern    return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \
14270a39d0a697ff3603e8c100300fda363658e10b23James Zern        (__VA_ARGS__)(info); \
14280a39d0a697ff3603e8c100300fda363658e10b23James Zern  } \
14290a39d0a697ff3603e8c100300fda363658e10b23James Zern  int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \
14300a39d0a697ff3603e8c100300fda363658e10b23James Zern      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
14310a39d0a697ff3603e8c100300fda363658e10b23James Zern          GetTestCasePatternHolder<test_case_name>(\
14320a39d0a697ff3603e8c100300fda363658e10b23James Zern              #test_case_name, \
14330a39d0a697ff3603e8c100300fda363658e10b23James Zern              ::testing::internal::CodeLocation(\
14340a39d0a697ff3603e8c100300fda363658e10b23James Zern                  __FILE__, __LINE__))->AddTestCaseInstantiation(\
14350a39d0a697ff3603e8c100300fda363658e10b23James Zern                      #prefix, \
14360a39d0a697ff3603e8c100300fda363658e10b23James Zern                      &gtest_##prefix##test_case_name##_EvalGenerator_, \
14370a39d0a697ff3603e8c100300fda363658e10b23James Zern                      &gtest_##prefix##test_case_name##_EvalGenerateName_, \
14380a39d0a697ff3603e8c100300fda363658e10b23James Zern                      __FILE__, __LINE__)
14390a39d0a697ff3603e8c100300fda363658e10b23James Zern
14400a39d0a697ff3603e8c100300fda363658e10b23James Zern}  // namespace testing
14410a39d0a697ff3603e8c100300fda363658e10b23James Zern
14420a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif  // GTEST_HAS_PARAM_TEST
14430a39d0a697ff3603e8c100300fda363658e10b23James Zern
14440a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1445