Coverage Report

Created: 2020-06-26 05:44

/home/arjun/llvm-project/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h
Line
Count
Source (jump to first uncovered line)
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
0
ValuesIn(ForwardIterator begin, ForwardIterator end) {
311
0
  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
312
0
      ::value_type ParamType;
313
0
  return internal::ParamGenerator<ParamType>(
314
0
      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
315
0
}
316
317
template <typename T, size_t N>
318
0
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
319
0
  return ValuesIn(array, array + N);
320
0
}
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
0
internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
354
0
  return internal::ValueArray2<T1, T2>(v1, v2);
355
0
}
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
0
inline internal::ParamGenerator<bool> Bool() {
1221
0
  return Values(false, true);
1222
0
}
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_