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