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