LCOV - code coverage report
Current view: top level - third_party/googletest/include/gtest - gtest-param-test.h (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 10 10 100.0 %
Date: 2015-10-10 Functions: 9 9 100.0 %

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

Generated by: LCOV version 1.10