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