1b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// This file was GENERATED by command:
2b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad//     pump.py gtest-param-test.h.pump
3b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// DO NOT EDIT BY HAND!!!
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2008, Google Inc.
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved.
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met:
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions of source code must retain the above copyright
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer.
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions in binary form must reproduce the above
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution.
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Neither the name of Google Inc. nor the names of its
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission.
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Authors: vladl@google.com (Vlad Losev)
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros and functions for implementing parameterized tests
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in Google C++ Testing Framework (Google Test)
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Value-parameterized tests allow you to test your code with different
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parameters without writing multiple copies of the same test.
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Here is how you use value-parameterized tests:
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if 0
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// To write value-parameterized tests, first you should define a fixture
53b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// class. It is usually derived from testing::TestWithParam<T> (see below for
54b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// another inheritance scheme that's sometimes useful in more complicated
55b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// class hierarchies), where the type of your parameter values.
56b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// TestWithParam<T> is itself derived from testing::Test. T can be any
57b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// copyable type. If it's a raw pointer, you are responsible for managing the
58b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// lifespan of the pointed values.
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass FooTest : public ::testing::TestWithParam<const char*> {
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // You can implement all the usual class fixture members here.
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Then, use the TEST_P macro to define as many parameterized tests
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for this fixture as you want. The _P suffix is for "parameterized"
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// or "pattern", whichever you prefer to think.
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTEST_P(FooTest, DoesBlah) {
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Inside a test, access the test parameter with the GetParam() method
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // of the TestWithParam<T> class:
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_TRUE(foo.Blah(GetParam()));
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ...
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTEST_P(FooTest, HasBlahBlah) {
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ...
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// case with any set of parameters you want. Google Test defines a number
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of functions for generating test parameters. They return what we call
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (surprise!) parameter generators. Here is a  summary of them, which
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// are all in the testing namespace:
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  Range(begin, end [, step]) - Yields values {begin, begin+step,
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                               begin+step+step, ...}. The values do not
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                               include end. step defaults to 1.
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  ValuesIn(container)        - Yields values from a C-style array, an STL
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  Bool()                     - Yields sequence {false, true}.
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                               for the math savvy) of the values generated
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                               by the N generators.
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For more details, see comments at the definitions of these functions below
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in this file.
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The following statement will instantiate tests from the FooTest test case
1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each with parameter values "meeny", "miny", and "moe".
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanINSTANTIATE_TEST_CASE_P(InstantiationName,
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                        FooTest,
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                        Values("meeny", "miny", "moe"));
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// To distinguish different instances of the pattern, (yes, you
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// can instantiate it more then once) the first argument to the
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// actual test case name. Remember to pick unique prefixes for different
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// instantiations. The tests from the instantiation above will have
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// these names:
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// You can use these names in --gtest_filter.
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This statement will instantiate all tests from FooTest again, each
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// with parameter values "cat" and "dog":
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst char* pets[] = {"cat", "dog"};
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The tests from the instantiation above will have these names:
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
1377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the given test case, whether their definitions come before or
1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// AFTER the INSTANTIATE_TEST_CASE_P statement.
1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Please also note that generator expressions (including parameters to the
14157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// generators) are evaluated in InitGoogleTest(), after main() has started.
14257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// This allows the user on one hand, to adjust generator parameters in order
14357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// to dynamically determine a set of tests to run and on the other hand,
14457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// give the user a chance to inspect the generated tests with Google Test
14557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// reflection API before RUN_ALL_TESTS() is executed.
1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for more examples.
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In the future, we plan to publish the API for defining new parameter
1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// generators. But for now this interface remains part of the internal
1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// implementation and is subject to change.
153b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad//
154b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad//
155b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// A parameterized test fixture must be derived from testing::Test and from
156b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// testing::WithParamInterface<T>, where T is the type of the parameter
157b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// values. Inheriting from TestWithParam<T> satisfies that requirement because
158b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// TestWithParam<T> inherits from both Test and WithParamInterface. In more
159b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// complicated hierarchies, however, it is occasionally useful to inherit
160b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// separately from Test and WithParamInterface. For example:
161b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
162b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass BaseTest : public ::testing::Test {
163b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // You can inherit all the usual members for a non-parameterized test
164b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // fixture here.
165b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad};
166b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
167b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
168b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // The usual test fixture members go here too.
169b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad};
170b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
171b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay FoadTEST_F(BaseTest, HasFoo) {
172b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // This is an ordinary non-parameterized test.
173b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad}
174b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
175b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay FoadTEST_P(DerivedTest, DoesBlah) {
176b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // GetParam works just the same here as if you inherit from TestWithParam.
177b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  EXPECT_TRUE(foo.Blah(GetParam()));
178b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad}
1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // 0
1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
182b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-port.h"
1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
184190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if !GTEST_OS_SYMBIAN
185b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# include <utility>
186190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif
1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// scripts/fuse_gtest.py depends on gtest's own header being #included
18957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// *unconditionally*.  Therefore these #includes cannot be moved
19057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// inside #if GTEST_HAS_PARAM_TEST.
191b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-internal.h"
192b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-param-util.h"
1937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if GTEST_HAS_PARAM_TEST
19557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
1967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
1977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Functions producing parameter generators.
1997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Google Test uses these generators to produce parameters for value-
2017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parameterized tests. When a parameterized test case is instantiated
2027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// with a particular generator, Google Test creates and runs tests
2037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for each element in the sequence produced by the generator.
2047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In the following sample, tests from test case FooTest are instantiated
2067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each three times with parameter values 3, 5, and 8:
2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// class FooTest : public TestWithParam<int> { ... };
2097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST_P(FooTest, TestThis) {
2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST_P(FooTest, TestThat) {
2137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
2147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
2157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Range() returns generators providing sequences of values in a range.
2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synopsis:
2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Range(start, end)
2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing a sequence of values {start, start+1,
2227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     start+2, ..., }.
2237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Range(start, end, step)
2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing a sequence of values {start, start+step,
2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     start+step+step, ..., }.
2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Notes:
2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   * The generated sequences never include end. For example, Range(1, 5)
2287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
2297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     returns a generator producing {1, 3, 5, 7}.
2307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   * start and end must have the same type. That type may be any integral or
2317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     floating-point type or a user defined type satisfying these conditions:
2327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * It must be assignable (have operator=() defined).
2337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * It must have operator+() (operator+(int-compatible type) for
2347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//       two-operand version).
2357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * It must have operator<() defined.
2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Elements in the resulting sequences will also have that type.
2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   * Condition start < end must be satisfied in order for resulting sequences
2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     to contain any elements.
2397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T, typename IncrementT>
2417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
2427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ParamGenerator<T>(
2437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      new internal::RangeGenerator<T, IncrementT>(start, end, step));
2447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
2457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
2477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ParamGenerator<T> Range(T start, T end) {
2487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return Range(start, end, 1);
2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
2507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ValuesIn() function allows generation of tests with parameters coming from
2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// a container.
2537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synopsis:
2557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ValuesIn(const T (&array)[N])
2567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing sequences with elements from
2577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     a C-style array.
2587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ValuesIn(const Container& container)
2597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing sequences with elements from
2607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     an STL-style container.
2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ValuesIn(Iterator begin, Iterator end)
2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing sequences with elements from
2637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     a range [begin, end) defined by a pair of STL-style iterators. These
2647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     iterators can also be plain C pointers.
2657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Please note that ValuesIn copies the values from the containers
2677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// passed in and keeps them to generate tests in RUN_ALL_TESTS().
2687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
2707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This instantiates tests from test case StringTest
2727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each with C-string values of "foo", "bar", and "baz":
2737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// const char* strings[] = {"foo", "bar", "baz"};
2757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
2767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This instantiates tests from test case StlStringTest
2787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each with STL strings with values "a" and "b":
2797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::std::vector< ::std::string> GetParameterStrings() {
2817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ::std::vector< ::std::string> v;
2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   v.push_back("a");
2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   v.push_back("b");
2847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   return v;
2857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
2867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(CharSequence,
2887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                         StlStringTest,
2897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                         ValuesIn(GetParameterStrings()));
2907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This will also instantiate tests from CharTest
2937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each with parameter values 'a' and 'b':
2947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::std::list<char> GetParameterChars() {
2967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ::std::list<char> list;
2977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   list.push_back('a');
2987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   list.push_back('b');
2997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   return list;
3007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
3017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::std::list<char> l = GetParameterChars();
3027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(CharSequence2,
3037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                         CharTest,
3047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                         ValuesIn(l.begin(), l.end()));
3057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename ForwardIterator>
3077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ParamGenerator<
308b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
309b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay FoadValuesIn(ForwardIterator begin, ForwardIterator end) {
310b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
311b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      ::value_type ParamType;
3127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ParamGenerator<ParamType>(
3137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
3147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T, size_t N>
3177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
3187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return ValuesIn(array, array + N);
3197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <class Container>
3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ParamGenerator<typename Container::value_type> ValuesIn(
3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Container& container) {
3247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return ValuesIn(container.begin(), container.end());
3257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3275760f35e1517a660958116f8c4aa81d941e8def8Eli Friedman} // namespace testing
3285760f35e1517a660958116f8c4aa81d941e8def8Eli Friedman
3295760f35e1517a660958116f8c4aa81d941e8def8Eli Friedman#include <gtest/internal/gtest-param-util-generated.h>
3305760f35e1517a660958116f8c4aa81d941e8def8Eli Friedman
3315760f35e1517a660958116f8c4aa81d941e8def8Eli Friedmannamespace testing {
3325760f35e1517a660958116f8c4aa81d941e8def8Eli Friedman
3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Values() allows generating tests from explicitly specified list of
3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parameters.
3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synopsis:
3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Values(T v1, T v2, ..., T vN)
3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing sequences with elements v1, v2, ..., vN.
3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For example, this instantiates tests from test case BarTest each
3417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// with values "one", "two", and "three":
3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The exact type of values will depend on the type of parameter in BazTest.
3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Currently, Values() supports from 1 to 50 parameters.
3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1>
3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray1<T1> Values(T1 v1) {
3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray1<T1>(v1);
3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>
3587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
3597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray2<T1, T2>(v1, v2);
3607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3>
3637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
3647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
3657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4>
3687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
3697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
3707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
3747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T5 v5) {
3757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
3767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6>
3807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
3817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T4 v4, T5 v5, T6 v6) {
3827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
3837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7>
3877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
3887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T4 v4, T5 v5, T6 v6, T7 v7) {
3897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
3907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v6, v7);
3917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8>
3957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
3967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
3977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
3987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v5, v6, v7, v8);
3997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9>
4037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
4047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
4057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
4067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v4, v5, v6, v7, v8, v9);
4077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10>
4117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
4127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
4137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
4147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v2, v3, v4, v5, v6, v7, v8, v9, v10);
4157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11>
4207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11) {
4237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
4257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12>
4307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12) {
4337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
4357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13>
4407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13) {
4437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
4457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14>
4507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
4537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
4557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v14);
4567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15>
4617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
4637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
4647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
4667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v13, v14, v15);
4677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
4727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16>
4737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16) {
4777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
4797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v12, v13, v14, v15, v16);
4807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
4857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17>
4867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17) {
4907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
4927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v11, v12, v13, v14, v15, v16, v17);
4937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
4947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
4977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
4987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18>
4997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
5017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
5027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18) {
5037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
5057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v10, v11, v12, v13, v14, v15, v16, v17, v18);
5067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19>
5127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
5147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
5157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
5167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
5187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
5197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20>
5257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
5297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
5317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
5327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
5387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21>
5397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
5437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
5457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
5467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
5527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22>
5537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
5557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T21 v21, T22 v22) {
5587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
5607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v20, v21, v22);
5627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
5687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23>
5697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
5717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T21 v21, T22 v22, T23 v23) {
5747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
5767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v20, v21, v22, v23);
5787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
5847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24>
5857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
5877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T21 v21, T22 v22, T23 v23, T24 v24) {
5907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
5927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
5937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v19, v20, v21, v22, v23, v24);
5947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
5957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
5987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
5997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
6007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25>
6017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
6037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
6047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
6057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
6067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
6087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
6097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v18, v19, v20, v21, v22, v23, v24, v25);
6107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
6117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
6147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
6157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
6167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
6177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26>
6187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26) {
6247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
6277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
6287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
6297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
6327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
6337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
6347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
6357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27>
6367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27) {
6427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
6457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
6467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
6477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
6507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
6517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
6527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
6537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28>
6547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27, T28 v28) {
6607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
6637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
6647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v28);
6657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
6667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
6697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
6707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
6717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
6727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29>
6737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27, T28 v28, T29 v29) {
6797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
6827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
6837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v27, v28, v29);
6847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
6857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
6887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
6897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
6907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
6917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30>
6927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
6957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
6967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
6977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
6987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
7017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
7027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v26, v27, v28, v29, v30);
7037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
7047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
7077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
7087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
7097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
7107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
7117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31>
7127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
7187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
7217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
7227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v25, v26, v27, v28, v29, v30, v31);
7237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
7247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
7277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
7287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
7297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
7307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
7317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32>
7327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T32 v32) {
7397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
7427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v24, v25, v26, v27, v28, v29, v30, v31, v32);
7447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
7457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
7487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
7497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
7507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
7517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
7527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33>
7537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
7567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T32 v32, T33 v33) {
7607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
7637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
7657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
7667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
7697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
7707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
7717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
7727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
7737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34>
7747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
7777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
7787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
7797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
7807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T31 v31, T32 v32, T33 v33, T34 v34) {
7817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
7847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
7857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
7867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
7877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
7907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
7917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
7927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
7937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
7947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35>
7957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
7987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
7997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
8007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
8017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
8027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
8057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
8067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
8077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
8087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
8117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
8127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
8137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
8147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
8157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
8167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36>
8177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
8207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
8217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
8227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
8237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
8247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
8277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v34, v35, v36);
8307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
8317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
8347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
8357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
8367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
8377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
8387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
8397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37>
8407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
8437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T37 v37) {
8487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
8517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v34, v35, v36, v37);
8547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
8557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
8587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
8597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
8607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
8617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
8627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
8637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38>
8647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
8677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T37 v37, T38 v38) {
8727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
8757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
8767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
8777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v33, v34, v35, v36, v37, v38);
8787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
8797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
8827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
8837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
8847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
8857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
8867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
8877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39>
8887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
8917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T37 v37, T38 v38, T39 v39) {
8967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
8997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
9007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
9017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v32, v33, v34, v35, v36, v37, v38, v39);
9027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
9037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
9067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
9077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
9087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
9097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
9107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
9117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40>
9127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
9157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
9167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
9177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
9187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
9197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
9207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
9247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
9257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
9267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
9277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
9307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
9317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
9327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
9337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
9347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
9357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
9367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41>
9377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
9407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
9457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
9497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
9507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
9517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
9527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
9557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
9567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
9577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
9587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
9597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
9607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
9617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42>
9627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
9657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T42 v42) {
9717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
9757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
9767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
9777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v42);
9787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
9797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
9827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
9837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
9847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
9857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
9867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
9877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
9887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43>
9897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
9927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T42 v42, T43 v43) {
9987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
10027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
10037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
10047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v41, v42, v43);
10057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
10067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
10097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
10107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
10117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
10127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
10137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
10147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
10157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44>
10167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
10237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
10247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T42 v42, T43 v43, T44 v44) {
10257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
10297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
10307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
10317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v40, v41, v42, v43, v44);
10327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
10337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
10367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
10377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
10387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
10397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
10407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
10417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
10427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44, typename T45>
10437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
10487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
10497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
10507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
10517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
10527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
10567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
10577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
10587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v39, v40, v41, v42, v43, v44, v45);
10597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
10607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
10637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
10647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
10657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
10667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
10677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
10687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
10697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44, typename T45,
10707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T46>
10717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
10777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
10787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
10797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
10807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
10847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
10857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
10867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v38, v39, v40, v41, v42, v43, v44, v45, v46);
10877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
10887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
10917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
10927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
10937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
10947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
10957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
10967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
10977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44, typename T45,
10987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T46, typename T47>
10997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
11037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
11047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
11087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
11127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
11137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
11147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
11157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
11167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
11197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
11207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
11217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
11227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
11237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
11247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
11257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44, typename T45,
11267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T46, typename T47, typename T48>
11277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
11317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
11327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
11367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T48 v48) {
11377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
11417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
11427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
11437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
11447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
11457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
11487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
11497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
11507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
11517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
11527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
11537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
11547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44, typename T45,
11557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T46, typename T47, typename T48, typename T49>
11567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
11607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
11617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
11627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
11637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
11647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
11657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T47 v47, T48 v48, T49 v49) {
11667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
11707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
11717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
11727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
11737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
11747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T6, typename T7, typename T8, typename T9, typename T10,
11777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T11, typename T12, typename T13, typename T14, typename T15,
11787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T16, typename T17, typename T18, typename T19, typename T20,
11797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T21, typename T22, typename T23, typename T24, typename T25,
11807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T26, typename T27, typename T28, typename T29, typename T30,
11817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T31, typename T32, typename T33, typename T34, typename T35,
11827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T36, typename T37, typename T38, typename T39, typename T40,
11837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T41, typename T42, typename T43, typename T44, typename T45,
11847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename T46, typename T47, typename T48, typename T49, typename T50>
11857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
11897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
11907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
11917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
11927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
11937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
11947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
11957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
11997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
12007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
12017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
12027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      v48, v49, v50);
12037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Bool() allows generating tests with parameters in a set of (false, true).
12067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synopsis:
12087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Bool()
12097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing sequences with elements {false, true}.
12107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// It is useful when testing code that depends on Boolean flags. Combinations
12127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of multiple flags can be tested when several Bool()'s are combined using
12137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Combine() function.
12147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In the following example all tests in the test case FlagDependentTest
12167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// will be instantiated twice with parameters false and true.
12177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// class FlagDependentTest : public testing::TestWithParam<bool> {
12197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual void SetUp() {
12207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     external_flag = GetParam();
12217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
12227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
12237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
12247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninline internal::ParamGenerator<bool> Bool() {
12267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return Values(false, true);
12277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1229b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# if GTEST_HAS_COMBINE
12307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Combine() allows the user to combine two or more sequences to produce
12317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// values of a Cartesian product of those sequences' elements.
12327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synopsis:
12347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Combine(gen1, gen2, ..., genN)
12357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - returns a generator producing sequences with elements coming from
12367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     the Cartesian product of elements from the sequences generated by
12377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     gen1, gen2, ..., genN. The sequence elements will have a type of
12387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
12397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     of elements from sequences produces by gen1, gen2, ..., genN.
12407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Combine can have up to 10 arguments. This number is currently limited
12427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// by the maximum number of elements in the tuple implementation used by Google
12437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Test.
12447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Example:
12467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This will instantiate tests in test case AnimalTest each one with
12487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
12497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// tuple("dog", BLACK), and tuple("dog", WHITE):
12507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// enum Color { BLACK, GRAY, WHITE };
12527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// class AnimalTest
12537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
12547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST_P(AnimalTest, AnimalLooksNice) {...}
12567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
12587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                         Combine(Values("cat", "dog"),
12597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                                 Values(BLACK, WHITE)));
12607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This will instantiate tests in FlagDependentTest with all variations of two
12627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Boolean flags:
12637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// class FlagDependentTest
12657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     : public testing::TestWithParam<tuple(bool, bool)> > {
12667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual void SetUp() {
12677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
12687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     tie(external_flag_1, external_flag_2) = GetParam();
12697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
12707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// };
12717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST_P(FlagDependentTest, TestFeature1) {
12737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   // Test your code using external_flag_1 and external_flag_2 here.
12747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
12757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
12767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//                         Combine(Bool(), Bool()));
12777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2>
12797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder2<Generator1, Generator2> Combine(
12807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2) {
12817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder2<Generator1, Generator2>(
12827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2);
12837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3>
12867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
12877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
12887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
12897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3);
12907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
12937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4>
12947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4> Combine(
12967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
12977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4) {
12987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4>(
13007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4);
13017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
13047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4, typename Generator5>
13057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4, Generator5> Combine(
13077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4, const Generator5& g5) {
13097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4, Generator5>(
13117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4, g5);
13127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
13157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4, typename Generator5, typename Generator6>
13167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4, Generator5, Generator6> Combine(
13187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
13207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4, Generator5, Generator6>(
13227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4, g5, g6);
13237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
13267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4, typename Generator5, typename Generator6,
13277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator7>
13287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4, Generator5, Generator6, Generator7> Combine(
13307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator7& g7) {
13337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4, Generator5, Generator6, Generator7>(
13357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4, g5, g6, g7);
13367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
13397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4, typename Generator5, typename Generator6,
13407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator7, typename Generator8>
13417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
13437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator7& g7, const Generator8& g8) {
13467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4, Generator5, Generator6, Generator7, Generator8>(
13487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4, g5, g6, g7, g8);
13497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
13527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4, typename Generator5, typename Generator6,
13537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator7, typename Generator8, typename Generator9>
13547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4, Generator5, Generator6, Generator7, Generator8,
13567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator9> Combine(
13577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
13607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
13627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4, g5, g6, g7, g8, g9);
13637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Generator1, typename Generator2, typename Generator3,
13667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator4, typename Generator5, typename Generator6,
13677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator7, typename Generator8, typename Generator9,
13687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typename Generator10>
13697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Generator10> Combine(
13727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator7& g7, const Generator8& g8, const Generator9& g9,
13757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        const Generator10& g10) {
13767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Generator10>(
13797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
13807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1381b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# endif  // GTEST_HAS_COMBINE
13827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1385b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define TEST_P(test_case_name, test_name) \
13867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
13877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      : public test_case_name { \
13887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman   public: \
13897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
13907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    virtual void TestBody(); \
13917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman   private: \
13927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    static int AddToRegistry() { \
13937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
13947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          GetTestCasePatternHolder<test_case_name>(\
13957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
13967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                  #test_case_name, \
13977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                  #test_name, \
13987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                  new ::testing::internal::TestMetaFactory< \
13997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
14007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      return 0; \
14017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    } \
14027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    static int gtest_registering_dummy_; \
14037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
14047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
14057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }; \
14067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int GTEST_TEST_CLASS_NAME_(test_case_name, \
14077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                             test_name)::gtest_registering_dummy_ = \
14087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
14097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
14107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1411b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
14127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
14137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
14147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int gtest_##prefix##test_case_name##_dummy_ = \
14157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
14167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          GetTestCasePatternHolder<test_case_name>(\
14177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
14187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                  #prefix, \
14197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
14207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                  __FILE__, __LINE__)
14217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
14237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_PARAM_TEST
14257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1427