Home | History | Annotate | Download | only in gtest
      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 (at) 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 
    194 #if GTEST_HAS_PARAM_TEST
    195 
    196 namespace testing {
    197 
    198 // Functions producing parameter generators.
    199 //
    200 // Google Test uses these generators to produce parameters for value-
    201 // parameterized tests. When a parameterized test case is instantiated
    202 // with a particular generator, Google Test creates and runs tests
    203 // for each element in the sequence produced by the generator.
    204 //
    205 // In the following sample, tests from test case FooTest are instantiated
    206 // each three times with parameter values 3, 5, and 8:
    207 //
    208 // class FooTest : public TestWithParam<int> { ... };
    209 //
    210 // TEST_P(FooTest, TestThis) {
    211 // }
    212 // TEST_P(FooTest, TestThat) {
    213 // }
    214 // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
    215 //
    216 
    217 // Range() returns generators providing sequences of values in a range.
    218 //
    219 // Synopsis:
    220 // Range(start, end)
    221 //   - returns a generator producing a sequence of values {start, start+1,
    222 //     start+2, ..., }.
    223 // Range(start, end, step)
    224 //   - returns a generator producing a sequence of values {start, start+step,
    225 //     start+step+step, ..., }.
    226 // Notes:
    227 //   * The generated sequences never include end. For example, Range(1, 5)
    228 //     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
    229 //     returns a generator producing {1, 3, 5, 7}.
    230 //   * start and end must have the same type. That type may be any integral or
    231 //     floating-point type or a user defined type satisfying these conditions:
    232 //     * It must be assignable (have operator=() defined).
    233 //     * It must have operator+() (operator+(int-compatible type) for
    234 //       two-operand version).
    235 //     * It must have operator<() defined.
    236 //     Elements in the resulting sequences will also have that type.
    237 //   * Condition start < end must be satisfied in order for resulting sequences
    238 //     to contain any elements.
    239 //
    240 template <typename T, typename IncrementT>
    241 internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
    242   return internal::ParamGenerator<T>(
    243       new internal::RangeGenerator<T, IncrementT>(start, end, step));
    244 }
    245 
    246 template <typename T>
    247 internal::ParamGenerator<T> Range(T start, T end) {
    248   return Range(start, end, 1);
    249 }
    250 
    251 // ValuesIn() function allows generation of tests with parameters coming from
    252 // a container.
    253 //
    254 // Synopsis:
    255 // ValuesIn(const T (&array)[N])
    256 //   - returns a generator producing sequences with elements from
    257 //     a C-style array.
    258 // ValuesIn(const Container& container)
    259 //   - returns a generator producing sequences with elements from
    260 //     an STL-style container.
    261 // ValuesIn(Iterator begin, Iterator end)
    262 //   - returns a generator producing sequences with elements from
    263 //     a range [begin, end) defined by a pair of STL-style iterators. These
    264 //     iterators can also be plain C pointers.
    265 //
    266 // Please note that ValuesIn copies the values from the containers
    267 // passed in and keeps them to generate tests in RUN_ALL_TESTS().
    268 //
    269 // Examples:
    270 //
    271 // This instantiates tests from test case StringTest
    272 // each with C-string values of "foo", "bar", and "baz":
    273 //
    274 // const char* strings[] = {"foo", "bar", "baz"};
    275 // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
    276 //
    277 // This instantiates tests from test case StlStringTest
    278 // each with STL strings with values "a" and "b":
    279 //
    280 // ::std::vector< ::std::string> GetParameterStrings() {
    281 //   ::std::vector< ::std::string> v;
    282 //   v.push_back("a");
    283 //   v.push_back("b");
    284 //   return v;
    285 // }
    286 //
    287 // INSTANTIATE_TEST_CASE_P(CharSequence,
    288 //                         StlStringTest,
    289 //                         ValuesIn(GetParameterStrings()));
    290 //
    291 //
    292 // This will also instantiate tests from CharTest
    293 // each with parameter values 'a' and 'b':
    294 //
    295 // ::std::list<char> GetParameterChars() {
    296 //   ::std::list<char> list;
    297 //   list.push_back('a');
    298 //   list.push_back('b');
    299 //   return list;
    300 // }
    301 // ::std::list<char> l = GetParameterChars();
    302 // INSTANTIATE_TEST_CASE_P(CharSequence2,
    303 //                         CharTest,
    304 //                         ValuesIn(l.begin(), l.end()));
    305 //
    306 template <typename ForwardIterator>
    307 internal::ParamGenerator<
    308   typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
    309 ValuesIn(ForwardIterator begin, ForwardIterator end) {
    310   typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
    311       ::value_type ParamType;
    312   return internal::ParamGenerator<ParamType>(
    313       new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
    314 }
    315 
    316 template <typename T, size_t N>
    317 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
    318   return ValuesIn(array, array + N);
    319 }
    320 
    321 template <class Container>
    322 internal::ParamGenerator<typename Container::value_type> ValuesIn(
    323     const Container& container) {
    324   return ValuesIn(container.begin(), container.end());
    325 }
    326 
    327 } // namespace testing
    328 #include <gtest/internal/gtest-param-util-generated.h> // Must be included after ValuesIn and friends are defined
    329 namespace testing { // And back in...
    330 
    331 // Values() allows generating tests from explicitly specified list of
    332 // parameters.
    333 //
    334 // Synopsis:
    335 // Values(T v1, T v2, ..., T vN)
    336 //   - returns a generator producing sequences with elements v1, v2, ..., vN.
    337 //
    338 // For example, this instantiates tests from test case BarTest each
    339 // with values "one", "two", and "three":
    340 //
    341 // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
    342 //
    343 // This instantiates tests from test case BazTest each with values 1, 2, 3.5.
    344 // The exact type of values will depend on the type of parameter in BazTest.
    345 //
    346 // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
    347 //
    348 // Currently, Values() supports from 1 to 50 parameters.
    349 //
    350 template <typename T1>
    351 internal::ValueArray1<T1> Values(T1 v1) {
    352   return internal::ValueArray1<T1>(v1);
    353 }
    354 
    355 template <typename T1, typename T2>
    356 internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
    357   return internal::ValueArray2<T1, T2>(v1, v2);
    358 }
    359 
    360 template <typename T1, typename T2, typename T3>
    361 internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
    362   return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
    363 }
    364 
    365 template <typename T1, typename T2, typename T3, typename T4>
    366 internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
    367   return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
    368 }
    369 
    370 template <typename T1, typename T2, typename T3, typename T4, typename T5>
    371 internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
    372     T5 v5) {
    373   return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
    374 }
    375 
    376 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    377     typename T6>
    378 internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
    379     T4 v4, T5 v5, T6 v6) {
    380   return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
    381 }
    382 
    383 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    384     typename T6, typename T7>
    385 internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
    386     T4 v4, T5 v5, T6 v6, T7 v7) {
    387   return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
    388       v6, v7);
    389 }
    390 
    391 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    392     typename T6, typename T7, typename T8>
    393 internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
    394     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
    395   return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
    396       v5, v6, v7, v8);
    397 }
    398 
    399 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    400     typename T6, typename T7, typename T8, typename T9>
    401 internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
    402     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
    403   return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
    404       v4, v5, v6, v7, v8, v9);
    405 }
    406 
    407 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    408     typename T6, typename T7, typename T8, typename T9, typename T10>
    409 internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
    410     T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
    411   return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
    412       v2, v3, v4, v5, v6, v7, v8, v9, v10);
    413 }
    414 
    415 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    416     typename T6, typename T7, typename T8, typename T9, typename T10,
    417     typename T11>
    418 internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
    419     T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    420     T10 v10, T11 v11) {
    421   return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
    422       T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
    423 }
    424 
    425 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    426     typename T6, typename T7, typename T8, typename T9, typename T10,
    427     typename T11, typename T12>
    428 internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    429     T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    430     T10 v10, T11 v11, T12 v12) {
    431   return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    432       T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
    433 }
    434 
    435 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    436     typename T6, typename T7, typename T8, typename T9, typename T10,
    437     typename T11, typename T12, typename T13>
    438 internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
    439     T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    440     T10 v10, T11 v11, T12 v12, T13 v13) {
    441   return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    442       T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
    443 }
    444 
    445 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    446     typename T6, typename T7, typename T8, typename T9, typename T10,
    447     typename T11, typename T12, typename T13, typename T14>
    448 internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    449     T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    450     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
    451   return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    452       T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    453       v14);
    454 }
    455 
    456 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    457     typename T6, typename T7, typename T8, typename T9, typename T10,
    458     typename T11, typename T12, typename T13, typename T14, typename T15>
    459 internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    460     T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
    461     T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
    462   return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    463       T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    464       v13, v14, v15);
    465 }
    466 
    467 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    468     typename T6, typename T7, typename T8, typename T9, typename T10,
    469     typename T11, typename T12, typename T13, typename T14, typename T15,
    470     typename T16>
    471 internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    472     T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
    473     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
    474     T16 v16) {
    475   return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    476       T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
    477       v12, v13, v14, v15, v16);
    478 }
    479 
    480 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    481     typename T6, typename T7, typename T8, typename T9, typename T10,
    482     typename T11, typename T12, typename T13, typename T14, typename T15,
    483     typename T16, typename T17>
    484 internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    485     T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
    486     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
    487     T16 v16, T17 v17) {
    488   return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    489       T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
    490       v11, v12, v13, v14, v15, v16, v17);
    491 }
    492 
    493 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    494     typename T6, typename T7, typename T8, typename T9, typename T10,
    495     typename T11, typename T12, typename T13, typename T14, typename T15,
    496     typename T16, typename T17, typename T18>
    497 internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    498     T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
    499     T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
    500     T16 v16, T17 v17, T18 v18) {
    501   return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    502       T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
    503       v10, v11, v12, v13, v14, v15, v16, v17, v18);
    504 }
    505 
    506 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    507     typename T6, typename T7, typename T8, typename T9, typename T10,
    508     typename T11, typename T12, typename T13, typename T14, typename T15,
    509     typename T16, typename T17, typename T18, typename T19>
    510 internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    511     T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
    512     T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
    513     T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
    514   return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    515       T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
    516       v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
    517 }
    518 
    519 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    520     typename T6, typename T7, typename T8, typename T9, typename T10,
    521     typename T11, typename T12, typename T13, typename T14, typename T15,
    522     typename T16, typename T17, typename T18, typename T19, typename T20>
    523 internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    524     T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
    525     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
    526     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
    527   return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    528       T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
    529       v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
    530 }
    531 
    532 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    533     typename T6, typename T7, typename T8, typename T9, typename T10,
    534     typename T11, typename T12, typename T13, typename T14, typename T15,
    535     typename T16, typename T17, typename T18, typename T19, typename T20,
    536     typename T21>
    537 internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    538     T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
    539     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
    540     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
    541   return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    542       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
    543       v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
    544 }
    545 
    546 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    547     typename T6, typename T7, typename T8, typename T9, typename T10,
    548     typename T11, typename T12, typename T13, typename T14, typename T15,
    549     typename T16, typename T17, typename T18, typename T19, typename T20,
    550     typename T21, typename T22>
    551 internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    552     T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
    553     T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
    554     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
    555     T21 v21, T22 v22) {
    556   return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    557       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
    558       v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
    559       v20, v21, v22);
    560 }
    561 
    562 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    563     typename T6, typename T7, typename T8, typename T9, typename T10,
    564     typename T11, typename T12, typename T13, typename T14, typename T15,
    565     typename T16, typename T17, typename T18, typename T19, typename T20,
    566     typename T21, typename T22, typename T23>
    567 internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    568     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
    569     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
    570     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
    571     T21 v21, T22 v22, T23 v23) {
    572   return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    573       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
    574       v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
    575       v20, v21, v22, v23);
    576 }
    577 
    578 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    579     typename T6, typename T7, typename T8, typename T9, typename T10,
    580     typename T11, typename T12, typename T13, typename T14, typename T15,
    581     typename T16, typename T17, typename T18, typename T19, typename T20,
    582     typename T21, typename T22, typename T23, typename T24>
    583 internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    584     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
    585     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
    586     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
    587     T21 v21, T22 v22, T23 v23, T24 v24) {
    588   return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    589       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
    590       v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
    591       v19, v20, v21, v22, v23, v24);
    592 }
    593 
    594 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    595     typename T6, typename T7, typename T8, typename T9, typename T10,
    596     typename T11, typename T12, typename T13, typename T14, typename T15,
    597     typename T16, typename T17, typename T18, typename T19, typename T20,
    598     typename T21, typename T22, typename T23, typename T24, typename T25>
    599 internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    600     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
    601     T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
    602     T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
    603     T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
    604   return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    605       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
    606       v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
    607       v18, v19, v20, v21, v22, v23, v24, v25);
    608 }
    609 
    610 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    611     typename T6, typename T7, typename T8, typename T9, typename T10,
    612     typename T11, typename T12, typename T13, typename T14, typename T15,
    613     typename T16, typename T17, typename T18, typename T19, typename T20,
    614     typename T21, typename T22, typename T23, typename T24, typename T25,
    615     typename T26>
    616 internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    617     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    618     T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    619     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    620     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    621     T26 v26) {
    622   return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    623       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    624       T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
    625       v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
    626 }
    627 
    628 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    629     typename T6, typename T7, typename T8, typename T9, typename T10,
    630     typename T11, typename T12, typename T13, typename T14, typename T15,
    631     typename T16, typename T17, typename T18, typename T19, typename T20,
    632     typename T21, typename T22, typename T23, typename T24, typename T25,
    633     typename T26, typename T27>
    634 internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    635     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
    636     T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    637     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    638     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    639     T26 v26, T27 v27) {
    640   return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    641       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    642       T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
    643       v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
    644 }
    645 
    646 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    647     typename T6, typename T7, typename T8, typename T9, typename T10,
    648     typename T11, typename T12, typename T13, typename T14, typename T15,
    649     typename T16, typename T17, typename T18, typename T19, typename T20,
    650     typename T21, typename T22, typename T23, typename T24, typename T25,
    651     typename T26, typename T27, typename T28>
    652 internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    653     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
    654     T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    655     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    656     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    657     T26 v26, T27 v27, T28 v28) {
    658   return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    659       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    660       T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    661       v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
    662       v28);
    663 }
    664 
    665 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    666     typename T6, typename T7, typename T8, typename T9, typename T10,
    667     typename T11, typename T12, typename T13, typename T14, typename T15,
    668     typename T16, typename T17, typename T18, typename T19, typename T20,
    669     typename T21, typename T22, typename T23, typename T24, typename T25,
    670     typename T26, typename T27, typename T28, typename T29>
    671 internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    672     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    673     T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    674     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    675     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    676     T26 v26, T27 v27, T28 v28, T29 v29) {
    677   return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    678       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    679       T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    680       v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
    681       v27, v28, v29);
    682 }
    683 
    684 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    685     typename T6, typename T7, typename T8, typename T9, typename T10,
    686     typename T11, typename T12, typename T13, typename T14, typename T15,
    687     typename T16, typename T17, typename T18, typename T19, typename T20,
    688     typename T21, typename T22, typename T23, typename T24, typename T25,
    689     typename T26, typename T27, typename T28, typename T29, typename T30>
    690 internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    691     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    692     T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
    693     T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
    694     T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
    695     T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
    696   return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    697       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    698       T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
    699       v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
    700       v26, v27, v28, v29, v30);
    701 }
    702 
    703 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    704     typename T6, typename T7, typename T8, typename T9, typename T10,
    705     typename T11, typename T12, typename T13, typename T14, typename T15,
    706     typename T16, typename T17, typename T18, typename T19, typename T20,
    707     typename T21, typename T22, typename T23, typename T24, typename T25,
    708     typename T26, typename T27, typename T28, typename T29, typename T30,
    709     typename T31>
    710 internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    711     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    712     T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
    713     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
    714     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
    715     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
    716   return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    717       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    718       T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
    719       v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
    720       v25, v26, v27, v28, v29, v30, v31);
    721 }
    722 
    723 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    724     typename T6, typename T7, typename T8, typename T9, typename T10,
    725     typename T11, typename T12, typename T13, typename T14, typename T15,
    726     typename T16, typename T17, typename T18, typename T19, typename T20,
    727     typename T21, typename T22, typename T23, typename T24, typename T25,
    728     typename T26, typename T27, typename T28, typename T29, typename T30,
    729     typename T31, typename T32>
    730 internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    731     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    732     T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
    733     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
    734     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
    735     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
    736     T32 v32) {
    737   return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    738       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    739       T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
    740       v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
    741       v24, v25, v26, v27, v28, v29, v30, v31, v32);
    742 }
    743 
    744 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    745     typename T6, typename T7, typename T8, typename T9, typename T10,
    746     typename T11, typename T12, typename T13, typename T14, typename T15,
    747     typename T16, typename T17, typename T18, typename T19, typename T20,
    748     typename T21, typename T22, typename T23, typename T24, typename T25,
    749     typename T26, typename T27, typename T28, typename T29, typename T30,
    750     typename T31, typename T32, typename T33>
    751 internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    752     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    753     T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
    754     T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
    755     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
    756     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
    757     T32 v32, T33 v33) {
    758   return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    759       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    760       T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
    761       v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
    762       v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
    763 }
    764 
    765 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    766     typename T6, typename T7, typename T8, typename T9, typename T10,
    767     typename T11, typename T12, typename T13, typename T14, typename T15,
    768     typename T16, typename T17, typename T18, typename T19, typename T20,
    769     typename T21, typename T22, typename T23, typename T24, typename T25,
    770     typename T26, typename T27, typename T28, typename T29, typename T30,
    771     typename T31, typename T32, typename T33, typename T34>
    772 internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    773     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    774     T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
    775     T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
    776     T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
    777     T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
    778     T31 v31, T32 v32, T33 v33, T34 v34) {
    779   return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    780       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    781       T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
    782       v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
    783       v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
    784 }
    785 
    786 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    787     typename T6, typename T7, typename T8, typename T9, typename T10,
    788     typename T11, typename T12, typename T13, typename T14, typename T15,
    789     typename T16, typename T17, typename T18, typename T19, typename T20,
    790     typename T21, typename T22, typename T23, typename T24, typename T25,
    791     typename T26, typename T27, typename T28, typename T29, typename T30,
    792     typename T31, typename T32, typename T33, typename T34, typename T35>
    793 internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    794     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    795     T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
    796     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
    797     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
    798     T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
    799     T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
    800   return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    801       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    802       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
    803       v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
    804       v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
    805 }
    806 
    807 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    808     typename T6, typename T7, typename T8, typename T9, typename T10,
    809     typename T11, typename T12, typename T13, typename T14, typename T15,
    810     typename T16, typename T17, typename T18, typename T19, typename T20,
    811     typename T21, typename T22, typename T23, typename T24, typename T25,
    812     typename T26, typename T27, typename T28, typename T29, typename T30,
    813     typename T31, typename T32, typename T33, typename T34, typename T35,
    814     typename T36>
    815 internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    816     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    817     T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
    818     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
    819     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
    820     T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
    821     T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
    822   return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    823       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    824       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
    825       v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
    826       v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
    827       v34, v35, v36);
    828 }
    829 
    830 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    831     typename T6, typename T7, typename T8, typename T9, typename T10,
    832     typename T11, typename T12, typename T13, typename T14, typename T15,
    833     typename T16, typename T17, typename T18, typename T19, typename T20,
    834     typename T21, typename T22, typename T23, typename T24, typename T25,
    835     typename T26, typename T27, typename T28, typename T29, typename T30,
    836     typename T31, typename T32, typename T33, typename T34, typename T35,
    837     typename T36, typename T37>
    838 internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    839     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    840     T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
    841     T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
    842     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
    843     T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
    844     T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
    845     T37 v37) {
    846   return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    847       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    848       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
    849       v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
    850       v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
    851       v34, v35, v36, v37);
    852 }
    853 
    854 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    855     typename T6, typename T7, typename T8, typename T9, typename T10,
    856     typename T11, typename T12, typename T13, typename T14, typename T15,
    857     typename T16, typename T17, typename T18, typename T19, typename T20,
    858     typename T21, typename T22, typename T23, typename T24, typename T25,
    859     typename T26, typename T27, typename T28, typename T29, typename T30,
    860     typename T31, typename T32, typename T33, typename T34, typename T35,
    861     typename T36, typename T37, typename T38>
    862 internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    863     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    864     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
    865     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
    866     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
    867     T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
    868     T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
    869     T37 v37, T38 v38) {
    870   return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    871       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    872       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
    873       v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
    874       v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
    875       v33, v34, v35, v36, v37, v38);
    876 }
    877 
    878 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    879     typename T6, typename T7, typename T8, typename T9, typename T10,
    880     typename T11, typename T12, typename T13, typename T14, typename T15,
    881     typename T16, typename T17, typename T18, typename T19, typename T20,
    882     typename T21, typename T22, typename T23, typename T24, typename T25,
    883     typename T26, typename T27, typename T28, typename T29, typename T30,
    884     typename T31, typename T32, typename T33, typename T34, typename T35,
    885     typename T36, typename T37, typename T38, typename T39>
    886 internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    887     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    888     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
    889     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
    890     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
    891     T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
    892     T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
    893     T37 v37, T38 v38, T39 v39) {
    894   return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    895       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    896       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
    897       v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
    898       v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
    899       v32, v33, v34, v35, v36, v37, v38, v39);
    900 }
    901 
    902 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    903     typename T6, typename T7, typename T8, typename T9, typename T10,
    904     typename T11, typename T12, typename T13, typename T14, typename T15,
    905     typename T16, typename T17, typename T18, typename T19, typename T20,
    906     typename T21, typename T22, typename T23, typename T24, typename T25,
    907     typename T26, typename T27, typename T28, typename T29, typename T30,
    908     typename T31, typename T32, typename T33, typename T34, typename T35,
    909     typename T36, typename T37, typename T38, typename T39, typename T40>
    910 internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    911     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    912     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
    913     T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
    914     T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
    915     T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
    916     T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
    917     T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
    918   return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    919       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    920       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
    921       T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
    922       v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
    923       v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
    924 }
    925 
    926 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    927     typename T6, typename T7, typename T8, typename T9, typename T10,
    928     typename T11, typename T12, typename T13, typename T14, typename T15,
    929     typename T16, typename T17, typename T18, typename T19, typename T20,
    930     typename T21, typename T22, typename T23, typename T24, typename T25,
    931     typename T26, typename T27, typename T28, typename T29, typename T30,
    932     typename T31, typename T32, typename T33, typename T34, typename T35,
    933     typename T36, typename T37, typename T38, typename T39, typename T40,
    934     typename T41>
    935 internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    936     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    937     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
    938     T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    939     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    940     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    941     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
    942     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
    943   return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    944       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    945       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
    946       T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
    947       v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
    948       v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
    949 }
    950 
    951 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    952     typename T6, typename T7, typename T8, typename T9, typename T10,
    953     typename T11, typename T12, typename T13, typename T14, typename T15,
    954     typename T16, typename T17, typename T18, typename T19, typename T20,
    955     typename T21, typename T22, typename T23, typename T24, typename T25,
    956     typename T26, typename T27, typename T28, typename T29, typename T30,
    957     typename T31, typename T32, typename T33, typename T34, typename T35,
    958     typename T36, typename T37, typename T38, typename T39, typename T40,
    959     typename T41, typename T42>
    960 internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    961     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    962     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
    963     T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    964     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    965     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    966     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
    967     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
    968     T42 v42) {
    969   return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    970       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    971       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
    972       T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    973       v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
    974       v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
    975       v42);
    976 }
    977 
    978 template <typename T1, typename T2, typename T3, typename T4, typename T5,
    979     typename T6, typename T7, typename T8, typename T9, typename T10,
    980     typename T11, typename T12, typename T13, typename T14, typename T15,
    981     typename T16, typename T17, typename T18, typename T19, typename T20,
    982     typename T21, typename T22, typename T23, typename T24, typename T25,
    983     typename T26, typename T27, typename T28, typename T29, typename T30,
    984     typename T31, typename T32, typename T33, typename T34, typename T35,
    985     typename T36, typename T37, typename T38, typename T39, typename T40,
    986     typename T41, typename T42, typename T43>
    987 internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    988     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
    989     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
    990     T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
    991     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
    992     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
    993     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
    994     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
    995     T42 v42, T43 v43) {
    996   return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    997       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
    998       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
    999       T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
   1000       v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
   1001       v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
   1002       v41, v42, v43);
   1003 }
   1004 
   1005 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1006     typename T6, typename T7, typename T8, typename T9, typename T10,
   1007     typename T11, typename T12, typename T13, typename T14, typename T15,
   1008     typename T16, typename T17, typename T18, typename T19, typename T20,
   1009     typename T21, typename T22, typename T23, typename T24, typename T25,
   1010     typename T26, typename T27, typename T28, typename T29, typename T30,
   1011     typename T31, typename T32, typename T33, typename T34, typename T35,
   1012     typename T36, typename T37, typename T38, typename T39, typename T40,
   1013     typename T41, typename T42, typename T43, typename T44>
   1014 internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1015     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1016     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1017     T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   1018     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   1019     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
   1020     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
   1021     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
   1022     T42 v42, T43 v43, T44 v44) {
   1023   return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1024       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1025       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1026       T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
   1027       v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
   1028       v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
   1029       v40, v41, v42, v43, v44);
   1030 }
   1031 
   1032 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1033     typename T6, typename T7, typename T8, typename T9, typename T10,
   1034     typename T11, typename T12, typename T13, typename T14, typename T15,
   1035     typename T16, typename T17, typename T18, typename T19, typename T20,
   1036     typename T21, typename T22, typename T23, typename T24, typename T25,
   1037     typename T26, typename T27, typename T28, typename T29, typename T30,
   1038     typename T31, typename T32, typename T33, typename T34, typename T35,
   1039     typename T36, typename T37, typename T38, typename T39, typename T40,
   1040     typename T41, typename T42, typename T43, typename T44, typename T45>
   1041 internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1042     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1043     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1044     T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
   1045     T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
   1046     T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
   1047     T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
   1048     T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
   1049     T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
   1050   return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1051       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1052       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1053       T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
   1054       v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
   1055       v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
   1056       v39, v40, v41, v42, v43, v44, v45);
   1057 }
   1058 
   1059 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1060     typename T6, typename T7, typename T8, typename T9, typename T10,
   1061     typename T11, typename T12, typename T13, typename T14, typename T15,
   1062     typename T16, typename T17, typename T18, typename T19, typename T20,
   1063     typename T21, typename T22, typename T23, typename T24, typename T25,
   1064     typename T26, typename T27, typename T28, typename T29, typename T30,
   1065     typename T31, typename T32, typename T33, typename T34, typename T35,
   1066     typename T36, typename T37, typename T38, typename T39, typename T40,
   1067     typename T41, typename T42, typename T43, typename T44, typename T45,
   1068     typename T46>
   1069 internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1070     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1071     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1072     T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
   1073     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
   1074     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
   1075     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
   1076     T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
   1077     T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
   1078   return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1079       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1080       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1081       T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
   1082       v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
   1083       v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
   1084       v38, v39, v40, v41, v42, v43, v44, v45, v46);
   1085 }
   1086 
   1087 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1088     typename T6, typename T7, typename T8, typename T9, typename T10,
   1089     typename T11, typename T12, typename T13, typename T14, typename T15,
   1090     typename T16, typename T17, typename T18, typename T19, typename T20,
   1091     typename T21, typename T22, typename T23, typename T24, typename T25,
   1092     typename T26, typename T27, typename T28, typename T29, typename T30,
   1093     typename T31, typename T32, typename T33, typename T34, typename T35,
   1094     typename T36, typename T37, typename T38, typename T39, typename T40,
   1095     typename T41, typename T42, typename T43, typename T44, typename T45,
   1096     typename T46, typename T47>
   1097 internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1098     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1099     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1100     T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
   1101     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
   1102     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
   1103     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
   1104     T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
   1105     T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
   1106   return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1107       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1108       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1109       T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
   1110       v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
   1111       v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
   1112       v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
   1113 }
   1114 
   1115 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1116     typename T6, typename T7, typename T8, typename T9, typename T10,
   1117     typename T11, typename T12, typename T13, typename T14, typename T15,
   1118     typename T16, typename T17, typename T18, typename T19, typename T20,
   1119     typename T21, typename T22, typename T23, typename T24, typename T25,
   1120     typename T26, typename T27, typename T28, typename T29, typename T30,
   1121     typename T31, typename T32, typename T33, typename T34, typename T35,
   1122     typename T36, typename T37, typename T38, typename T39, typename T40,
   1123     typename T41, typename T42, typename T43, typename T44, typename T45,
   1124     typename T46, typename T47, typename T48>
   1125 internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1126     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1127     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1128     T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
   1129     T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
   1130     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
   1131     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
   1132     T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
   1133     T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
   1134     T48 v48) {
   1135   return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1136       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1137       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1138       T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
   1139       v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
   1140       v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
   1141       v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
   1142 }
   1143 
   1144 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1145     typename T6, typename T7, typename T8, typename T9, typename T10,
   1146     typename T11, typename T12, typename T13, typename T14, typename T15,
   1147     typename T16, typename T17, typename T18, typename T19, typename T20,
   1148     typename T21, typename T22, typename T23, typename T24, typename T25,
   1149     typename T26, typename T27, typename T28, typename T29, typename T30,
   1150     typename T31, typename T32, typename T33, typename T34, typename T35,
   1151     typename T36, typename T37, typename T38, typename T39, typename T40,
   1152     typename T41, typename T42, typename T43, typename T44, typename T45,
   1153     typename T46, typename T47, typename T48, typename T49>
   1154 internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1155     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1156     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1157     T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
   1158     T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
   1159     T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
   1160     T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
   1161     T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
   1162     T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
   1163     T47 v47, T48 v48, T49 v49) {
   1164   return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1165       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1166       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1167       T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
   1168       v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
   1169       v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
   1170       v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
   1171 }
   1172 
   1173 template <typename T1, typename T2, typename T3, typename T4, typename T5,
   1174     typename T6, typename T7, typename T8, typename T9, typename T10,
   1175     typename T11, typename T12, typename T13, typename T14, typename T15,
   1176     typename T16, typename T17, typename T18, typename T19, typename T20,
   1177     typename T21, typename T22, typename T23, typename T24, typename T25,
   1178     typename T26, typename T27, typename T28, typename T29, typename T30,
   1179     typename T31, typename T32, typename T33, typename T34, typename T35,
   1180     typename T36, typename T37, typename T38, typename T39, typename T40,
   1181     typename T41, typename T42, typename T43, typename T44, typename T45,
   1182     typename T46, typename T47, typename T48, typename T49, typename T50>
   1183 internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
   1184     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
   1185     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
   1186     T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
   1187     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
   1188     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
   1189     T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
   1190     T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
   1191     T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
   1192     T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
   1193   return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
   1194       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
   1195       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
   1196       T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
   1197       v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
   1198       v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
   1199       v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
   1200       v48, v49, v50);
   1201 }
   1202 
   1203 // Bool() allows generating tests with parameters in a set of (false, true).
   1204 //
   1205 // Synopsis:
   1206 // Bool()
   1207 //   - returns a generator producing sequences with elements {false, true}.
   1208 //
   1209 // It is useful when testing code that depends on Boolean flags. Combinations
   1210 // of multiple flags can be tested when several Bool()'s are combined using
   1211 // Combine() function.
   1212 //
   1213 // In the following example all tests in the test case FlagDependentTest
   1214 // will be instantiated twice with parameters false and true.
   1215 //
   1216 // class FlagDependentTest : public testing::TestWithParam<bool> {
   1217 //   virtual void SetUp() {
   1218 //     external_flag = GetParam();
   1219 //   }
   1220 // }
   1221 // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
   1222 //
   1223 inline internal::ParamGenerator<bool> Bool() {
   1224   return Values(false, true);
   1225 }
   1226 
   1227 # if GTEST_HAS_COMBINE
   1228 // Combine() allows the user to combine two or more sequences to produce
   1229 // values of a Cartesian product of those sequences' elements.
   1230 //
   1231 // Synopsis:
   1232 // Combine(gen1, gen2, ..., genN)
   1233 //   - returns a generator producing sequences with elements coming from
   1234 //     the Cartesian product of elements from the sequences generated by
   1235 //     gen1, gen2, ..., genN. The sequence elements will have a type of
   1236 //     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
   1237 //     of elements from sequences produces by gen1, gen2, ..., genN.
   1238 //
   1239 // Combine can have up to 10 arguments. This number is currently limited
   1240 // by the maximum number of elements in the tuple implementation used by Google
   1241 // Test.
   1242 //
   1243 // Example:
   1244 //
   1245 // This will instantiate tests in test case AnimalTest each one with
   1246 // the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
   1247 // tuple("dog", BLACK), and tuple("dog", WHITE):
   1248 //
   1249 // enum Color { BLACK, GRAY, WHITE };
   1250 // class AnimalTest
   1251 //     : public testing::TestWithParam<tuple<const char*, Color> > {...};
   1252 //
   1253 // TEST_P(AnimalTest, AnimalLooksNice) {...}
   1254 //
   1255 // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
   1256 //                         Combine(Values("cat", "dog"),
   1257 //                                 Values(BLACK, WHITE)));
   1258 //
   1259 // This will instantiate tests in FlagDependentTest with all variations of two
   1260 // Boolean flags:
   1261 //
   1262 // class FlagDependentTest
   1263 //     : public testing::TestWithParam<tuple(bool, bool)> > {
   1264 //   virtual void SetUp() {
   1265 //     // Assigns external_flag_1 and external_flag_2 values from the tuple.
   1266 //     tie(external_flag_1, external_flag_2) = GetParam();
   1267 //   }
   1268 // };
   1269 //
   1270 // TEST_P(FlagDependentTest, TestFeature1) {
   1271 //   // Test your code using external_flag_1 and external_flag_2 here.
   1272 // }
   1273 // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
   1274 //                         Combine(Bool(), Bool()));
   1275 //
   1276 template <typename Generator1, typename Generator2>
   1277 internal::CartesianProductHolder2<Generator1, Generator2> Combine(
   1278     const Generator1& g1, const Generator2& g2) {
   1279   return internal::CartesianProductHolder2<Generator1, Generator2>(
   1280       g1, g2);
   1281 }
   1282 
   1283 template <typename Generator1, typename Generator2, typename Generator3>
   1284 internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
   1285     const Generator1& g1, const Generator2& g2, const Generator3& g3) {
   1286   return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
   1287       g1, g2, g3);
   1288 }
   1289 
   1290 template <typename Generator1, typename Generator2, typename Generator3,
   1291     typename Generator4>
   1292 internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
   1293     Generator4> Combine(
   1294     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1295         const Generator4& g4) {
   1296   return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
   1297       Generator4>(
   1298       g1, g2, g3, g4);
   1299 }
   1300 
   1301 template <typename Generator1, typename Generator2, typename Generator3,
   1302     typename Generator4, typename Generator5>
   1303 internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
   1304     Generator4, Generator5> Combine(
   1305     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1306         const Generator4& g4, const Generator5& g5) {
   1307   return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
   1308       Generator4, Generator5>(
   1309       g1, g2, g3, g4, g5);
   1310 }
   1311 
   1312 template <typename Generator1, typename Generator2, typename Generator3,
   1313     typename Generator4, typename Generator5, typename Generator6>
   1314 internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
   1315     Generator4, Generator5, Generator6> Combine(
   1316     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1317         const Generator4& g4, const Generator5& g5, const Generator6& g6) {
   1318   return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
   1319       Generator4, Generator5, Generator6>(
   1320       g1, g2, g3, g4, g5, g6);
   1321 }
   1322 
   1323 template <typename Generator1, typename Generator2, typename Generator3,
   1324     typename Generator4, typename Generator5, typename Generator6,
   1325     typename Generator7>
   1326 internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
   1327     Generator4, Generator5, Generator6, Generator7> Combine(
   1328     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1329         const Generator4& g4, const Generator5& g5, const Generator6& g6,
   1330         const Generator7& g7) {
   1331   return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
   1332       Generator4, Generator5, Generator6, Generator7>(
   1333       g1, g2, g3, g4, g5, g6, g7);
   1334 }
   1335 
   1336 template <typename Generator1, typename Generator2, typename Generator3,
   1337     typename Generator4, typename Generator5, typename Generator6,
   1338     typename Generator7, typename Generator8>
   1339 internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
   1340     Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
   1341     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1342         const Generator4& g4, const Generator5& g5, const Generator6& g6,
   1343         const Generator7& g7, const Generator8& g8) {
   1344   return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
   1345       Generator4, Generator5, Generator6, Generator7, Generator8>(
   1346       g1, g2, g3, g4, g5, g6, g7, g8);
   1347 }
   1348 
   1349 template <typename Generator1, typename Generator2, typename Generator3,
   1350     typename Generator4, typename Generator5, typename Generator6,
   1351     typename Generator7, typename Generator8, typename Generator9>
   1352 internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
   1353     Generator4, Generator5, Generator6, Generator7, Generator8,
   1354     Generator9> Combine(
   1355     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1356         const Generator4& g4, const Generator5& g5, const Generator6& g6,
   1357         const Generator7& g7, const Generator8& g8, const Generator9& g9) {
   1358   return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
   1359       Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
   1360       g1, g2, g3, g4, g5, g6, g7, g8, g9);
   1361 }
   1362 
   1363 template <typename Generator1, typename Generator2, typename Generator3,
   1364     typename Generator4, typename Generator5, typename Generator6,
   1365     typename Generator7, typename Generator8, typename Generator9,
   1366     typename Generator10>
   1367 internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
   1368     Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
   1369     Generator10> Combine(
   1370     const Generator1& g1, const Generator2& g2, const Generator3& g3,
   1371         const Generator4& g4, const Generator5& g5, const Generator6& g6,
   1372         const Generator7& g7, const Generator8& g8, const Generator9& g9,
   1373         const Generator10& g10) {
   1374   return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
   1375       Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
   1376       Generator10>(
   1377       g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
   1378 }
   1379 # endif  // GTEST_HAS_COMBINE
   1380 
   1381 
   1382 
   1383 # define TEST_P(test_case_name, test_name) \
   1384   class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
   1385       : public test_case_name { \
   1386    public: \
   1387     GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
   1388     virtual void TestBody(); \
   1389    private: \
   1390     static int AddToRegistry() { \
   1391       ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
   1392           GetTestCasePatternHolder<test_case_name>(\
   1393               #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
   1394                   #test_case_name, \
   1395                   #test_name, \
   1396                   new ::testing::internal::TestMetaFactory< \
   1397                       GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
   1398       return 0; \
   1399     } \
   1400     static int gtest_registering_dummy_; \
   1401     GTEST_DISALLOW_COPY_AND_ASSIGN_(\
   1402         GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
   1403   }; \
   1404   int GTEST_TEST_CLASS_NAME_(test_case_name, \
   1405                              test_name)::gtest_registering_dummy_ = \
   1406       GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
   1407   void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
   1408 
   1409 # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
   1410   ::testing::internal::ParamGenerator<test_case_name::ParamType> \
   1411       gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
   1412   int gtest_##prefix##test_case_name##_dummy_ = \
   1413       ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
   1414           GetTestCasePatternHolder<test_case_name>(\
   1415               #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
   1416                   #prefix, \
   1417                   &gtest_##prefix##test_case_name##_EvalGenerator_, \
   1418                   __FILE__, __LINE__)
   1419 
   1420 }  // namespace testing
   1421 
   1422 #endif  // GTEST_HAS_PARAM_TEST
   1423 
   1424 #endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
   1425