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