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