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