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