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