~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Source/ThirdParty/gtest/include/gtest/gtest-param-test.h

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

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