"Fossies" - the Fresh Open Source Software Archive

Member "proj-6.2.1/test/googletest/include/gtest/gtest-param-test.h" (6 May 2019, 76933 Bytes) of package /linux/privat/proj-6.2.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

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