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