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 #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 ValuesIn(ForwardIterator begin, ForwardIterator end) {
    311   typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
    312       ::value_type ParamType;
    313   return internal::ParamGenerator<ParamType>(
    314       new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
    315 }
    316 
    317 template <typename T, size_t N>
    318 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
    319   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 internal::ValueArray1<T1> Values(T1 v1) {
    349   return internal::ValueArray1<T1>(v1);
    350 }
    351 
    352 template <typename T1, typename T2>
    353 internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
    354   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 internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
    364   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_
   1422