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