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