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