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