13d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This file was GENERATED by command:
23d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     pump.py gtest-param-test.h.pump
33d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DO NOT EDIT BY HAND!!!
43d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
53d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Copyright 2008, Google Inc.
63d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// All rights reserved.
73d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
83d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Redistribution and use in source and binary forms, with or without
93d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// modification, are permitted provided that the following conditions are
103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// met:
113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions of source code must retain the above copyright
133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// notice, this list of conditions and the following disclaimer.
143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions in binary form must reproduce the above
153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyright notice, this list of conditions and the following disclaimer
163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the documentation and/or other materials provided with the
173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// distribution.
183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Neither the name of Google Inc. nor the names of its
193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// contributors may be used to endorse or promote products derived from
203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// this software without specific prior written permission.
213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Authors: vladl@google.com (Vlad Losev)
353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Macros and functions for implementing parameterized tests
373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in Google C++ Testing Framework (Google Test)
383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Value-parameterized tests allow you to test your code with different
463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// parameters without writing multiple copies of the same test.
473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Here is how you use value-parameterized tests:
493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if 0
513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// To write value-parameterized tests, first you should define a fixture
533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class. It is usually derived from testing::TestWithParam<T> (see below for
543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// another inheritance scheme that's sometimes useful in more complicated
553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class hierarchies), where the type of your parameter values.
563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TestWithParam<T> is itself derived from testing::Test. T can be any
573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyable type. If it's a raw pointer, you are responsible for managing the
583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// lifespan of the pointed values.
593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass FooTest : public ::testing::TestWithParam<const char*> {
613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // You can implement all the usual class fixture members here.
623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Then, use the TEST_P macro to define as many parameterized tests
653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// for this fixture as you want. The _P suffix is for "parameterized"
663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// or "pattern", whichever you prefer to think.
673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickTEST_P(FooTest, DoesBlah) {
693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Inside a test, access the test parameter with the GetParam() method
703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // of the TestWithParam<T> class:
713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  EXPECT_TRUE(foo.Blah(GetParam()));
723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ...
733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickTEST_P(FooTest, HasBlahBlah) {
763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ...
773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// case with any set of parameters you want. Google Test defines a number
813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// of functions for generating test parameters. They return what we call
823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (surprise!) parameter generators. Here is a  summary of them, which
833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// are all in the testing namespace:
843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//  Range(begin, end [, step]) - Yields values {begin, begin+step,
873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                               begin+step+step, ...}. The values do not
883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                               include end. step defaults to 1.
893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//  ValuesIn(container)        - Yields values from a C-style array, an STL
913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//  Bool()                     - Yields sequence {false, true}.
933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                               for the math savvy) of the values generated
953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                               by the N generators.
963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// For more details, see comments at the definitions of these functions below
983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in this file.
993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The following statement will instantiate tests from the FooTest test case
1013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// each with parameter values "meeny", "miny", and "moe".
1023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickINSTANTIATE_TEST_CASE_P(InstantiationName,
1043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                        FooTest,
1053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                        Values("meeny", "miny", "moe"));
1063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// To distinguish different instances of the pattern, (yes, you
1083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// can instantiate it more then once) the first argument to the
1093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
1103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// actual test case name. Remember to pick unique prefixes for different
1113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// instantiations. The tests from the instantiation above will have
1123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// these names:
1133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
1153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
1163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
1173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
1183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
1193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
1203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// You can use these names in --gtest_filter.
1223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This statement will instantiate all tests from FooTest again, each
1243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// with parameter values "cat" and "dog":
1253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickconst char* pets[] = {"cat", "dog"};
1273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
1283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The tests from the instantiation above will have these names:
1303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
1323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
1333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
1343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
1353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
1373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the given test case, whether their definitions come before or
1383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// AFTER the INSTANTIATE_TEST_CASE_P statement.
1393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Please also note that generator expressions (including parameters to the
1413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// generators) are evaluated in InitGoogleTest(), after main() has started.
1423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This allows the user on one hand, to adjust generator parameters in order
1433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// to dynamically determine a set of tests to run and on the other hand,
1443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// give the user a chance to inspect the generated tests with Google Test
1453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// reflection API before RUN_ALL_TESTS() is executed.
1463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
1483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// for more examples.
1493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// In the future, we plan to publish the API for defining new parameter
1513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// generators. But for now this interface remains part of the internal
1523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// implementation and is subject to change.
1533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A parameterized test fixture must be derived from testing::Test and from
1563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// testing::WithParamInterface<T>, where T is the type of the parameter
1573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// values. Inheriting from TestWithParam<T> satisfies that requirement because
1583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TestWithParam<T> inherits from both Test and WithParamInterface. In more
1593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// complicated hierarchies, however, it is occasionally useful to inherit
1603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// separately from Test and WithParamInterface. For example:
1613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass BaseTest : public ::testing::Test {
1633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // You can inherit all the usual members for a non-parameterized test
1643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // fixture here.
1653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
1683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // The usual test fixture members go here too.
1693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickTEST_F(BaseTest, HasFoo) {
1723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // This is an ordinary non-parameterized test.
1733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
1743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickTEST_P(DerivedTest, DoesBlah) {
1763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // GetParam works just the same here as if you inherit from TestWithParam.
1773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  EXPECT_TRUE(foo.Blah(GetParam()));
1783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
1793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  // 0
1813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-port.h"
1833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if !GTEST_OS_SYMBIAN
1853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# include <utility>
1863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif
1873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// scripts/fuse_gtest.py depends on gtest's own header being #included
1893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// *unconditionally*.  Therefore these #includes cannot be moved
1903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// inside #if GTEST_HAS_PARAM_TEST.
1913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-internal.h"
1923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-param-util.h"
1933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-param-util-generated.h"
1943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if GTEST_HAS_PARAM_TEST
1963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace testing {
1983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Functions producing parameter generators.
2003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Google Test uses these generators to produce parameters for value-
2023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// parameterized tests. When a parameterized test case is instantiated
2033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// with a particular generator, Google Test creates and runs tests
2043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// for each element in the sequence produced by the generator.
2053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// In the following sample, tests from test case FooTest are instantiated
2073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// each three times with parameter values 3, 5, and 8:
2083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class FooTest : public TestWithParam<int> { ... };
2103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TEST_P(FooTest, TestThis) {
2123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// }
2133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TEST_P(FooTest, TestThat) {
2143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// }
2153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
2163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Range() returns generators providing sequences of values in a range.
2193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Synopsis:
2213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Range(start, end)
2223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing a sequence of values {start, start+1,
2233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     start+2, ..., }.
2243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Range(start, end, step)
2253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing a sequence of values {start, start+step,
2263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     start+step+step, ..., }.
2273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Notes:
2283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   * The generated sequences never include end. For example, Range(1, 5)
2293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
2303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     returns a generator producing {1, 3, 5, 7}.
2313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   * start and end must have the same type. That type may be any integral or
2323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     floating-point type or a user defined type satisfying these conditions:
2333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * It must be assignable (have operator=() defined).
2343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * It must have operator+() (operator+(int-compatible type) for
2353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//       two-operand version).
2363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * It must have operator<() defined.
2373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     Elements in the resulting sequences will also have that type.
2383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   * Condition start < end must be satisfied in order for resulting sequences
2393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     to contain any elements.
2403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T, typename IncrementT>
2423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
2433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ParamGenerator<T>(
2443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      new internal::RangeGenerator<T, IncrementT>(start, end, step));
2453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
2463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T>
2483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<T> Range(T start, T end) {
2493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return Range(start, end, 1);
2503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
2513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ValuesIn() function allows generation of tests with parameters coming from
2533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// a container.
2543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Synopsis:
2563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ValuesIn(const T (&array)[N])
2573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing sequences with elements from
2583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     a C-style array.
2593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ValuesIn(const Container& container)
2603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing sequences with elements from
2613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     an STL-style container.
2623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ValuesIn(Iterator begin, Iterator end)
2633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing sequences with elements from
2643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     a range [begin, end) defined by a pair of STL-style iterators. These
2653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     iterators can also be plain C pointers.
2663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Please note that ValuesIn copies the values from the containers
2683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// passed in and keeps them to generate tests in RUN_ALL_TESTS().
2693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Examples:
2713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This instantiates tests from test case StringTest
2733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// each with C-string values of "foo", "bar", and "baz":
2743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// const char* strings[] = {"foo", "bar", "baz"};
2763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
2773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This instantiates tests from test case StlStringTest
2793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// each with STL strings with values "a" and "b":
2803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ::std::vector< ::std::string> GetParameterStrings() {
2823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   ::std::vector< ::std::string> v;
2833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   v.push_back("a");
2843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   v.push_back("b");
2853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   return v;
2863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// }
2873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(CharSequence,
2893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                         StlStringTest,
2903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                         ValuesIn(GetParameterStrings()));
2913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This will also instantiate tests from CharTest
2943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// each with parameter values 'a' and 'b':
2953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
2963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ::std::list<char> GetParameterChars() {
2973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   ::std::list<char> list;
2983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   list.push_back('a');
2993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   list.push_back('b');
3003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   return list;
3013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// }
3023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ::std::list<char> l = GetParameterChars();
3033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(CharSequence2,
3043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                         CharTest,
3053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                         ValuesIn(l.begin(), l.end()));
3063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename ForwardIterator>
3083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<
3093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
3103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickValuesIn(ForwardIterator begin, ForwardIterator end) {
3113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
3123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ::value_type ParamType;
3133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ParamGenerator<ParamType>(
3143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
3153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T, size_t N>
3183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
3193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return ValuesIn(array, array + N);
3203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Container>
3233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<typename Container::value_type> ValuesIn(
3243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Container& container) {
3253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return ValuesIn(container.begin(), container.end());
3263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Values() allows generating tests from explicitly specified list of
3293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// parameters.
3303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Synopsis:
3323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Values(T v1, T v2, ..., T vN)
3333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing sequences with elements v1, v2, ..., vN.
3343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// For example, this instantiates tests from test case BarTest each
3363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// with values "one", "two", and "three":
3373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
3393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
3413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The exact type of values will depend on the type of parameter in BazTest.
3423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
3443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Currently, Values() supports from 1 to 50 parameters.
3463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
3473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1>
3483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray1<T1> Values(T1 v1) {
3493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray1<T1>(v1);
3503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2>
3533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
3543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray2<T1, T2>(v1, v2);
3553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3>
3583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
3593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
3603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4>
3633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
3643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
3653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
3693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T5 v5) {
3703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
3713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6>
3753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
3763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T4 v4, T5 v5, T6 v6) {
3773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
3783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7>
3823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
3833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T4 v4, T5 v5, T6 v6, T7 v7) {
3843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
3853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v6, v7);
3863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8>
3903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
3913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
3923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
3933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5, v6, v7, v8);
3943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
3953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9>
3983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
3993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
4003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
4013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4, v5, v6, v7, v8, v9);
4023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10>
4063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
4073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
4083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
4093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2, v3, v4, v5, v6, v7, v8, v9, v10);
4103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11>
4153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11) {
4183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
4203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12>
4253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12) {
4283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
4303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13>
4353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13) {
4383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
4403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14>
4453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
4483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
4503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14);
4513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15>
4563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
4583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
4593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
4613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13, v14, v15);
4623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
4673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16>
4683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16) {
4723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
4743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12, v13, v14, v15, v16);
4753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
4803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17>
4813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17) {
4853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
4873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11, v12, v13, v14, v15, v16, v17);
4883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
4893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
4933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18>
4943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
4963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18) {
4983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
5003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10, v11, v12, v13, v14, v15, v16, v17, v18);
5013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19>
5073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
5093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
5103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
5113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
5133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
5143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20>
5203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
5243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
5263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
5273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
5333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21>
5343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
5383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
5403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
5413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
5473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22>
5483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
5503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T21 v21, T22 v22) {
5533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
5553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20, v21, v22);
5573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
5633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23>
5643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
5663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T21 v21, T22 v22, T23 v23) {
5693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
5713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20, v21, v22, v23);
5733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
5793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24>
5803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
5823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T21 v21, T22 v22, T23 v23, T24 v24) {
5853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
5873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
5883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v19, v20, v21, v22, v23, v24);
5893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
5903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
5953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25>
5963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
5983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
5993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
6003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
6013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
6033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
6043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v18, v19, v20, v21, v22, v23, v24, v25);
6053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
6113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
6123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26>
6133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26) {
6193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
6223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
6233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
6293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
6303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27>
6313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27) {
6373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
6403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
6413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
6473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
6483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28>
6493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27, T28 v28) {
6553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
6583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
6593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v28);
6603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
6663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
6673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29>
6683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27, T28 v28, T29 v29) {
6743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
6773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
6783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27, v28, v29);
6793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
6853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
6863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30>
6873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
6903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
6913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
6923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
6933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
6963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
6973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v26, v27, v28, v29, v30);
6983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
7053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
7063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31>
7073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
7133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
7163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
7173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v25, v26, v27, v28, v29, v30, v31);
7183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
7193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
7253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
7263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32>
7273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T32 v32) {
7343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
7373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24, v25, v26, v27, v28, v29, v30, v31, v32);
7393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
7403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
7463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
7473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33>
7483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
7513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T32 v32, T33 v33) {
7553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
7583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
7603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
7613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
7673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
7683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34>
7693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
7723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
7733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
7743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
7753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T31 v31, T32 v32, T33 v33, T34 v34) {
7763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
7793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
7803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
7813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
7823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
7883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
7893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35>
7903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
7933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
7943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
7953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
7963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
7973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
8003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
8013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
8023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
8063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
8073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
8083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
8093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
8103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
8113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36>
8123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
8153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
8163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
8173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
8183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
8193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
8223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v34, v35, v36);
8253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
8293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
8303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
8313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
8323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
8333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
8343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37>
8353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
8383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T37 v37) {
8433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
8463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v34, v35, v36, v37);
8493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
8533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
8543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
8553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
8563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
8573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
8583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38>
8593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
8623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T37 v37, T38 v38) {
8673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
8703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
8713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
8723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33, v34, v35, v36, v37, v38);
8733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
8773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
8783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
8793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
8803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
8813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
8823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39>
8833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
8863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T37 v37, T38 v38, T39 v39) {
8913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
8943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
8953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
8963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v32, v33, v34, v35, v36, v37, v38, v39);
8973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
9013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
9023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
9033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
9043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
9053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
9063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40>
9073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
9103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
9113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
9123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
9133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
9143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
9153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
9193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
9203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
9213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
9223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
9253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
9263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
9273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
9283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
9293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
9303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
9313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41>
9323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
9353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
9403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
9443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
9453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
9463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
9473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
9503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
9513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
9523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
9533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
9543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
9553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
9563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42>
9573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
9603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T42 v42) {
9663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
9703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
9713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
9723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v42);
9733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
9743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
9773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
9783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
9793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
9803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
9813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
9823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
9833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43>
9843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
9873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T42 v42, T43 v43) {
9933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
9973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
9983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
9993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v41, v42, v43);
10003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
10013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
10043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
10053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
10063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
10073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
10083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
10093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
10103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44>
10113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
10183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
10193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T42 v42, T43 v43, T44 v44) {
10203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
10243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
10253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
10263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v40, v41, v42, v43, v44);
10273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
10283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
10313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
10323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
10333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
10343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
10353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
10363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
10373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45>
10383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
10433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
10443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
10453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
10463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
10473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
10513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
10523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
10533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v39, v40, v41, v42, v43, v44, v45);
10543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
10553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
10583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
10593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
10603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
10613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
10623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
10633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
10643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
10653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46>
10663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
10723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
10733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
10743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
10753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
10793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
10803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
10813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v38, v39, v40, v41, v42, v43, v44, v45, v46);
10823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
10833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
10863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
10873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
10883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
10893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
10903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
10913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
10923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
10933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47>
10943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
11033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
11073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
11083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
11093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
11103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
11113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
11143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
11153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
11163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
11173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
11183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
11193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
11203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
11213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47, typename T48>
11223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
11263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
11273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
11313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T48 v48) {
11323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
11363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
11373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
11383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
11393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
11403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
11433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
11443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
11453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
11463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
11473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
11483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
11493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
11503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47, typename T48, typename T49>
11513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
11553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
11563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
11573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
11583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
11593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
11603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T47 v47, T48 v48, T49 v49) {
11613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
11653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
11663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
11673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
11683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
11693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
11723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
11733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
11743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
11753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
11763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
11773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
11783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
11793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47, typename T48, typename T49, typename T50>
11803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
11843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
11853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
11863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
11873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
11883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
11893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
11903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
11943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
11953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
11963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
11973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v48, v49, v50);
11983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
11993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Bool() allows generating tests with parameters in a set of (false, true).
12013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Synopsis:
12033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Bool()
12043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing sequences with elements {false, true}.
12053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// It is useful when testing code that depends on Boolean flags. Combinations
12073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// of multiple flags can be tested when several Bool()'s are combined using
12083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Combine() function.
12093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// In the following example all tests in the test case FlagDependentTest
12113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// will be instantiated twice with parameters false and true.
12123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class FlagDependentTest : public testing::TestWithParam<bool> {
12143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   virtual void SetUp() {
12153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     external_flag = GetParam();
12163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   }
12173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// }
12183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
12193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline internal::ParamGenerator<bool> Bool() {
12213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return Values(false, true);
12223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
12233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# if GTEST_HAS_COMBINE
12253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Combine() allows the user to combine two or more sequences to produce
12263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// values of a Cartesian product of those sequences' elements.
12273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Synopsis:
12293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Combine(gen1, gen2, ..., genN)
12303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   - returns a generator producing sequences with elements coming from
12313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     the Cartesian product of elements from the sequences generated by
12323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     gen1, gen2, ..., genN. The sequence elements will have a type of
12333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
12343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     of elements from sequences produces by gen1, gen2, ..., genN.
12353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Combine can have up to 10 arguments. This number is currently limited
12373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// by the maximum number of elements in the tuple implementation used by Google
12383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Test.
12393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Example:
12413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This will instantiate tests in test case AnimalTest each one with
12433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
12443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// tuple("dog", BLACK), and tuple("dog", WHITE):
12453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// enum Color { BLACK, GRAY, WHITE };
12473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class AnimalTest
12483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
12493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TEST_P(AnimalTest, AnimalLooksNice) {...}
12513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
12533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                         Combine(Values("cat", "dog"),
12543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                                 Values(BLACK, WHITE)));
12553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This will instantiate tests in FlagDependentTest with all variations of two
12573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Boolean flags:
12583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class FlagDependentTest
12603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     : public testing::TestWithParam<tuple(bool, bool)> > {
12613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   virtual void SetUp() {
12623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
12633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     tie(external_flag_1, external_flag_2) = GetParam();
12643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   }
12653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// };
12663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TEST_P(FlagDependentTest, TestFeature1) {
12683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//   // Test your code using external_flag_1 and external_flag_2 here.
12693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// }
12703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
12713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//                         Combine(Bool(), Bool()));
12723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
12733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2>
12743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder2<Generator1, Generator2> Combine(
12753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2) {
12763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder2<Generator1, Generator2>(
12773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2);
12783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
12793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3>
12813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
12823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
12833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
12843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3);
12853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
12863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
12883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4>
12893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4> Combine(
12913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
12923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4) {
12933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4>(
12953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4);
12963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
12973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
12993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4, typename Generator5>
13003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4, Generator5> Combine(
13023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4, const Generator5& g5) {
13043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4, Generator5>(
13063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4, g5);
13073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
13083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
13103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4, typename Generator5, typename Generator6>
13113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4, Generator5, Generator6> Combine(
13133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
13153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4, Generator5, Generator6>(
13173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4, g5, g6);
13183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
13193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
13213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4, typename Generator5, typename Generator6,
13223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator7>
13233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4, Generator5, Generator6, Generator7> Combine(
13253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator7& g7) {
13283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4, Generator5, Generator6, Generator7>(
13303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4, g5, g6, g7);
13313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
13323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
13343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4, typename Generator5, typename Generator6,
13353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator7, typename Generator8>
13363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
13383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator7& g7, const Generator8& g8) {
13413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4, Generator5, Generator6, Generator7, Generator8>(
13433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4, g5, g6, g7, g8);
13443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
13453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
13473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4, typename Generator5, typename Generator6,
13483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator7, typename Generator8, typename Generator9>
13493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4, Generator5, Generator6, Generator7, Generator8,
13513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator9> Combine(
13523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
13553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
13573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4, g5, g6, g7, g8, g9);
13583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
13593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Generator1, typename Generator2, typename Generator3,
13613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator4, typename Generator5, typename Generator6,
13623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator7, typename Generator8, typename Generator9,
13633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename Generator10>
13643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Generator10> Combine(
13673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator7& g7, const Generator8& g8, const Generator9& g9,
13703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        const Generator10& g10) {
13713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      Generator10>(
13743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
13753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
13763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# endif  // GTEST_HAS_COMBINE
13773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# define TEST_P(test_case_name, test_name) \
13813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
13823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : public test_case_name { \
13833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public: \
13843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
13853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void TestBody(); \
13863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private: \
13873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    static int AddToRegistry() { \
13883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
13893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          GetTestCasePatternHolder<test_case_name>(\
13903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
13913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                  #test_case_name, \
13923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                  #test_name, \
13933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                  new ::testing::internal::TestMetaFactory< \
13943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
13953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return 0; \
13963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    } \
13973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    static int gtest_registering_dummy_; \
13983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
13993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
14003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }; \
14013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  int GTEST_TEST_CLASS_NAME_(test_case_name, \
14023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                             test_name)::gtest_registering_dummy_ = \
14033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
14043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
14053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
14073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
14083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
14093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  int gtest_##prefix##test_case_name##_dummy_ = \
14103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
14113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          GetTestCasePatternHolder<test_case_name>(\
14123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
14133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                  #prefix, \
14143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
14153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                  __FILE__, __LINE__)
14163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace testing
14183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  // GTEST_HAS_PARAM_TEST
14203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1422