1 // This file was GENERATED by command:
2 // pump.py gtest-param-test.h.pump
3 // DO NOT EDIT BY HAND!!!
5 // Copyright 2008, Google Inc.
6 // All rights reserved.
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
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
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.
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.
34 // Authors: vladl@google.com (Vlad Losev)
36 // Macros and functions for implementing parameterized tests
37 // in Google C++ Testing Framework (Google Test)
39 // This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
41 #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
42 #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
45 // Value-parameterized tests allow you to test your code with different
46 // parameters without writing multiple copies of the same test.
48 // Here is how you use value-parameterized tests:
52 // To write value-parameterized tests, first you should define a fixture
53 // class. It is usually derived from testing::TestWithParam<T> (see below for
54 // another inheritance scheme that's sometimes useful in more complicated
55 // class hierarchies), where the type of your parameter values.
56 // TestWithParam<T> is itself derived from testing::Test. T can be any
57 // copyable type. If it's a raw pointer, you are responsible for managing the
58 // lifespan of the pointed values.
60 class FooTest : public ::testing::TestWithParam<const char*> {
61 // You can implement all the usual class fixture members here.
64 // Then, use the TEST_P macro to define as many parameterized tests
65 // for this fixture as you want. The _P suffix is for "parameterized"
66 // or "pattern", whichever you prefer to think.
68 TEST_P(FooTest, DoesBlah) {
69 // Inside a test, access the test parameter with the GetParam() method
70 // of the TestWithParam<T> class:
71 EXPECT_TRUE(foo.Blah(GetParam()));
75 TEST_P(FooTest, HasBlahBlah) {
79 // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
80 // case with any set of parameters you want. Google Test defines a number
81 // of functions for generating test parameters. They return what we call
82 // (surprise!) parameter generators. Here is a summary of them, which
83 // are all in the testing namespace:
86 // Range(begin, end [, step]) - Yields values {begin, begin+step,
87 // begin+step+step, ...}. The values do not
88 // include end. step defaults to 1.
89 // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
90 // ValuesIn(container) - Yields values from a C-style array, an STL
91 // ValuesIn(begin,end) container, or an iterator range [begin, end).
92 // Bool() - Yields sequence {false, true}.
93 // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
94 // for the math savvy) of the values generated
95 // by the N generators.
97 // For more details, see comments at the definitions of these functions below
100 // The following statement will instantiate tests from the FooTest test case
101 // each with parameter values "meeny", "miny", and "moe".
103 INSTANTIATE_TEST_CASE_P(InstantiationName,
105 Values("meeny", "miny", "moe"));
107 // To distinguish different instances of the pattern, (yes, you
108 // can instantiate it more then once) the first argument to the
109 // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
110 // actual test case name. Remember to pick unique prefixes for different
111 // instantiations. The tests from the instantiation above will have
114 // * InstantiationName/FooTest.DoesBlah/0 for "meeny"
115 // * InstantiationName/FooTest.DoesBlah/1 for "miny"
116 // * InstantiationName/FooTest.DoesBlah/2 for "moe"
117 // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
118 // * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
119 // * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
121 // You can use these names in --gtest_filter.
123 // This statement will instantiate all tests from FooTest again, each
124 // with parameter values "cat" and "dog":
126 const char* pets[] = {"cat", "dog"};
127 INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
129 // The tests from the instantiation above will have these names:
131 // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
132 // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
133 // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
134 // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
136 // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
137 // in the given test case, whether their definitions come before or
138 // AFTER the INSTANTIATE_TEST_CASE_P statement.
140 // Please also note that generator expressions (including parameters to the
141 // generators) are evaluated in InitGoogleTest(), after main() has started.
142 // This allows the user on one hand, to adjust generator parameters in order
143 // to dynamically determine a set of tests to run and on the other hand,
144 // give the user a chance to inspect the generated tests with Google Test
145 // reflection API before RUN_ALL_TESTS() is executed.
147 // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
148 // for more examples.
150 // In the future, we plan to publish the API for defining new parameter
151 // generators. But for now this interface remains part of the internal
152 // implementation and is subject to change.
155 // A parameterized test fixture must be derived from testing::Test and from
156 // testing::WithParamInterface<T>, where T is the type of the parameter
157 // values. Inheriting from TestWithParam<T> satisfies that requirement because
158 // TestWithParam<T> inherits from both Test and WithParamInterface. In more
159 // complicated hierarchies, however, it is occasionally useful to inherit
160 // separately from Test and WithParamInterface. For example:
162 class BaseTest : public ::testing::Test {
163 // You can inherit all the usual members for a non-parameterized test
167 class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
168 // The usual test fixture members go here too.
171 TEST_F(BaseTest, HasFoo) {
172 // This is an ordinary non-parameterized test.
175 TEST_P(DerivedTest, DoesBlah) {
176 // GetParam works just the same here as if you inherit from TestWithParam.
177 EXPECT_TRUE(foo.Blah(GetParam()));
182 #include "gtest/internal/gtest-port.h"
184 #if !GTEST_OS_SYMBIAN
188 #include "gtest/internal/gtest-internal.h"
189 #include "gtest/internal/gtest-param-util.h"
190 #include "gtest/internal/gtest-param-util-generated.h"
194 // Functions producing parameter generators.
196 // Google Test uses these generators to produce parameters for value-
197 // parameterized tests. When a parameterized test case is instantiated
198 // with a particular generator, Google Test creates and runs tests
199 // for each element in the sequence produced by the generator.
201 // In the following sample, tests from test case FooTest are instantiated
202 // each three times with parameter values 3, 5, and 8:
204 // class FooTest : public TestWithParam<int> { ... };
206 // TEST_P(FooTest, TestThis) {
208 // TEST_P(FooTest, TestThat) {
210 // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
213 // Range() returns generators providing sequences of values in a range.
217 // - returns a generator producing a sequence of values {start, start+1,
219 // Range(start, end, step)
220 // - returns a generator producing a sequence of values {start, start+step,
221 // start+step+step, ..., }.
223 // * The generated sequences never include end. For example, Range(1, 5)
224 // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
225 // returns a generator producing {1, 3, 5, 7}.
226 // * start and end must have the same type. That type may be any integral or
227 // floating-point type or a user defined type satisfying these conditions:
228 // * It must be assignable (have operator=() defined).
229 // * It must have operator+() (operator+(int-compatible type) for
230 // two-operand version).
231 // * It must have operator<() defined.
232 // Elements in the resulting sequences will also have that type.
233 // * Condition start < end must be satisfied in order for resulting sequences
234 // to contain any elements.
236 template <typename T, typename IncrementT>
237 internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
238 return internal::ParamGenerator<T>(
239 new internal::RangeGenerator<T, IncrementT>(start, end, step));
242 template <typename T>
243 internal::ParamGenerator<T> Range(T start, T end) {
244 return Range(start, end, 1);
247 // ValuesIn() function allows generation of tests with parameters coming from
251 // ValuesIn(const T (&array)[N])
252 // - returns a generator producing sequences with elements from
254 // ValuesIn(const Container& container)
255 // - returns a generator producing sequences with elements from
256 // an STL-style container.
257 // ValuesIn(Iterator begin, Iterator end)
258 // - returns a generator producing sequences with elements from
259 // a range [begin, end) defined by a pair of STL-style iterators. These
260 // iterators can also be plain C pointers.
262 // Please note that ValuesIn copies the values from the containers
263 // passed in and keeps them to generate tests in RUN_ALL_TESTS().
267 // This instantiates tests from test case StringTest
268 // each with C-string values of "foo", "bar", and "baz":
270 // const char* strings[] = {"foo", "bar", "baz"};
271 // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
273 // This instantiates tests from test case StlStringTest
274 // each with STL strings with values "a" and "b":
276 // ::std::vector< ::std::string> GetParameterStrings() {
277 // ::std::vector< ::std::string> v;
283 // INSTANTIATE_TEST_CASE_P(CharSequence,
285 // ValuesIn(GetParameterStrings()));
288 // This will also instantiate tests from CharTest
289 // each with parameter values 'a' and 'b':
291 // ::std::list<char> GetParameterChars() {
292 // ::std::list<char> list;
293 // list.push_back('a');
294 // list.push_back('b');
297 // ::std::list<char> l = GetParameterChars();
298 // INSTANTIATE_TEST_CASE_P(CharSequence2,
300 // ValuesIn(l.begin(), l.end()));
302 template <typename ForwardIterator>
303 internal::ParamGenerator<
304 typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
305 ValuesIn(ForwardIterator begin, ForwardIterator end) {
306 typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
307 ::value_type ParamType;
308 return internal::ParamGenerator<ParamType>(
309 new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
312 template <typename T, size_t N>
313 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
314 return ValuesIn(array, array + N);
317 template <class Container>
318 internal::ParamGenerator<typename Container::value_type> ValuesIn(
319 const Container& container) {
320 return ValuesIn(container.begin(), container.end());
323 // Values() allows generating tests from explicitly specified list of
327 // Values(T v1, T v2, ..., T vN)
328 // - returns a generator producing sequences with elements v1, v2, ..., vN.
330 // For example, this instantiates tests from test case BarTest each
331 // with values "one", "two", and "three":
333 // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
335 // This instantiates tests from test case BazTest each with values 1, 2, 3.5.
336 // The exact type of values will depend on the type of parameter in BazTest.
338 // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
340 // Currently, Values() supports from 1 to 50 parameters.
342 template <typename T1>
343 internal::ValueArray1<T1> Values(T1 v1) {
344 return internal::ValueArray1<T1>(v1);
347 template <typename T1, typename T2>
348 internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
349 return internal::ValueArray2<T1, T2>(v1, v2);
352 template <typename T1, typename T2, typename T3>
353 internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
354 return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
357 template <typename T1, typename T2, typename T3, typename T4>
358 internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
359 return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
362 template <typename T1, typename T2, typename T3, typename T4, typename T5>
363 internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
365 return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
368 template <typename T1, typename T2, typename T3, typename T4, typename T5,
370 internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
371 T4 v4, T5 v5, T6 v6) {
372 return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
375 template <typename T1, typename T2, typename T3, typename T4, typename T5,
376 typename T6, typename T7>
377 internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
378 T4 v4, T5 v5, T6 v6, T7 v7) {
379 return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
383 template <typename T1, typename T2, typename T3, typename T4, typename T5,
384 typename T6, typename T7, typename T8>
385 internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
386 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
387 return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
391 template <typename T1, typename T2, typename T3, typename T4, typename T5,
392 typename T6, typename T7, typename T8, typename T9>
393 internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
394 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
395 return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
396 v4, v5, v6, v7, v8, v9);
399 template <typename T1, typename T2, typename T3, typename T4, typename T5,
400 typename T6, typename T7, typename T8, typename T9, typename T10>
401 internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
402 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
403 return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
404 v2, v3, v4, v5, v6, v7, v8, v9, v10);
407 template <typename T1, typename T2, typename T3, typename T4, typename T5,
408 typename T6, typename T7, typename T8, typename T9, typename T10,
410 internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
411 T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
413 return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
414 T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
417 template <typename T1, typename T2, typename T3, typename T4, typename T5,
418 typename T6, typename T7, typename T8, typename T9, typename T10,
419 typename T11, typename T12>
420 internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
421 T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
422 T10 v10, T11 v11, T12 v12) {
423 return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
424 T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
427 template <typename T1, typename T2, typename T3, typename T4, typename T5,
428 typename T6, typename T7, typename T8, typename T9, typename T10,
429 typename T11, typename T12, typename T13>
430 internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
431 T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
432 T10 v10, T11 v11, T12 v12, T13 v13) {
433 return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
434 T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
437 template <typename T1, typename T2, typename T3, typename T4, typename T5,
438 typename T6, typename T7, typename T8, typename T9, typename T10,
439 typename T11, typename T12, typename T13, typename T14>
440 internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
441 T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
442 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
443 return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
444 T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
448 template <typename T1, typename T2, typename T3, typename T4, typename T5,
449 typename T6, typename T7, typename T8, typename T9, typename T10,
450 typename T11, typename T12, typename T13, typename T14, typename T15>
451 internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
452 T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
453 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
454 return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
455 T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
459 template <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,
463 internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
464 T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
465 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
467 return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
468 T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
469 v12, v13, v14, v15, v16);
472 template <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>
476 internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
477 T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
478 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
480 return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
481 T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
482 v11, v12, v13, v14, v15, v16, v17);
485 template <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>
489 internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
490 T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
491 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
492 T16 v16, T17 v17, T18 v18) {
493 return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
494 T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
495 v10, v11, v12, v13, v14, v15, v16, v17, v18);
498 template <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>
502 internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
503 T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
504 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
505 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
506 return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
507 T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
508 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
511 template <typename T1, typename T2, typename T3, typename T4, typename T5,
512 typename T6, typename T7, typename T8, typename T9, typename T10,
513 typename T11, typename T12, typename T13, typename T14, typename T15,
514 typename T16, typename T17, typename T18, typename T19, typename T20>
515 internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
516 T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
517 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
518 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
519 return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
520 T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
521 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
524 template <typename T1, typename T2, typename T3, typename T4, typename T5,
525 typename T6, typename T7, typename T8, typename T9, typename T10,
526 typename T11, typename T12, typename T13, typename T14, typename T15,
527 typename T16, typename T17, typename T18, typename T19, typename T20,
529 internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
530 T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
531 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
532 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
533 return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
534 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
535 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
538 template <typename T1, typename T2, typename T3, typename T4, typename T5,
539 typename T6, typename T7, typename T8, typename T9, typename T10,
540 typename T11, typename T12, typename T13, typename T14, typename T15,
541 typename T16, typename T17, typename T18, typename T19, typename T20,
542 typename T21, typename T22>
543 internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
544 T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
545 T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
546 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
548 return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
549 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
550 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
554 template <typename T1, typename T2, typename T3, typename T4, typename T5,
555 typename T6, typename T7, typename T8, typename T9, typename T10,
556 typename T11, typename T12, typename T13, typename T14, typename T15,
557 typename T16, typename T17, typename T18, typename T19, typename T20,
558 typename T21, typename T22, typename T23>
559 internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
560 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
561 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
562 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
563 T21 v21, T22 v22, T23 v23) {
564 return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
565 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
566 v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
570 template <typename T1, typename T2, typename T3, typename T4, typename T5,
571 typename T6, typename T7, typename T8, typename T9, typename T10,
572 typename T11, typename T12, typename T13, typename T14, typename T15,
573 typename T16, typename T17, typename T18, typename T19, typename T20,
574 typename T21, typename T22, typename T23, typename T24>
575 internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
576 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
577 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
578 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
579 T21 v21, T22 v22, T23 v23, T24 v24) {
580 return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
581 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
582 v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
583 v19, v20, v21, v22, v23, v24);
586 template <typename T1, typename T2, typename T3, typename T4, typename T5,
587 typename T6, typename T7, typename T8, typename T9, typename T10,
588 typename T11, typename T12, typename T13, typename T14, typename T15,
589 typename T16, typename T17, typename T18, typename T19, typename T20,
590 typename T21, typename T22, typename T23, typename T24, typename T25>
591 internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
592 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
593 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
594 T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
595 T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
596 return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
597 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
598 v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
599 v18, v19, v20, v21, v22, v23, v24, v25);
602 template <typename T1, typename T2, typename T3, typename T4, typename T5,
603 typename T6, typename T7, typename T8, typename T9, typename T10,
604 typename T11, typename T12, typename T13, typename T14, typename T15,
605 typename T16, typename T17, typename T18, typename T19, typename T20,
606 typename T21, typename T22, typename T23, typename T24, typename T25,
608 internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
609 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
610 T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
611 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
612 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
614 return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
615 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
616 T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
617 v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
620 template <typename T1, typename T2, typename T3, typename T4, typename T5,
621 typename T6, typename T7, typename T8, typename T9, typename T10,
622 typename T11, typename T12, typename T13, typename T14, typename T15,
623 typename T16, typename T17, typename T18, typename T19, typename T20,
624 typename T21, typename T22, typename T23, typename T24, typename T25,
625 typename T26, typename T27>
626 internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
627 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
628 T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
629 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
630 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
632 return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
633 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
634 T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
635 v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
638 template <typename T1, typename T2, typename T3, typename T4, typename T5,
639 typename T6, typename T7, typename T8, typename T9, typename T10,
640 typename T11, typename T12, typename T13, typename T14, typename T15,
641 typename T16, typename T17, typename T18, typename T19, typename T20,
642 typename T21, typename T22, typename T23, typename T24, typename T25,
643 typename T26, typename T27, typename T28>
644 internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
645 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
646 T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
647 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
648 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
649 T26 v26, T27 v27, T28 v28) {
650 return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
651 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
652 T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
653 v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
657 template <typename T1, typename T2, typename T3, typename T4, typename T5,
658 typename T6, typename T7, typename T8, typename T9, typename T10,
659 typename T11, typename T12, typename T13, typename T14, typename T15,
660 typename T16, typename T17, typename T18, typename T19, typename T20,
661 typename T21, typename T22, typename T23, typename T24, typename T25,
662 typename T26, typename T27, typename T28, typename T29>
663 internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
664 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
665 T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
666 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
667 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
668 T26 v26, T27 v27, T28 v28, T29 v29) {
669 return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
670 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
671 T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
672 v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
676 template <typename T1, typename T2, typename T3, typename T4, typename T5,
677 typename T6, typename T7, typename T8, typename T9, typename T10,
678 typename T11, typename T12, typename T13, typename T14, typename T15,
679 typename T16, typename T17, typename T18, typename T19, typename T20,
680 typename T21, typename T22, typename T23, typename T24, typename T25,
681 typename T26, typename T27, typename T28, typename T29, typename T30>
682 internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
683 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
684 T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
685 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
686 T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
687 T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
688 return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
689 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
690 T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
691 v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
692 v26, v27, v28, v29, v30);
695 template <typename T1, typename T2, typename T3, typename T4, typename T5,
696 typename T6, typename T7, typename T8, typename T9, typename T10,
697 typename T11, typename T12, typename T13, typename T14, typename T15,
698 typename T16, typename T17, typename T18, typename T19, typename T20,
699 typename T21, typename T22, typename T23, typename T24, typename T25,
700 typename T26, typename T27, typename T28, typename T29, typename T30,
702 internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
703 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
704 T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
705 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
706 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
707 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
708 return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
709 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
710 T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
711 v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
712 v25, v26, v27, v28, v29, v30, v31);
715 template <typename T1, typename T2, typename T3, typename T4, typename T5,
716 typename T6, typename T7, typename T8, typename T9, typename T10,
717 typename T11, typename T12, typename T13, typename T14, typename T15,
718 typename T16, typename T17, typename T18, typename T19, typename T20,
719 typename T21, typename T22, typename T23, typename T24, typename T25,
720 typename T26, typename T27, typename T28, typename T29, typename T30,
721 typename T31, typename T32>
722 internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
723 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
724 T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
725 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
726 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
727 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
729 return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
730 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
731 T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
732 v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
733 v24, v25, v26, v27, v28, v29, v30, v31, v32);
736 template <typename T1, typename T2, typename T3, typename T4, typename T5,
737 typename T6, typename T7, typename T8, typename T9, typename T10,
738 typename T11, typename T12, typename T13, typename T14, typename T15,
739 typename T16, typename T17, typename T18, typename T19, typename T20,
740 typename T21, typename T22, typename T23, typename T24, typename T25,
741 typename T26, typename T27, typename T28, typename T29, typename T30,
742 typename T31, typename T32, typename T33>
743 internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
744 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
745 T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
746 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
747 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
748 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
750 return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
751 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
752 T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
753 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
754 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
757 template <typename T1, typename T2, typename T3, typename T4, typename T5,
758 typename T6, typename T7, typename T8, typename T9, typename T10,
759 typename T11, typename T12, typename T13, typename T14, typename T15,
760 typename T16, typename T17, typename T18, typename T19, typename T20,
761 typename T21, typename T22, typename T23, typename T24, typename T25,
762 typename T26, typename T27, typename T28, typename T29, typename T30,
763 typename T31, typename T32, typename T33, typename T34>
764 internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
765 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
766 T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
767 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
768 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
769 T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
770 T31 v31, T32 v32, T33 v33, T34 v34) {
771 return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
772 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
773 T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
774 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
775 v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
778 template <typename T1, typename T2, typename T3, typename T4, typename T5,
779 typename T6, typename T7, typename T8, typename T9, typename T10,
780 typename T11, typename T12, typename T13, typename T14, typename T15,
781 typename T16, typename T17, typename T18, typename T19, typename T20,
782 typename T21, typename T22, typename T23, typename T24, typename T25,
783 typename T26, typename T27, typename T28, typename T29, typename T30,
784 typename T31, typename T32, typename T33, typename T34, typename T35>
785 internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
786 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
787 T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
788 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
789 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
790 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
791 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
792 return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
793 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
794 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
795 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
796 v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
799 template <typename T1, typename T2, typename T3, typename T4, typename T5,
800 typename T6, typename T7, typename T8, typename T9, typename T10,
801 typename T11, typename T12, typename T13, typename T14, typename T15,
802 typename T16, typename T17, typename T18, typename T19, typename T20,
803 typename T21, typename T22, typename T23, typename T24, typename T25,
804 typename T26, typename T27, typename T28, typename T29, typename T30,
805 typename T31, typename T32, typename T33, typename T34, typename T35,
807 internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
808 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
809 T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
810 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
811 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
812 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
813 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
814 return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
815 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
816 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
817 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
818 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
822 template <typename T1, typename T2, typename T3, typename T4, typename T5,
823 typename T6, typename T7, typename T8, typename T9, typename T10,
824 typename T11, typename T12, typename T13, typename T14, typename T15,
825 typename T16, typename T17, typename T18, typename T19, typename T20,
826 typename T21, typename T22, typename T23, typename T24, typename T25,
827 typename T26, typename T27, typename T28, typename T29, typename T30,
828 typename T31, typename T32, typename T33, typename T34, typename T35,
829 typename T36, typename T37>
830 internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
831 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
832 T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
833 T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
834 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
835 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
836 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
838 return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
839 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
840 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
841 v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
842 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
846 template <typename T1, typename T2, typename T3, typename T4, typename T5,
847 typename T6, typename T7, typename T8, typename T9, typename T10,
848 typename T11, typename T12, typename T13, typename T14, typename T15,
849 typename T16, typename T17, typename T18, typename T19, typename T20,
850 typename T21, typename T22, typename T23, typename T24, typename T25,
851 typename T26, typename T27, typename T28, typename T29, typename T30,
852 typename T31, typename T32, typename T33, typename T34, typename T35,
853 typename T36, typename T37, typename T38>
854 internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
855 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
856 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
857 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
858 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
859 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
860 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
862 return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
863 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
864 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
865 v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
866 v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
867 v33, v34, v35, v36, v37, v38);
870 template <typename T1, typename T2, typename T3, typename T4, typename T5,
871 typename T6, typename T7, typename T8, typename T9, typename T10,
872 typename T11, typename T12, typename T13, typename T14, typename T15,
873 typename T16, typename T17, typename T18, typename T19, typename T20,
874 typename T21, typename T22, typename T23, typename T24, typename T25,
875 typename T26, typename T27, typename T28, typename T29, typename T30,
876 typename T31, typename T32, typename T33, typename T34, typename T35,
877 typename T36, typename T37, typename T38, typename T39>
878 internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
879 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
880 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
881 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
882 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
883 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
884 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
885 T37 v37, T38 v38, T39 v39) {
886 return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
887 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
888 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
889 v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
890 v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
891 v32, v33, v34, v35, v36, v37, v38, v39);
894 template <typename T1, typename T2, typename T3, typename T4, typename T5,
895 typename T6, typename T7, typename T8, typename T9, typename T10,
896 typename T11, typename T12, typename T13, typename T14, typename T15,
897 typename T16, typename T17, typename T18, typename T19, typename T20,
898 typename T21, typename T22, typename T23, typename T24, typename T25,
899 typename T26, typename T27, typename T28, typename T29, typename T30,
900 typename T31, typename T32, typename T33, typename T34, typename T35,
901 typename T36, typename T37, typename T38, typename T39, typename T40>
902 internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
903 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
904 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
905 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
906 T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
907 T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
908 T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
909 T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
910 return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
911 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
912 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
913 T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
914 v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
915 v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
918 template <typename T1, typename T2, typename T3, typename T4, typename T5,
919 typename T6, typename T7, typename T8, typename T9, typename T10,
920 typename T11, typename T12, typename T13, typename T14, typename T15,
921 typename T16, typename T17, typename T18, typename T19, typename T20,
922 typename T21, typename T22, typename T23, typename T24, typename T25,
923 typename T26, typename T27, typename T28, typename T29, typename T30,
924 typename T31, typename T32, typename T33, typename T34, typename T35,
925 typename T36, typename T37, typename T38, typename T39, typename T40,
927 internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
928 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
929 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
930 T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
931 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
932 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
933 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
934 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
935 return internal::ValueArray41<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>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
939 v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
940 v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
943 template <typename T1, typename T2, typename T3, typename T4, typename T5,
944 typename T6, typename T7, typename T8, typename T9, typename T10,
945 typename T11, typename T12, typename T13, typename T14, typename T15,
946 typename T16, typename T17, typename T18, typename T19, typename T20,
947 typename T21, typename T22, typename T23, typename T24, typename T25,
948 typename T26, typename T27, typename T28, typename T29, typename T30,
949 typename T31, typename T32, typename T33, typename T34, typename T35,
950 typename T36, typename T37, typename T38, typename T39, typename T40,
951 typename T41, typename T42>
952 internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
953 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
954 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
955 T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
956 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
957 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
958 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
959 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
961 return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
962 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
963 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
964 T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
965 v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
966 v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
970 template <typename T1, typename T2, typename T3, typename T4, typename T5,
971 typename T6, typename T7, typename T8, typename T9, typename T10,
972 typename T11, typename T12, typename T13, typename T14, typename T15,
973 typename T16, typename T17, typename T18, typename T19, typename T20,
974 typename T21, typename T22, typename T23, typename T24, typename T25,
975 typename T26, typename T27, typename T28, typename T29, typename T30,
976 typename T31, typename T32, typename T33, typename T34, typename T35,
977 typename T36, typename T37, typename T38, typename T39, typename T40,
978 typename T41, typename T42, typename T43>
979 internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
980 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
981 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
982 T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
983 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
984 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
985 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
986 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
988 return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
989 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
990 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
991 T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
992 v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
993 v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
997 template <typename T1, typename T2, typename T3, typename T4, typename T5,
998 typename T6, typename T7, typename T8, typename T9, typename T10,
999 typename T11, typename T12, typename T13, typename T14, typename T15,
1000 typename T16, typename T17, typename T18, typename T19, typename T20,
1001 typename T21, typename T22, typename T23, typename T24, typename T25,
1002 typename T26, typename T27, typename T28, typename T29, typename T30,
1003 typename T31, typename T32, typename T33, typename T34, typename T35,
1004 typename T36, typename T37, typename T38, typename T39, typename T40,
1005 typename T41, typename T42, typename T43, typename T44>
1006 internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1007 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1008 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1009 T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1010 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1011 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1012 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1013 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
1014 T42 v42, T43 v43, T44 v44) {
1015 return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1016 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1017 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1018 T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
1019 v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
1020 v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
1021 v40, v41, v42, v43, v44);
1024 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1025 typename T6, typename T7, typename T8, typename T9, typename T10,
1026 typename T11, typename T12, typename T13, typename T14, typename T15,
1027 typename T16, typename T17, typename T18, typename T19, typename T20,
1028 typename T21, typename T22, typename T23, typename T24, typename T25,
1029 typename T26, typename T27, typename T28, typename T29, typename T30,
1030 typename T31, typename T32, typename T33, typename T34, typename T35,
1031 typename T36, typename T37, typename T38, typename T39, typename T40,
1032 typename T41, typename T42, typename T43, typename T44, typename T45>
1033 internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1034 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1035 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1036 T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
1037 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
1038 T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
1039 T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1040 T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
1041 T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
1042 return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1043 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1044 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1045 T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
1046 v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
1047 v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
1048 v39, v40, v41, v42, v43, v44, v45);
1051 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1052 typename T6, typename T7, typename T8, typename T9, typename T10,
1053 typename T11, typename T12, typename T13, typename T14, typename T15,
1054 typename T16, typename T17, typename T18, typename T19, typename T20,
1055 typename T21, typename T22, typename T23, typename T24, typename T25,
1056 typename T26, typename T27, typename T28, typename T29, typename T30,
1057 typename T31, typename T32, typename T33, typename T34, typename T35,
1058 typename T36, typename T37, typename T38, typename T39, typename T40,
1059 typename T41, typename T42, typename T43, typename T44, typename T45,
1061 internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1062 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1063 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1064 T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
1065 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1066 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1067 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1068 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1069 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
1070 return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1071 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1072 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1073 T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
1074 v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
1075 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
1076 v38, v39, v40, v41, v42, v43, v44, v45, v46);
1079 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1080 typename T6, typename T7, typename T8, typename T9, typename T10,
1081 typename T11, typename T12, typename T13, typename T14, typename T15,
1082 typename T16, typename T17, typename T18, typename T19, typename T20,
1083 typename T21, typename T22, typename T23, typename T24, typename T25,
1084 typename T26, typename T27, typename T28, typename T29, typename T30,
1085 typename T31, typename T32, typename T33, typename T34, typename T35,
1086 typename T36, typename T37, typename T38, typename T39, typename T40,
1087 typename T41, typename T42, typename T43, typename T44, typename T45,
1088 typename T46, typename T47>
1089 internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1090 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1091 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1092 T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
1093 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1094 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1095 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1096 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1097 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
1098 return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1099 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1100 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1101 T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
1102 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
1103 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
1104 v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
1107 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1108 typename T6, typename T7, typename T8, typename T9, typename T10,
1109 typename T11, typename T12, typename T13, typename T14, typename T15,
1110 typename T16, typename T17, typename T18, typename T19, typename T20,
1111 typename T21, typename T22, typename T23, typename T24, typename T25,
1112 typename T26, typename T27, typename T28, typename T29, typename T30,
1113 typename T31, typename T32, typename T33, typename T34, typename T35,
1114 typename T36, typename T37, typename T38, typename T39, typename T40,
1115 typename T41, typename T42, typename T43, typename T44, typename T45,
1116 typename T46, typename T47, typename T48>
1117 internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1118 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1119 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1120 T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
1121 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
1122 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
1123 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
1124 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
1125 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
1127 return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1128 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1129 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1130 T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
1131 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
1132 v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
1133 v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
1136 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1137 typename T6, typename T7, typename T8, typename T9, typename T10,
1138 typename T11, typename T12, typename T13, typename T14, typename T15,
1139 typename T16, typename T17, typename T18, typename T19, typename T20,
1140 typename T21, typename T22, typename T23, typename T24, typename T25,
1141 typename T26, typename T27, typename T28, typename T29, typename T30,
1142 typename T31, typename T32, typename T33, typename T34, typename T35,
1143 typename T36, typename T37, typename T38, typename T39, typename T40,
1144 typename T41, typename T42, typename T43, typename T44, typename T45,
1145 typename T46, typename T47, typename T48, typename T49>
1146 internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1147 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1148 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1149 T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
1150 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
1151 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
1152 T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
1153 T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
1154 T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
1155 T47 v47, T48 v48, T49 v49) {
1156 return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1157 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1158 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1159 T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
1160 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
1161 v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
1162 v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
1165 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1166 typename T6, typename T7, typename T8, typename T9, typename T10,
1167 typename T11, typename T12, typename T13, typename T14, typename T15,
1168 typename T16, typename T17, typename T18, typename T19, typename T20,
1169 typename T21, typename T22, typename T23, typename T24, typename T25,
1170 typename T26, typename T27, typename T28, typename T29, typename T30,
1171 typename T31, typename T32, typename T33, typename T34, typename T35,
1172 typename T36, typename T37, typename T38, typename T39, typename T40,
1173 typename T41, typename T42, typename T43, typename T44, typename T45,
1174 typename T46, typename T47, typename T48, typename T49, typename T50>
1175 internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1176 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1177 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1178 T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
1179 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
1180 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
1181 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
1182 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
1183 T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
1184 T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
1185 return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
1186 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1187 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1188 T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
1189 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
1190 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
1191 v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
1195 // Bool() allows generating tests with parameters in a set of (false, true).
1199 // - returns a generator producing sequences with elements {false, true}.
1201 // It is useful when testing code that depends on Boolean flags. Combinations
1202 // of multiple flags can be tested when several Bool()'s are combined using
1203 // Combine() function.
1205 // In the following example all tests in the test case FlagDependentTest
1206 // will be instantiated twice with parameters false and true.
1208 // class FlagDependentTest : public testing::TestWithParam<bool> {
1209 // virtual void SetUp() {
1210 // external_flag = GetParam();
1213 // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
1215 inline internal::ParamGenerator<bool> Bool() {
1216 return Values(false, true);
1219 # if GTEST_HAS_COMBINE
1220 // Combine() allows the user to combine two or more sequences to produce
1221 // values of a Cartesian product of those sequences' elements.
1224 // Combine(gen1, gen2, ..., genN)
1225 // - returns a generator producing sequences with elements coming from
1226 // the Cartesian product of elements from the sequences generated by
1227 // gen1, gen2, ..., genN. The sequence elements will have a type of
1228 // tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
1229 // of elements from sequences produces by gen1, gen2, ..., genN.
1231 // Combine can have up to 10 arguments. This number is currently limited
1232 // by the maximum number of elements in the tuple implementation used by Google
1237 // This will instantiate tests in test case AnimalTest each one with
1238 // the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
1239 // tuple("dog", BLACK), and tuple("dog", WHITE):
1241 // enum Color { BLACK, GRAY, WHITE };
1243 // : public testing::TestWithParam<tuple<const char*, Color> > {...};
1245 // TEST_P(AnimalTest, AnimalLooksNice) {...}
1247 // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
1248 // Combine(Values("cat", "dog"),
1249 // Values(BLACK, WHITE)));
1251 // This will instantiate tests in FlagDependentTest with all variations of two
1254 // class FlagDependentTest
1255 // : public testing::TestWithParam<tuple<bool, bool> > {
1256 // virtual void SetUp() {
1257 // // Assigns external_flag_1 and external_flag_2 values from the tuple.
1258 // tie(external_flag_1, external_flag_2) = GetParam();
1262 // TEST_P(FlagDependentTest, TestFeature1) {
1263 // // Test your code using external_flag_1 and external_flag_2 here.
1265 // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
1266 // Combine(Bool(), Bool()));
1268 template <typename Generator1, typename Generator2>
1269 internal::CartesianProductHolder2<Generator1, Generator2> Combine(
1270 const Generator1& g1, const Generator2& g2) {
1271 return internal::CartesianProductHolder2<Generator1, Generator2>(
1275 template <typename Generator1, typename Generator2, typename Generator3>
1276 internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
1277 const Generator1& g1, const Generator2& g2, const Generator3& g3) {
1278 return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
1282 template <typename Generator1, typename Generator2, typename Generator3,
1283 typename Generator4>
1284 internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
1285 Generator4> Combine(
1286 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1287 const Generator4& g4) {
1288 return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
1293 template <typename Generator1, typename Generator2, typename Generator3,
1294 typename Generator4, typename Generator5>
1295 internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
1296 Generator4, Generator5> Combine(
1297 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1298 const Generator4& g4, const Generator5& g5) {
1299 return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
1300 Generator4, Generator5>(
1301 g1, g2, g3, g4, g5);
1304 template <typename Generator1, typename Generator2, typename Generator3,
1305 typename Generator4, typename Generator5, typename Generator6>
1306 internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
1307 Generator4, Generator5, Generator6> Combine(
1308 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1309 const Generator4& g4, const Generator5& g5, const Generator6& g6) {
1310 return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
1311 Generator4, Generator5, Generator6>(
1312 g1, g2, g3, g4, g5, g6);
1315 template <typename Generator1, typename Generator2, typename Generator3,
1316 typename Generator4, typename Generator5, typename Generator6,
1317 typename Generator7>
1318 internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
1319 Generator4, Generator5, Generator6, Generator7> Combine(
1320 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1321 const Generator4& g4, const Generator5& g5, const Generator6& g6,
1322 const Generator7& g7) {
1323 return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
1324 Generator4, Generator5, Generator6, Generator7>(
1325 g1, g2, g3, g4, g5, g6, g7);
1328 template <typename Generator1, typename Generator2, typename Generator3,
1329 typename Generator4, typename Generator5, typename Generator6,
1330 typename Generator7, typename Generator8>
1331 internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
1332 Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
1333 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1334 const Generator4& g4, const Generator5& g5, const Generator6& g6,
1335 const Generator7& g7, const Generator8& g8) {
1336 return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
1337 Generator4, Generator5, Generator6, Generator7, Generator8>(
1338 g1, g2, g3, g4, g5, g6, g7, g8);
1341 template <typename Generator1, typename Generator2, typename Generator3,
1342 typename Generator4, typename Generator5, typename Generator6,
1343 typename Generator7, typename Generator8, typename Generator9>
1344 internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
1345 Generator4, Generator5, Generator6, Generator7, Generator8,
1346 Generator9> Combine(
1347 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1348 const Generator4& g4, const Generator5& g5, const Generator6& g6,
1349 const Generator7& g7, const Generator8& g8, const Generator9& g9) {
1350 return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
1351 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
1352 g1, g2, g3, g4, g5, g6, g7, g8, g9);
1355 template <typename Generator1, typename Generator2, typename Generator3,
1356 typename Generator4, typename Generator5, typename Generator6,
1357 typename Generator7, typename Generator8, typename Generator9,
1358 typename Generator10>
1359 internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
1360 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
1361 Generator10> Combine(
1362 const Generator1& g1, const Generator2& g2, const Generator3& g3,
1363 const Generator4& g4, const Generator5& g5, const Generator6& g6,
1364 const Generator7& g7, const Generator8& g8, const Generator9& g9,
1365 const Generator10& g10) {
1366 return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
1367 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
1369 g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
1371 # endif // GTEST_HAS_COMBINE
1375 # define TEST_P(test_case_name, test_name) \
1376 class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
1377 : public test_case_name { \
1379 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
1380 virtual void TestBody(); \
1382 static int AddToRegistry() { \
1383 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1384 GetTestCasePatternHolder<test_case_name>(\
1386 ::testing::internal::CodeLocation(\
1387 __FILE__, __LINE__))->AddTestPattern(\
1390 new ::testing::internal::TestMetaFactory< \
1391 GTEST_TEST_CLASS_NAME_(\
1392 test_case_name, test_name)>()); \
1395 static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
1396 GTEST_DISALLOW_COPY_AND_ASSIGN_(\
1397 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
1399 int GTEST_TEST_CLASS_NAME_(test_case_name, \
1400 test_name)::gtest_registering_dummy_ = \
1401 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
1402 void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
1404 // The optional last argument to INSTANTIATE_TEST_CASE_P allows the user
1405 // to specify a function or functor that generates custom test name suffixes
1406 // based on the test parameters. The function should accept one argument of
1407 // type testing::TestParamInfo<class ParamType>, and return std::string.
1409 // testing::PrintToStringParamName is a builtin test suffix generator that
1410 // returns the value of testing::PrintToString(GetParam()).
1412 // Note: test names must be non-empty, unique, and may only contain ASCII
1413 // alphanumeric characters or underscore. Because PrintToString adds quotes
1414 // to std::string and C strings, it won't work for these types.
1416 # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \
1417 static ::testing::internal::ParamGenerator<test_case_name::ParamType> \
1418 gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
1419 static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \
1420 const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \
1421 return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \
1422 (__VA_ARGS__)(info); \
1424 static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \
1425 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1426 GetTestCasePatternHolder<test_case_name>(\
1428 ::testing::internal::CodeLocation(\
1429 __FILE__, __LINE__))->AddTestCaseInstantiation(\
1431 >est_##prefix##test_case_name##_EvalGenerator_, \
1432 >est_##prefix##test_case_name##_EvalGenerateName_, \
1435 } // namespace testing
1437 #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_