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