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