Line data Source code
1 : // This file was GENERATED by command:
2 : // pump.py gtest-param-test.h.pump
3 : // DO NOT EDIT BY HAND!!!
4 :
5 : // Copyright 2008, Google Inc.
6 : // All rights reserved.
7 : //
8 : // Redistribution and use in source and binary forms, with or without
9 : // modification, are permitted provided that the following conditions are
10 : // met:
11 : //
12 : // * Redistributions of source code must retain the above copyright
13 : // notice, this list of conditions and the following disclaimer.
14 : // * Redistributions in binary form must reproduce the above
15 : // copyright notice, this list of conditions and the following disclaimer
16 : // in the documentation and/or other materials provided with the
17 : // distribution.
18 : // * Neither the name of Google Inc. nor the names of its
19 : // contributors may be used to endorse or promote products derived from
20 : // this software without specific prior written permission.
21 : //
22 : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 : // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 : // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 : // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 : // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 : // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 : // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 : // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 : // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 : // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 : //
34 : // Authors: vladl@google.com (Vlad Losev)
35 : //
36 : // Macros and functions for implementing parameterized tests
37 : // in Google C++ Testing Framework (Google Test)
38 : //
39 : // This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
40 : //
41 : #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
42 : #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
43 :
44 :
45 : // Value-parameterized tests allow you to test your code with different
46 : // parameters without writing multiple copies of the same test.
47 : //
48 : // Here is how you use value-parameterized tests:
49 :
50 : #if 0
51 :
52 : // To write value-parameterized tests, first you should define a fixture
53 : // class. It is usually derived from testing::TestWithParam<T> (see below for
54 : // another inheritance scheme that's sometimes useful in more complicated
55 : // class hierarchies), where the type of your parameter values.
56 : // TestWithParam<T> is itself derived from testing::Test. T can be any
57 : // copyable type. If it's a raw pointer, you are responsible for managing the
58 : // lifespan of the pointed values.
59 :
60 : class FooTest : public ::testing::TestWithParam<const char*> {
61 : // You can implement all the usual class fixture members here.
62 : };
63 :
64 : // Then, use the TEST_P macro to define as many parameterized tests
65 : // for this fixture as you want. The _P suffix is for "parameterized"
66 : // or "pattern", whichever you prefer to think.
67 :
68 : TEST_P(FooTest, DoesBlah) {
69 : // Inside a test, access the test parameter with the GetParam() method
70 : // of the TestWithParam<T> class:
71 : EXPECT_TRUE(foo.Blah(GetParam()));
72 : ...
73 : }
74 :
75 : TEST_P(FooTest, HasBlahBlah) {
76 : ...
77 : }
78 :
79 : // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
80 : // case with any set of parameters you want. Google Test defines a number
81 : // of functions for generating test parameters. They return what we call
82 : // (surprise!) parameter generators. Here is a summary of them, which
83 : // are all in the testing namespace:
84 : //
85 : //
86 : // Range(begin, end [, step]) - Yields values {begin, begin+step,
87 : // begin+step+step, ...}. The values do not
88 : // include end. step defaults to 1.
89 : // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
90 : // ValuesIn(container) - Yields values from a C-style array, an STL
91 : // ValuesIn(begin,end) container, or an iterator range [begin, end).
92 : // Bool() - Yields sequence {false, true}.
93 : // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
94 : // for the math savvy) of the values generated
95 : // by the N generators.
96 : //
97 : // For more details, see comments at the definitions of these functions below
98 : // in this file.
99 : //
100 : // The following statement will instantiate tests from the FooTest test case
101 : // each with parameter values "meeny", "miny", and "moe".
102 :
103 : INSTANTIATE_TEST_CASE_P(InstantiationName,
104 : FooTest,
105 : Values("meeny", "miny", "moe"));
106 :
107 : // To distinguish different instances of the pattern, (yes, you
108 : // can instantiate it more then once) the first argument to the
109 : // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
110 : // actual test case name. Remember to pick unique prefixes for different
111 : // instantiations. The tests from the instantiation above will have
112 : // these names:
113 : //
114 : // * InstantiationName/FooTest.DoesBlah/0 for "meeny"
115 : // * InstantiationName/FooTest.DoesBlah/1 for "miny"
116 : // * InstantiationName/FooTest.DoesBlah/2 for "moe"
117 : // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
118 : // * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
119 : // * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
120 : //
121 : // You can use these names in --gtest_filter.
122 : //
123 : // This statement will instantiate all tests from FooTest again, each
124 : // with parameter values "cat" and "dog":
125 :
126 : const char* pets[] = {"cat", "dog"};
127 : INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
128 :
129 : // The tests from the instantiation above will have these names:
130 : //
131 : // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
132 : // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
133 : // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
134 : // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
135 : //
136 : // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
137 : // in the given test case, whether their definitions come before or
138 : // AFTER the INSTANTIATE_TEST_CASE_P statement.
139 : //
140 : // Please also note that generator expressions (including parameters to the
141 : // generators) are evaluated in InitGoogleTest(), after main() has started.
142 : // This allows the user on one hand, to adjust generator parameters in order
143 : // to dynamically determine a set of tests to run and on the other hand,
144 : // give the user a chance to inspect the generated tests with Google Test
145 : // reflection API before RUN_ALL_TESTS() is executed.
146 : //
147 : // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
148 : // for more examples.
149 : //
150 : // In the future, we plan to publish the API for defining new parameter
151 : // generators. But for now this interface remains part of the internal
152 : // implementation and is subject to change.
153 : //
154 : //
155 : // A parameterized test fixture must be derived from testing::Test and from
156 : // testing::WithParamInterface<T>, where T is the type of the parameter
157 : // values. Inheriting from TestWithParam<T> satisfies that requirement because
158 : // TestWithParam<T> inherits from both Test and WithParamInterface. In more
159 : // complicated hierarchies, however, it is occasionally useful to inherit
160 : // separately from Test and WithParamInterface. For example:
161 :
162 : class BaseTest : public ::testing::Test {
163 : // You can inherit all the usual members for a non-parameterized test
164 : // fixture here.
165 : };
166 :
167 : class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
168 : // The usual test fixture members go here too.
169 : };
170 :
171 : TEST_F(BaseTest, HasFoo) {
172 : // This is an ordinary non-parameterized test.
173 : }
174 :
175 : TEST_P(DerivedTest, DoesBlah) {
176 : // GetParam works just the same here as if you inherit from TestWithParam.
177 : EXPECT_TRUE(foo.Blah(GetParam()));
178 : }
179 :
180 : #endif // 0
181 :
182 : #include "gtest/internal/gtest-port.h"
183 :
184 : #if !GTEST_OS_SYMBIAN
185 : # include <utility>
186 : #endif
187 :
188 : // scripts/fuse_gtest.py depends on gtest's own header being #included
189 : // *unconditionally*. Therefore these #includes cannot be moved
190 : // inside #if GTEST_HAS_PARAM_TEST.
191 : #include "gtest/internal/gtest-internal.h"
192 : #include "gtest/internal/gtest-param-util.h"
193 : #include "gtest/internal/gtest-param-util-generated.h"
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<
309 : typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
310 50 : ValuesIn(ForwardIterator begin, ForwardIterator end) {
311 : typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
312 : ::value_type ParamType;
313 : return internal::ParamGenerator<ParamType>(
314 50 : new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
315 : }
316 :
317 : template <typename T, size_t N>
318 38 : internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
319 38 : 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 12 : internal::ValueArray1<T1> Values(T1 v1) {
349 12 : return internal::ValueArray1<T1>(v1);
350 : }
351 :
352 : template <typename T1, typename T2>
353 27 : internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
354 27 : 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 11 : internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
364 11 : 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, __FILE__, __LINE__)->AddTestPattern(\
1391 : #test_case_name, \
1392 : #test_name, \
1393 : new ::testing::internal::TestMetaFactory< \
1394 : GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
1395 : return 0; \
1396 : } \
1397 : static int gtest_registering_dummy_; \
1398 : GTEST_DISALLOW_COPY_AND_ASSIGN_(\
1399 : GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
1400 : }; \
1401 : int GTEST_TEST_CLASS_NAME_(test_case_name, \
1402 : test_name)::gtest_registering_dummy_ = \
1403 : GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
1404 : void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
1405 :
1406 : # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
1407 : ::testing::internal::ParamGenerator<test_case_name::ParamType> \
1408 : gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
1409 : int gtest_##prefix##test_case_name##_dummy_ = \
1410 : ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
1411 : GetTestCasePatternHolder<test_case_name>(\
1412 : #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
1413 : #prefix, \
1414 : >est_##prefix##test_case_name##_EvalGenerator_, \
1415 : __FILE__, __LINE__)
1416 :
1417 : } // namespace testing
1418 :
1419 : #endif // GTEST_HAS_PARAM_TEST
1420 :
1421 : #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|