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