1// This file was GENERATED by command:
2//     pump.py gtest-param-util-generated.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// Author: vladl@google.com (Vlad Losev)
35
36// Type and function utilities for implementing parameterized tests.
37// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
38//
39// Currently Google Test supports at most 50 arguments in Values,
40// and at most 10 arguments in Combine. Please contact
41// googletestframework@googlegroups.com if you need more.
42// Please note that the number of arguments to Combine is limited
43// by the maximum arity of the implementation of tuple which is
44// currently set at 10.
45
46#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
47#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
48
49// scripts/fuse_gtest.py depends on gtest's own header being #included
50// *unconditionally*.  Therefore these #includes cannot be moved
51// inside #if GTEST_HAS_PARAM_TEST.
52#include "gtest/internal/gtest-param-util.h"
53#include "gtest/internal/gtest-port.h"
54
55#if GTEST_HAS_PARAM_TEST
56
57namespace testing {
58
59// Forward declarations of ValuesIn(), which is implemented in
60// include/gtest/gtest-param-test.h.
61template <typename ForwardIterator>
62internal::ParamGenerator<
63  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
64ValuesIn(ForwardIterator begin, ForwardIterator end);
65
66template <typename T, size_t N>
67internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
68
69template <class Container>
70internal::ParamGenerator<typename Container::value_type> ValuesIn(
71    const Container& container);
72
73namespace internal {
74
75// Used in the Values() function to provide polymorphic capabilities.
76template <typename T1>
77class ValueArray1 {
78 public:
79  explicit ValueArray1(T1 v1) : v1_(v1) {}
80
81  template <typename T>
82  operator ParamGenerator<T>() const {
83    const T array[] = {static_cast<T>(v1_)};
84    return ValuesIn(array);
85  }
86
87 private:
88  // No implementation - assignment is unsupported.
89  void operator=(const ValueArray1& other);
90
91  const T1 v1_;
92};
93
94template <typename T1, typename T2>
95class ValueArray2 {
96 public:
97  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
98
99  template <typename T>
100  operator ParamGenerator<T>() const {
101    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
102    return ValuesIn(array);
103  }
104
105 private:
106  // No implementation - assignment is unsupported.
107  void operator=(const ValueArray2& other);
108
109  const T1 v1_;
110  const T2 v2_;
111};
112
113template <typename T1, typename T2, typename T3>
114class ValueArray3 {
115 public:
116  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
117
118  template <typename T>
119  operator ParamGenerator<T>() const {
120    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
121        static_cast<T>(v3_)};
122    return ValuesIn(array);
123  }
124
125 private:
126  // No implementation - assignment is unsupported.
127  void operator=(const ValueArray3& other);
128
129  const T1 v1_;
130  const T2 v2_;
131  const T3 v3_;
132};
133
134template <typename T1, typename T2, typename T3, typename T4>
135class ValueArray4 {
136 public:
137  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
138      v4_(v4) {}
139
140  template <typename T>
141  operator ParamGenerator<T>() const {
142    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
143        static_cast<T>(v3_), static_cast<T>(v4_)};
144    return ValuesIn(array);
145  }
146
147 private:
148  // No implementation - assignment is unsupported.
149  void operator=(const ValueArray4& other);
150
151  const T1 v1_;
152  const T2 v2_;
153  const T3 v3_;
154  const T4 v4_;
155};
156
157template <typename T1, typename T2, typename T3, typename T4, typename T5>
158class ValueArray5 {
159 public:
160  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
161      v4_(v4), v5_(v5) {}
162
163  template <typename T>
164  operator ParamGenerator<T>() const {
165    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
166        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
167    return ValuesIn(array);
168  }
169
170 private:
171  // No implementation - assignment is unsupported.
172  void operator=(const ValueArray5& other);
173
174  const T1 v1_;
175  const T2 v2_;
176  const T3 v3_;
177  const T4 v4_;
178  const T5 v5_;
179};
180
181template <typename T1, typename T2, typename T3, typename T4, typename T5,
182    typename T6>
183class ValueArray6 {
184 public:
185  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
186      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
187
188  template <typename T>
189  operator ParamGenerator<T>() const {
190    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
191        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
192        static_cast<T>(v6_)};
193    return ValuesIn(array);
194  }
195
196 private:
197  // No implementation - assignment is unsupported.
198  void operator=(const ValueArray6& other);
199
200  const T1 v1_;
201  const T2 v2_;
202  const T3 v3_;
203  const T4 v4_;
204  const T5 v5_;
205  const T6 v6_;
206};
207
208template <typename T1, typename T2, typename T3, typename T4, typename T5,
209    typename T6, typename T7>
210class ValueArray7 {
211 public:
212  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
213      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
214
215  template <typename T>
216  operator ParamGenerator<T>() const {
217    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
218        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
219        static_cast<T>(v6_), static_cast<T>(v7_)};
220    return ValuesIn(array);
221  }
222
223 private:
224  // No implementation - assignment is unsupported.
225  void operator=(const ValueArray7& other);
226
227  const T1 v1_;
228  const T2 v2_;
229  const T3 v3_;
230  const T4 v4_;
231  const T5 v5_;
232  const T6 v6_;
233  const T7 v7_;
234};
235
236template <typename T1, typename T2, typename T3, typename T4, typename T5,
237    typename T6, typename T7, typename T8>
238class ValueArray8 {
239 public:
240  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
241      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
242      v8_(v8) {}
243
244  template <typename T>
245  operator ParamGenerator<T>() const {
246    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
247        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
248        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
249    return ValuesIn(array);
250  }
251
252 private:
253  // No implementation - assignment is unsupported.
254  void operator=(const ValueArray8& other);
255
256  const T1 v1_;
257  const T2 v2_;
258  const T3 v3_;
259  const T4 v4_;
260  const T5 v5_;
261  const T6 v6_;
262  const T7 v7_;
263  const T8 v8_;
264};
265
266template <typename T1, typename T2, typename T3, typename T4, typename T5,
267    typename T6, typename T7, typename T8, typename T9>
268class ValueArray9 {
269 public:
270  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
271      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
272      v8_(v8), v9_(v9) {}
273
274  template <typename T>
275  operator ParamGenerator<T>() const {
276    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
277        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
278        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
279        static_cast<T>(v9_)};
280    return ValuesIn(array);
281  }
282
283 private:
284  // No implementation - assignment is unsupported.
285  void operator=(const ValueArray9& other);
286
287  const T1 v1_;
288  const T2 v2_;
289  const T3 v3_;
290  const T4 v4_;
291  const T5 v5_;
292  const T6 v6_;
293  const T7 v7_;
294  const T8 v8_;
295  const T9 v9_;
296};
297
298template <typename T1, typename T2, typename T3, typename T4, typename T5,
299    typename T6, typename T7, typename T8, typename T9, typename T10>
300class ValueArray10 {
301 public:
302  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
303      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
304      v8_(v8), v9_(v9), v10_(v10) {}
305
306  template <typename T>
307  operator ParamGenerator<T>() const {
308    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
309        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
310        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
311        static_cast<T>(v9_), static_cast<T>(v10_)};
312    return ValuesIn(array);
313  }
314
315 private:
316  // No implementation - assignment is unsupported.
317  void operator=(const ValueArray10& other);
318
319  const T1 v1_;
320  const T2 v2_;
321  const T3 v3_;
322  const T4 v4_;
323  const T5 v5_;
324  const T6 v6_;
325  const T7 v7_;
326  const T8 v8_;
327  const T9 v9_;
328  const T10 v10_;
329};
330
331template <typename T1, typename T2, typename T3, typename T4, typename T5,
332    typename T6, typename T7, typename T8, typename T9, typename T10,
333    typename T11>
334class ValueArray11 {
335 public:
336  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
337      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
338      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
339
340  template <typename T>
341  operator ParamGenerator<T>() const {
342    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
343        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
344        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
345        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
346    return ValuesIn(array);
347  }
348
349 private:
350  // No implementation - assignment is unsupported.
351  void operator=(const ValueArray11& other);
352
353  const T1 v1_;
354  const T2 v2_;
355  const T3 v3_;
356  const T4 v4_;
357  const T5 v5_;
358  const T6 v6_;
359  const T7 v7_;
360  const T8 v8_;
361  const T9 v9_;
362  const T10 v10_;
363  const T11 v11_;
364};
365
366template <typename T1, typename T2, typename T3, typename T4, typename T5,
367    typename T6, typename T7, typename T8, typename T9, typename T10,
368    typename T11, typename T12>
369class ValueArray12 {
370 public:
371  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
372      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
373      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
374
375  template <typename T>
376  operator ParamGenerator<T>() const {
377    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
378        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
379        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
380        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
381        static_cast<T>(v12_)};
382    return ValuesIn(array);
383  }
384
385 private:
386  // No implementation - assignment is unsupported.
387  void operator=(const ValueArray12& other);
388
389  const T1 v1_;
390  const T2 v2_;
391  const T3 v3_;
392  const T4 v4_;
393  const T5 v5_;
394  const T6 v6_;
395  const T7 v7_;
396  const T8 v8_;
397  const T9 v9_;
398  const T10 v10_;
399  const T11 v11_;
400  const T12 v12_;
401};
402
403template <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>
406class ValueArray13 {
407 public:
408  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
409      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
410      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
411      v12_(v12), v13_(v13) {}
412
413  template <typename T>
414  operator ParamGenerator<T>() const {
415    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
416        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
417        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
418        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
419        static_cast<T>(v12_), static_cast<T>(v13_)};
420    return ValuesIn(array);
421  }
422
423 private:
424  // No implementation - assignment is unsupported.
425  void operator=(const ValueArray13& other);
426
427  const T1 v1_;
428  const T2 v2_;
429  const T3 v3_;
430  const T4 v4_;
431  const T5 v5_;
432  const T6 v6_;
433  const T7 v7_;
434  const T8 v8_;
435  const T9 v9_;
436  const T10 v10_;
437  const T11 v11_;
438  const T12 v12_;
439  const T13 v13_;
440};
441
442template <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>
445class ValueArray14 {
446 public:
447  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
448      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
449      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
450      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
451
452  template <typename T>
453  operator ParamGenerator<T>() const {
454    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
455        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
456        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
457        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
458        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
459    return ValuesIn(array);
460  }
461
462 private:
463  // No implementation - assignment is unsupported.
464  void operator=(const ValueArray14& other);
465
466  const T1 v1_;
467  const T2 v2_;
468  const T3 v3_;
469  const T4 v4_;
470  const T5 v5_;
471  const T6 v6_;
472  const T7 v7_;
473  const T8 v8_;
474  const T9 v9_;
475  const T10 v10_;
476  const T11 v11_;
477  const T12 v12_;
478  const T13 v13_;
479  const T14 v14_;
480};
481
482template <typename T1, typename T2, typename T3, typename T4, typename T5,
483    typename T6, typename T7, typename T8, typename T9, typename T10,
484    typename T11, typename T12, typename T13, typename T14, typename T15>
485class ValueArray15 {
486 public:
487  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
488      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
489      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
490      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
491
492  template <typename T>
493  operator ParamGenerator<T>() const {
494    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
495        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
496        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
497        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
498        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
499        static_cast<T>(v15_)};
500    return ValuesIn(array);
501  }
502
503 private:
504  // No implementation - assignment is unsupported.
505  void operator=(const ValueArray15& other);
506
507  const T1 v1_;
508  const T2 v2_;
509  const T3 v3_;
510  const T4 v4_;
511  const T5 v5_;
512  const T6 v6_;
513  const T7 v7_;
514  const T8 v8_;
515  const T9 v9_;
516  const T10 v10_;
517  const T11 v11_;
518  const T12 v12_;
519  const T13 v13_;
520  const T14 v14_;
521  const T15 v15_;
522};
523
524template <typename T1, typename T2, typename T3, typename T4, typename T5,
525    typename T6, typename T7, typename T8, typename T9, typename T10,
526    typename T11, typename T12, typename T13, typename T14, typename T15,
527    typename T16>
528class ValueArray16 {
529 public:
530  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
531      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
532      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
533      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
534      v16_(v16) {}
535
536  template <typename T>
537  operator ParamGenerator<T>() const {
538    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
539        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
540        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
541        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
542        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
543        static_cast<T>(v15_), static_cast<T>(v16_)};
544    return ValuesIn(array);
545  }
546
547 private:
548  // No implementation - assignment is unsupported.
549  void operator=(const ValueArray16& other);
550
551  const T1 v1_;
552  const T2 v2_;
553  const T3 v3_;
554  const T4 v4_;
555  const T5 v5_;
556  const T6 v6_;
557  const T7 v7_;
558  const T8 v8_;
559  const T9 v9_;
560  const T10 v10_;
561  const T11 v11_;
562  const T12 v12_;
563  const T13 v13_;
564  const T14 v14_;
565  const T15 v15_;
566  const T16 v16_;
567};
568
569template <typename T1, typename T2, typename T3, typename T4, typename T5,
570    typename T6, typename T7, typename T8, typename T9, typename T10,
571    typename T11, typename T12, typename T13, typename T14, typename T15,
572    typename T16, typename T17>
573class ValueArray17 {
574 public:
575  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
576      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
577      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
578      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
579      v15_(v15), v16_(v16), v17_(v17) {}
580
581  template <typename T>
582  operator ParamGenerator<T>() const {
583    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
584        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
585        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
586        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
587        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
588        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
589    return ValuesIn(array);
590  }
591
592 private:
593  // No implementation - assignment is unsupported.
594  void operator=(const ValueArray17& other);
595
596  const T1 v1_;
597  const T2 v2_;
598  const T3 v3_;
599  const T4 v4_;
600  const T5 v5_;
601  const T6 v6_;
602  const T7 v7_;
603  const T8 v8_;
604  const T9 v9_;
605  const T10 v10_;
606  const T11 v11_;
607  const T12 v12_;
608  const T13 v13_;
609  const T14 v14_;
610  const T15 v15_;
611  const T16 v16_;
612  const T17 v17_;
613};
614
615template <typename T1, typename T2, typename T3, typename T4, typename T5,
616    typename T6, typename T7, typename T8, typename T9, typename T10,
617    typename T11, typename T12, typename T13, typename T14, typename T15,
618    typename T16, typename T17, typename T18>
619class ValueArray18 {
620 public:
621  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
622      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
623      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
624      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
625      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
626
627  template <typename T>
628  operator ParamGenerator<T>() const {
629    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
630        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
631        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
632        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
633        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
634        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
635        static_cast<T>(v18_)};
636    return ValuesIn(array);
637  }
638
639 private:
640  // No implementation - assignment is unsupported.
641  void operator=(const ValueArray18& other);
642
643  const T1 v1_;
644  const T2 v2_;
645  const T3 v3_;
646  const T4 v4_;
647  const T5 v5_;
648  const T6 v6_;
649  const T7 v7_;
650  const T8 v8_;
651  const T9 v9_;
652  const T10 v10_;
653  const T11 v11_;
654  const T12 v12_;
655  const T13 v13_;
656  const T14 v14_;
657  const T15 v15_;
658  const T16 v16_;
659  const T17 v17_;
660  const T18 v18_;
661};
662
663template <typename T1, typename T2, typename T3, typename T4, typename T5,
664    typename T6, typename T7, typename T8, typename T9, typename T10,
665    typename T11, typename T12, typename T13, typename T14, typename T15,
666    typename T16, typename T17, typename T18, typename T19>
667class ValueArray19 {
668 public:
669  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
670      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
671      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
672      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
673      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
674
675  template <typename T>
676  operator ParamGenerator<T>() const {
677    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
678        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
679        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
680        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
681        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
682        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
683        static_cast<T>(v18_), static_cast<T>(v19_)};
684    return ValuesIn(array);
685  }
686
687 private:
688  // No implementation - assignment is unsupported.
689  void operator=(const ValueArray19& other);
690
691  const T1 v1_;
692  const T2 v2_;
693  const T3 v3_;
694  const T4 v4_;
695  const T5 v5_;
696  const T6 v6_;
697  const T7 v7_;
698  const T8 v8_;
699  const T9 v9_;
700  const T10 v10_;
701  const T11 v11_;
702  const T12 v12_;
703  const T13 v13_;
704  const T14 v14_;
705  const T15 v15_;
706  const T16 v16_;
707  const T17 v17_;
708  const T18 v18_;
709  const T19 v19_;
710};
711
712template <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>
716class ValueArray20 {
717 public:
718  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
719      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
720      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
721      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
722      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
723      v19_(v19), v20_(v20) {}
724
725  template <typename T>
726  operator ParamGenerator<T>() const {
727    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
728        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
729        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
730        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
731        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
732        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
733        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
734    return ValuesIn(array);
735  }
736
737 private:
738  // No implementation - assignment is unsupported.
739  void operator=(const ValueArray20& other);
740
741  const T1 v1_;
742  const T2 v2_;
743  const T3 v3_;
744  const T4 v4_;
745  const T5 v5_;
746  const T6 v6_;
747  const T7 v7_;
748  const T8 v8_;
749  const T9 v9_;
750  const T10 v10_;
751  const T11 v11_;
752  const T12 v12_;
753  const T13 v13_;
754  const T14 v14_;
755  const T15 v15_;
756  const T16 v16_;
757  const T17 v17_;
758  const T18 v18_;
759  const T19 v19_;
760  const T20 v20_;
761};
762
763template <typename T1, typename T2, typename T3, typename T4, typename T5,
764    typename T6, typename T7, typename T8, typename T9, typename T10,
765    typename T11, typename T12, typename T13, typename T14, typename T15,
766    typename T16, typename T17, typename T18, typename T19, typename T20,
767    typename T21>
768class ValueArray21 {
769 public:
770  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
771      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
772      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
773      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
774      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
775      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
776
777  template <typename T>
778  operator ParamGenerator<T>() const {
779    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
780        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
781        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
782        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
783        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
784        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
785        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
786        static_cast<T>(v21_)};
787    return ValuesIn(array);
788  }
789
790 private:
791  // No implementation - assignment is unsupported.
792  void operator=(const ValueArray21& other);
793
794  const T1 v1_;
795  const T2 v2_;
796  const T3 v3_;
797  const T4 v4_;
798  const T5 v5_;
799  const T6 v6_;
800  const T7 v7_;
801  const T8 v8_;
802  const T9 v9_;
803  const T10 v10_;
804  const T11 v11_;
805  const T12 v12_;
806  const T13 v13_;
807  const T14 v14_;
808  const T15 v15_;
809  const T16 v16_;
810  const T17 v17_;
811  const T18 v18_;
812  const T19 v19_;
813  const T20 v20_;
814  const T21 v21_;
815};
816
817template <typename T1, typename T2, typename T3, typename T4, typename T5,
818    typename T6, typename T7, typename T8, typename T9, typename T10,
819    typename T11, typename T12, typename T13, typename T14, typename T15,
820    typename T16, typename T17, typename T18, typename T19, typename T20,
821    typename T21, typename T22>
822class ValueArray22 {
823 public:
824  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
825      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
826      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
827      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
828      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
829      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
830
831  template <typename T>
832  operator ParamGenerator<T>() const {
833    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
834        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
835        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
836        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
837        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
838        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
839        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
840        static_cast<T>(v21_), static_cast<T>(v22_)};
841    return ValuesIn(array);
842  }
843
844 private:
845  // No implementation - assignment is unsupported.
846  void operator=(const ValueArray22& other);
847
848  const T1 v1_;
849  const T2 v2_;
850  const T3 v3_;
851  const T4 v4_;
852  const T5 v5_;
853  const T6 v6_;
854  const T7 v7_;
855  const T8 v8_;
856  const T9 v9_;
857  const T10 v10_;
858  const T11 v11_;
859  const T12 v12_;
860  const T13 v13_;
861  const T14 v14_;
862  const T15 v15_;
863  const T16 v16_;
864  const T17 v17_;
865  const T18 v18_;
866  const T19 v19_;
867  const T20 v20_;
868  const T21 v21_;
869  const T22 v22_;
870};
871
872template <typename T1, typename T2, typename T3, typename T4, typename T5,
873    typename T6, typename T7, typename T8, typename T9, typename T10,
874    typename T11, typename T12, typename T13, typename T14, typename T15,
875    typename T16, typename T17, typename T18, typename T19, typename T20,
876    typename T21, typename T22, typename T23>
877class ValueArray23 {
878 public:
879  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
880      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
881      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
882      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
883      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
884      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
885      v23_(v23) {}
886
887  template <typename T>
888  operator ParamGenerator<T>() const {
889    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
890        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
891        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
892        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
893        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
894        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
895        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
896        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
897    return ValuesIn(array);
898  }
899
900 private:
901  // No implementation - assignment is unsupported.
902  void operator=(const ValueArray23& other);
903
904  const T1 v1_;
905  const T2 v2_;
906  const T3 v3_;
907  const T4 v4_;
908  const T5 v5_;
909  const T6 v6_;
910  const T7 v7_;
911  const T8 v8_;
912  const T9 v9_;
913  const T10 v10_;
914  const T11 v11_;
915  const T12 v12_;
916  const T13 v13_;
917  const T14 v14_;
918  const T15 v15_;
919  const T16 v16_;
920  const T17 v17_;
921  const T18 v18_;
922  const T19 v19_;
923  const T20 v20_;
924  const T21 v21_;
925  const T22 v22_;
926  const T23 v23_;
927};
928
929template <typename T1, typename T2, typename T3, typename T4, typename T5,
930    typename T6, typename T7, typename T8, typename T9, typename T10,
931    typename T11, typename T12, typename T13, typename T14, typename T15,
932    typename T16, typename T17, typename T18, typename T19, typename T20,
933    typename T21, typename T22, typename T23, typename T24>
934class ValueArray24 {
935 public:
936  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
937      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
938      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
939      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
940      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
941      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
942      v22_(v22), v23_(v23), v24_(v24) {}
943
944  template <typename T>
945  operator ParamGenerator<T>() const {
946    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
947        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
948        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
949        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
950        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
951        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
952        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
953        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
954        static_cast<T>(v24_)};
955    return ValuesIn(array);
956  }
957
958 private:
959  // No implementation - assignment is unsupported.
960  void operator=(const ValueArray24& other);
961
962  const T1 v1_;
963  const T2 v2_;
964  const T3 v3_;
965  const T4 v4_;
966  const T5 v5_;
967  const T6 v6_;
968  const T7 v7_;
969  const T8 v8_;
970  const T9 v9_;
971  const T10 v10_;
972  const T11 v11_;
973  const T12 v12_;
974  const T13 v13_;
975  const T14 v14_;
976  const T15 v15_;
977  const T16 v16_;
978  const T17 v17_;
979  const T18 v18_;
980  const T19 v19_;
981  const T20 v20_;
982  const T21 v21_;
983  const T22 v22_;
984  const T23 v23_;
985  const T24 v24_;
986};
987
988template <typename T1, typename T2, typename T3, typename T4, typename T5,
989    typename T6, typename T7, typename T8, typename T9, typename T10,
990    typename T11, typename T12, typename T13, typename T14, typename T15,
991    typename T16, typename T17, typename T18, typename T19, typename T20,
992    typename T21, typename T22, typename T23, typename T24, typename T25>
993class ValueArray25 {
994 public:
995  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
996      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
997      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
998      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
999      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1000      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1001      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
1002
1003  template <typename T>
1004  operator ParamGenerator<T>() const {
1005    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1006        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1007        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1008        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1009        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1010        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1011        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1012        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1013        static_cast<T>(v24_), static_cast<T>(v25_)};
1014    return ValuesIn(array);
1015  }
1016
1017 private:
1018  // No implementation - assignment is unsupported.
1019  void operator=(const ValueArray25& other);
1020
1021  const T1 v1_;
1022  const T2 v2_;
1023  const T3 v3_;
1024  const T4 v4_;
1025  const T5 v5_;
1026  const T6 v6_;
1027  const T7 v7_;
1028  const T8 v8_;
1029  const T9 v9_;
1030  const T10 v10_;
1031  const T11 v11_;
1032  const T12 v12_;
1033  const T13 v13_;
1034  const T14 v14_;
1035  const T15 v15_;
1036  const T16 v16_;
1037  const T17 v17_;
1038  const T18 v18_;
1039  const T19 v19_;
1040  const T20 v20_;
1041  const T21 v21_;
1042  const T22 v22_;
1043  const T23 v23_;
1044  const T24 v24_;
1045  const T25 v25_;
1046};
1047
1048template <typename T1, typename T2, typename T3, typename T4, typename T5,
1049    typename T6, typename T7, typename T8, typename T9, typename T10,
1050    typename T11, typename T12, typename T13, typename T14, typename T15,
1051    typename T16, typename T17, typename T18, typename T19, typename T20,
1052    typename T21, typename T22, typename T23, typename T24, typename T25,
1053    typename T26>
1054class ValueArray26 {
1055 public:
1056  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1057      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1058      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1059      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1060      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1061      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1062      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
1063
1064  template <typename T>
1065  operator ParamGenerator<T>() const {
1066    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1067        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1068        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1069        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1070        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1071        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1072        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1073        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1074        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
1075    return ValuesIn(array);
1076  }
1077
1078 private:
1079  // No implementation - assignment is unsupported.
1080  void operator=(const ValueArray26& other);
1081
1082  const T1 v1_;
1083  const T2 v2_;
1084  const T3 v3_;
1085  const T4 v4_;
1086  const T5 v5_;
1087  const T6 v6_;
1088  const T7 v7_;
1089  const T8 v8_;
1090  const T9 v9_;
1091  const T10 v10_;
1092  const T11 v11_;
1093  const T12 v12_;
1094  const T13 v13_;
1095  const T14 v14_;
1096  const T15 v15_;
1097  const T16 v16_;
1098  const T17 v17_;
1099  const T18 v18_;
1100  const T19 v19_;
1101  const T20 v20_;
1102  const T21 v21_;
1103  const T22 v22_;
1104  const T23 v23_;
1105  const T24 v24_;
1106  const T25 v25_;
1107  const T26 v26_;
1108};
1109
1110template <typename T1, typename T2, typename T3, typename T4, typename T5,
1111    typename T6, typename T7, typename T8, typename T9, typename T10,
1112    typename T11, typename T12, typename T13, typename T14, typename T15,
1113    typename T16, typename T17, typename T18, typename T19, typename T20,
1114    typename T21, typename T22, typename T23, typename T24, typename T25,
1115    typename T26, typename T27>
1116class ValueArray27 {
1117 public:
1118  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1119      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1120      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1121      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1122      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1123      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1124      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1125      v26_(v26), v27_(v27) {}
1126
1127  template <typename T>
1128  operator ParamGenerator<T>() const {
1129    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1130        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1131        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1132        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1133        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1134        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1135        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1136        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1137        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1138        static_cast<T>(v27_)};
1139    return ValuesIn(array);
1140  }
1141
1142 private:
1143  // No implementation - assignment is unsupported.
1144  void operator=(const ValueArray27& other);
1145
1146  const T1 v1_;
1147  const T2 v2_;
1148  const T3 v3_;
1149  const T4 v4_;
1150  const T5 v5_;
1151  const T6 v6_;
1152  const T7 v7_;
1153  const T8 v8_;
1154  const T9 v9_;
1155  const T10 v10_;
1156  const T11 v11_;
1157  const T12 v12_;
1158  const T13 v13_;
1159  const T14 v14_;
1160  const T15 v15_;
1161  const T16 v16_;
1162  const T17 v17_;
1163  const T18 v18_;
1164  const T19 v19_;
1165  const T20 v20_;
1166  const T21 v21_;
1167  const T22 v22_;
1168  const T23 v23_;
1169  const T24 v24_;
1170  const T25 v25_;
1171  const T26 v26_;
1172  const T27 v27_;
1173};
1174
1175template <typename T1, typename T2, typename T3, typename T4, typename T5,
1176    typename T6, typename T7, typename T8, typename T9, typename T10,
1177    typename T11, typename T12, typename T13, typename T14, typename T15,
1178    typename T16, typename T17, typename T18, typename T19, typename T20,
1179    typename T21, typename T22, typename T23, typename T24, typename T25,
1180    typename T26, typename T27, typename T28>
1181class ValueArray28 {
1182 public:
1183  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1184      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1185      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1186      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1187      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1188      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1189      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1190      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
1191
1192  template <typename T>
1193  operator ParamGenerator<T>() const {
1194    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1195        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1196        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1197        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1198        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1199        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1200        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1201        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1202        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1203        static_cast<T>(v27_), static_cast<T>(v28_)};
1204    return ValuesIn(array);
1205  }
1206
1207 private:
1208  // No implementation - assignment is unsupported.
1209  void operator=(const ValueArray28& other);
1210
1211  const T1 v1_;
1212  const T2 v2_;
1213  const T3 v3_;
1214  const T4 v4_;
1215  const T5 v5_;
1216  const T6 v6_;
1217  const T7 v7_;
1218  const T8 v8_;
1219  const T9 v9_;
1220  const T10 v10_;
1221  const T11 v11_;
1222  const T12 v12_;
1223  const T13 v13_;
1224  const T14 v14_;
1225  const T15 v15_;
1226  const T16 v16_;
1227  const T17 v17_;
1228  const T18 v18_;
1229  const T19 v19_;
1230  const T20 v20_;
1231  const T21 v21_;
1232  const T22 v22_;
1233  const T23 v23_;
1234  const T24 v24_;
1235  const T25 v25_;
1236  const T26 v26_;
1237  const T27 v27_;
1238  const T28 v28_;
1239};
1240
1241template <typename T1, typename T2, typename T3, typename T4, typename T5,
1242    typename T6, typename T7, typename T8, typename T9, typename T10,
1243    typename T11, typename T12, typename T13, typename T14, typename T15,
1244    typename T16, typename T17, typename T18, typename T19, typename T20,
1245    typename T21, typename T22, typename T23, typename T24, typename T25,
1246    typename T26, typename T27, typename T28, typename T29>
1247class ValueArray29 {
1248 public:
1249  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1250      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1251      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1252      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1253      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1254      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1255      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1256      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
1257
1258  template <typename T>
1259  operator ParamGenerator<T>() const {
1260    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1261        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1262        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1263        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1264        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1265        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1266        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1267        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1268        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1269        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
1270    return ValuesIn(array);
1271  }
1272
1273 private:
1274  // No implementation - assignment is unsupported.
1275  void operator=(const ValueArray29& other);
1276
1277  const T1 v1_;
1278  const T2 v2_;
1279  const T3 v3_;
1280  const T4 v4_;
1281  const T5 v5_;
1282  const T6 v6_;
1283  const T7 v7_;
1284  const T8 v8_;
1285  const T9 v9_;
1286  const T10 v10_;
1287  const T11 v11_;
1288  const T12 v12_;
1289  const T13 v13_;
1290  const T14 v14_;
1291  const T15 v15_;
1292  const T16 v16_;
1293  const T17 v17_;
1294  const T18 v18_;
1295  const T19 v19_;
1296  const T20 v20_;
1297  const T21 v21_;
1298  const T22 v22_;
1299  const T23 v23_;
1300  const T24 v24_;
1301  const T25 v25_;
1302  const T26 v26_;
1303  const T27 v27_;
1304  const T28 v28_;
1305  const T29 v29_;
1306};
1307
1308template <typename T1, typename T2, typename T3, typename T4, typename T5,
1309    typename T6, typename T7, typename T8, typename T9, typename T10,
1310    typename T11, typename T12, typename T13, typename T14, typename T15,
1311    typename T16, typename T17, typename T18, typename T19, typename T20,
1312    typename T21, typename T22, typename T23, typename T24, typename T25,
1313    typename T26, typename T27, typename T28, typename T29, typename T30>
1314class ValueArray30 {
1315 public:
1316  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1317      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1318      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1319      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
1320      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1321      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1322      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1323      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1324      v29_(v29), v30_(v30) {}
1325
1326  template <typename T>
1327  operator ParamGenerator<T>() const {
1328    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1329        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1330        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1331        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1332        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1333        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1334        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1335        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1336        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1337        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1338        static_cast<T>(v30_)};
1339    return ValuesIn(array);
1340  }
1341
1342 private:
1343  // No implementation - assignment is unsupported.
1344  void operator=(const ValueArray30& other);
1345
1346  const T1 v1_;
1347  const T2 v2_;
1348  const T3 v3_;
1349  const T4 v4_;
1350  const T5 v5_;
1351  const T6 v6_;
1352  const T7 v7_;
1353  const T8 v8_;
1354  const T9 v9_;
1355  const T10 v10_;
1356  const T11 v11_;
1357  const T12 v12_;
1358  const T13 v13_;
1359  const T14 v14_;
1360  const T15 v15_;
1361  const T16 v16_;
1362  const T17 v17_;
1363  const T18 v18_;
1364  const T19 v19_;
1365  const T20 v20_;
1366  const T21 v21_;
1367  const T22 v22_;
1368  const T23 v23_;
1369  const T24 v24_;
1370  const T25 v25_;
1371  const T26 v26_;
1372  const T27 v27_;
1373  const T28 v28_;
1374  const T29 v29_;
1375  const T30 v30_;
1376};
1377
1378template <typename T1, typename T2, typename T3, typename T4, typename T5,
1379    typename T6, typename T7, typename T8, typename T9, typename T10,
1380    typename T11, typename T12, typename T13, typename T14, typename T15,
1381    typename T16, typename T17, typename T18, typename T19, typename T20,
1382    typename T21, typename T22, typename T23, typename T24, typename T25,
1383    typename T26, typename T27, typename T28, typename T29, typename T30,
1384    typename T31>
1385class ValueArray31 {
1386 public:
1387  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1388      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1389      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1390      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
1391      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1392      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1393      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1394      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1395      v29_(v29), v30_(v30), v31_(v31) {}
1396
1397  template <typename T>
1398  operator ParamGenerator<T>() const {
1399    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1400        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1401        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1402        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1403        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1404        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1405        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1406        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1407        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1408        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1409        static_cast<T>(v30_), static_cast<T>(v31_)};
1410    return ValuesIn(array);
1411  }
1412
1413 private:
1414  // No implementation - assignment is unsupported.
1415  void operator=(const ValueArray31& other);
1416
1417  const T1 v1_;
1418  const T2 v2_;
1419  const T3 v3_;
1420  const T4 v4_;
1421  const T5 v5_;
1422  const T6 v6_;
1423  const T7 v7_;
1424  const T8 v8_;
1425  const T9 v9_;
1426  const T10 v10_;
1427  const T11 v11_;
1428  const T12 v12_;
1429  const T13 v13_;
1430  const T14 v14_;
1431  const T15 v15_;
1432  const T16 v16_;
1433  const T17 v17_;
1434  const T18 v18_;
1435  const T19 v19_;
1436  const T20 v20_;
1437  const T21 v21_;
1438  const T22 v22_;
1439  const T23 v23_;
1440  const T24 v24_;
1441  const T25 v25_;
1442  const T26 v26_;
1443  const T27 v27_;
1444  const T28 v28_;
1445  const T29 v29_;
1446  const T30 v30_;
1447  const T31 v31_;
1448};
1449
1450template <typename T1, typename T2, typename T3, typename T4, typename T5,
1451    typename T6, typename T7, typename T8, typename T9, typename T10,
1452    typename T11, typename T12, typename T13, typename T14, typename T15,
1453    typename T16, typename T17, typename T18, typename T19, typename T20,
1454    typename T21, typename T22, typename T23, typename T24, typename T25,
1455    typename T26, typename T27, typename T28, typename T29, typename T30,
1456    typename T31, typename T32>
1457class ValueArray32 {
1458 public:
1459  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1460      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1461      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1462      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
1463      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1464      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1465      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1466      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1467      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
1468
1469  template <typename T>
1470  operator ParamGenerator<T>() const {
1471    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1472        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1473        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1474        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1475        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1476        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1477        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1478        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1479        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1480        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1481        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
1482    return ValuesIn(array);
1483  }
1484
1485 private:
1486  // No implementation - assignment is unsupported.
1487  void operator=(const ValueArray32& other);
1488
1489  const T1 v1_;
1490  const T2 v2_;
1491  const T3 v3_;
1492  const T4 v4_;
1493  const T5 v5_;
1494  const T6 v6_;
1495  const T7 v7_;
1496  const T8 v8_;
1497  const T9 v9_;
1498  const T10 v10_;
1499  const T11 v11_;
1500  const T12 v12_;
1501  const T13 v13_;
1502  const T14 v14_;
1503  const T15 v15_;
1504  const T16 v16_;
1505  const T17 v17_;
1506  const T18 v18_;
1507  const T19 v19_;
1508  const T20 v20_;
1509  const T21 v21_;
1510  const T22 v22_;
1511  const T23 v23_;
1512  const T24 v24_;
1513  const T25 v25_;
1514  const T26 v26_;
1515  const T27 v27_;
1516  const T28 v28_;
1517  const T29 v29_;
1518  const T30 v30_;
1519  const T31 v31_;
1520  const T32 v32_;
1521};
1522
1523template <typename T1, typename T2, typename T3, typename T4, typename T5,
1524    typename T6, typename T7, typename T8, typename T9, typename T10,
1525    typename T11, typename T12, typename T13, typename T14, typename T15,
1526    typename T16, typename T17, typename T18, typename T19, typename T20,
1527    typename T21, typename T22, typename T23, typename T24, typename T25,
1528    typename T26, typename T27, typename T28, typename T29, typename T30,
1529    typename T31, typename T32, typename T33>
1530class ValueArray33 {
1531 public:
1532  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1533      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1534      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1535      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1536      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1537      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1538      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1539      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1540      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1541      v33_(v33) {}
1542
1543  template <typename T>
1544  operator ParamGenerator<T>() const {
1545    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1546        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1547        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1548        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1549        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1550        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1551        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1552        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1553        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1554        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1555        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1556        static_cast<T>(v33_)};
1557    return ValuesIn(array);
1558  }
1559
1560 private:
1561  // No implementation - assignment is unsupported.
1562  void operator=(const ValueArray33& other);
1563
1564  const T1 v1_;
1565  const T2 v2_;
1566  const T3 v3_;
1567  const T4 v4_;
1568  const T5 v5_;
1569  const T6 v6_;
1570  const T7 v7_;
1571  const T8 v8_;
1572  const T9 v9_;
1573  const T10 v10_;
1574  const T11 v11_;
1575  const T12 v12_;
1576  const T13 v13_;
1577  const T14 v14_;
1578  const T15 v15_;
1579  const T16 v16_;
1580  const T17 v17_;
1581  const T18 v18_;
1582  const T19 v19_;
1583  const T20 v20_;
1584  const T21 v21_;
1585  const T22 v22_;
1586  const T23 v23_;
1587  const T24 v24_;
1588  const T25 v25_;
1589  const T26 v26_;
1590  const T27 v27_;
1591  const T28 v28_;
1592  const T29 v29_;
1593  const T30 v30_;
1594  const T31 v31_;
1595  const T32 v32_;
1596  const T33 v33_;
1597};
1598
1599template <typename T1, typename T2, typename T3, typename T4, typename T5,
1600    typename T6, typename T7, typename T8, typename T9, typename T10,
1601    typename T11, typename T12, typename T13, typename T14, typename T15,
1602    typename T16, typename T17, typename T18, typename T19, typename T20,
1603    typename T21, typename T22, typename T23, typename T24, typename T25,
1604    typename T26, typename T27, typename T28, typename T29, typename T30,
1605    typename T31, typename T32, typename T33, typename T34>
1606class ValueArray34 {
1607 public:
1608  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1609      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1610      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1611      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1612      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1613      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1614      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1615      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1616      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1617      v33_(v33), v34_(v34) {}
1618
1619  template <typename T>
1620  operator ParamGenerator<T>() const {
1621    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1622        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1623        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1624        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1625        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1626        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1627        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1628        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1629        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1630        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1631        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1632        static_cast<T>(v33_), static_cast<T>(v34_)};
1633    return ValuesIn(array);
1634  }
1635
1636 private:
1637  // No implementation - assignment is unsupported.
1638  void operator=(const ValueArray34& other);
1639
1640  const T1 v1_;
1641  const T2 v2_;
1642  const T3 v3_;
1643  const T4 v4_;
1644  const T5 v5_;
1645  const T6 v6_;
1646  const T7 v7_;
1647  const T8 v8_;
1648  const T9 v9_;
1649  const T10 v10_;
1650  const T11 v11_;
1651  const T12 v12_;
1652  const T13 v13_;
1653  const T14 v14_;
1654  const T15 v15_;
1655  const T16 v16_;
1656  const T17 v17_;
1657  const T18 v18_;
1658  const T19 v19_;
1659  const T20 v20_;
1660  const T21 v21_;
1661  const T22 v22_;
1662  const T23 v23_;
1663  const T24 v24_;
1664  const T25 v25_;
1665  const T26 v26_;
1666  const T27 v27_;
1667  const T28 v28_;
1668  const T29 v29_;
1669  const T30 v30_;
1670  const T31 v31_;
1671  const T32 v32_;
1672  const T33 v33_;
1673  const T34 v34_;
1674};
1675
1676template <typename T1, typename T2, typename T3, typename T4, typename T5,
1677    typename T6, typename T7, typename T8, typename T9, typename T10,
1678    typename T11, typename T12, typename T13, typename T14, typename T15,
1679    typename T16, typename T17, typename T18, typename T19, typename T20,
1680    typename T21, typename T22, typename T23, typename T24, typename T25,
1681    typename T26, typename T27, typename T28, typename T29, typename T30,
1682    typename T31, typename T32, typename T33, typename T34, typename T35>
1683class ValueArray35 {
1684 public:
1685  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1686      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1687      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1688      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1689      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1690      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1691      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1692      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1693      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
1694      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
1695
1696  template <typename T>
1697  operator ParamGenerator<T>() const {
1698    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1699        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1700        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1701        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1702        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1703        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1704        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1705        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1706        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1707        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1708        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1709        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
1710    return ValuesIn(array);
1711  }
1712
1713 private:
1714  // No implementation - assignment is unsupported.
1715  void operator=(const ValueArray35& other);
1716
1717  const T1 v1_;
1718  const T2 v2_;
1719  const T3 v3_;
1720  const T4 v4_;
1721  const T5 v5_;
1722  const T6 v6_;
1723  const T7 v7_;
1724  const T8 v8_;
1725  const T9 v9_;
1726  const T10 v10_;
1727  const T11 v11_;
1728  const T12 v12_;
1729  const T13 v13_;
1730  const T14 v14_;
1731  const T15 v15_;
1732  const T16 v16_;
1733  const T17 v17_;
1734  const T18 v18_;
1735  const T19 v19_;
1736  const T20 v20_;
1737  const T21 v21_;
1738  const T22 v22_;
1739  const T23 v23_;
1740  const T24 v24_;
1741  const T25 v25_;
1742  const T26 v26_;
1743  const T27 v27_;
1744  const T28 v28_;
1745  const T29 v29_;
1746  const T30 v30_;
1747  const T31 v31_;
1748  const T32 v32_;
1749  const T33 v33_;
1750  const T34 v34_;
1751  const T35 v35_;
1752};
1753
1754template <typename T1, typename T2, typename T3, typename T4, typename T5,
1755    typename T6, typename T7, typename T8, typename T9, typename T10,
1756    typename T11, typename T12, typename T13, typename T14, typename T15,
1757    typename T16, typename T17, typename T18, typename T19, typename T20,
1758    typename T21, typename T22, typename T23, typename T24, typename T25,
1759    typename T26, typename T27, typename T28, typename T29, typename T30,
1760    typename T31, typename T32, typename T33, typename T34, typename T35,
1761    typename T36>
1762class ValueArray36 {
1763 public:
1764  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1765      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1766      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1767      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1768      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1769      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1770      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1771      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1772      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
1773      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
1774
1775  template <typename T>
1776  operator ParamGenerator<T>() const {
1777    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1778        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1779        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1780        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1781        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1782        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1783        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1784        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1785        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1786        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1787        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1788        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
1789        static_cast<T>(v36_)};
1790    return ValuesIn(array);
1791  }
1792
1793 private:
1794  // No implementation - assignment is unsupported.
1795  void operator=(const ValueArray36& other);
1796
1797  const T1 v1_;
1798  const T2 v2_;
1799  const T3 v3_;
1800  const T4 v4_;
1801  const T5 v5_;
1802  const T6 v6_;
1803  const T7 v7_;
1804  const T8 v8_;
1805  const T9 v9_;
1806  const T10 v10_;
1807  const T11 v11_;
1808  const T12 v12_;
1809  const T13 v13_;
1810  const T14 v14_;
1811  const T15 v15_;
1812  const T16 v16_;
1813  const T17 v17_;
1814  const T18 v18_;
1815  const T19 v19_;
1816  const T20 v20_;
1817  const T21 v21_;
1818  const T22 v22_;
1819  const T23 v23_;
1820  const T24 v24_;
1821  const T25 v25_;
1822  const T26 v26_;
1823  const T27 v27_;
1824  const T28 v28_;
1825  const T29 v29_;
1826  const T30 v30_;
1827  const T31 v31_;
1828  const T32 v32_;
1829  const T33 v33_;
1830  const T34 v34_;
1831  const T35 v35_;
1832  const T36 v36_;
1833};
1834
1835template <typename T1, typename T2, typename T3, typename T4, typename T5,
1836    typename T6, typename T7, typename T8, typename T9, typename T10,
1837    typename T11, typename T12, typename T13, typename T14, typename T15,
1838    typename T16, typename T17, typename T18, typename T19, typename T20,
1839    typename T21, typename T22, typename T23, typename T24, typename T25,
1840    typename T26, typename T27, typename T28, typename T29, typename T30,
1841    typename T31, typename T32, typename T33, typename T34, typename T35,
1842    typename T36, typename T37>
1843class ValueArray37 {
1844 public:
1845  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1846      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1847      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1848      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1849      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1850      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1851      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1852      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1853      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
1854      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
1855      v36_(v36), v37_(v37) {}
1856
1857  template <typename T>
1858  operator ParamGenerator<T>() const {
1859    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1860        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1861        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1862        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1863        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1864        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1865        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1866        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1867        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1868        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1869        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1870        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
1871        static_cast<T>(v36_), static_cast<T>(v37_)};
1872    return ValuesIn(array);
1873  }
1874
1875 private:
1876  // No implementation - assignment is unsupported.
1877  void operator=(const ValueArray37& other);
1878
1879  const T1 v1_;
1880  const T2 v2_;
1881  const T3 v3_;
1882  const T4 v4_;
1883  const T5 v5_;
1884  const T6 v6_;
1885  const T7 v7_;
1886  const T8 v8_;
1887  const T9 v9_;
1888  const T10 v10_;
1889  const T11 v11_;
1890  const T12 v12_;
1891  const T13 v13_;
1892  const T14 v14_;
1893  const T15 v15_;
1894  const T16 v16_;
1895  const T17 v17_;
1896  const T18 v18_;
1897  const T19 v19_;
1898  const T20 v20_;
1899  const T21 v21_;
1900  const T22 v22_;
1901  const T23 v23_;
1902  const T24 v24_;
1903  const T25 v25_;
1904  const T26 v26_;
1905  const T27 v27_;
1906  const T28 v28_;
1907  const T29 v29_;
1908  const T30 v30_;
1909  const T31 v31_;
1910  const T32 v32_;
1911  const T33 v33_;
1912  const T34 v34_;
1913  const T35 v35_;
1914  const T36 v36_;
1915  const T37 v37_;
1916};
1917
1918template <typename T1, typename T2, typename T3, typename T4, typename T5,
1919    typename T6, typename T7, typename T8, typename T9, typename T10,
1920    typename T11, typename T12, typename T13, typename T14, typename T15,
1921    typename T16, typename T17, typename T18, typename T19, typename T20,
1922    typename T21, typename T22, typename T23, typename T24, typename T25,
1923    typename T26, typename T27, typename T28, typename T29, typename T30,
1924    typename T31, typename T32, typename T33, typename T34, typename T35,
1925    typename T36, typename T37, typename T38>
1926class ValueArray38 {
1927 public:
1928  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1929      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1930      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1931      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1932      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
1933      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1934      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1935      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1936      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1937      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1938      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
1939
1940  template <typename T>
1941  operator ParamGenerator<T>() const {
1942    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1943        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1944        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1945        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1946        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1947        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1948        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1949        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1950        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1951        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1952        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1953        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
1954        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
1955    return ValuesIn(array);
1956  }
1957
1958 private:
1959  // No implementation - assignment is unsupported.
1960  void operator=(const ValueArray38& other);
1961
1962  const T1 v1_;
1963  const T2 v2_;
1964  const T3 v3_;
1965  const T4 v4_;
1966  const T5 v5_;
1967  const T6 v6_;
1968  const T7 v7_;
1969  const T8 v8_;
1970  const T9 v9_;
1971  const T10 v10_;
1972  const T11 v11_;
1973  const T12 v12_;
1974  const T13 v13_;
1975  const T14 v14_;
1976  const T15 v15_;
1977  const T16 v16_;
1978  const T17 v17_;
1979  const T18 v18_;
1980  const T19 v19_;
1981  const T20 v20_;
1982  const T21 v21_;
1983  const T22 v22_;
1984  const T23 v23_;
1985  const T24 v24_;
1986  const T25 v25_;
1987  const T26 v26_;
1988  const T27 v27_;
1989  const T28 v28_;
1990  const T29 v29_;
1991  const T30 v30_;
1992  const T31 v31_;
1993  const T32 v32_;
1994  const T33 v33_;
1995  const T34 v34_;
1996  const T35 v35_;
1997  const T36 v36_;
1998  const T37 v37_;
1999  const T38 v38_;
2000};
2001
2002template <typename T1, typename T2, typename T3, typename T4, typename T5,
2003    typename T6, typename T7, typename T8, typename T9, typename T10,
2004    typename T11, typename T12, typename T13, typename T14, typename T15,
2005    typename T16, typename T17, typename T18, typename T19, typename T20,
2006    typename T21, typename T22, typename T23, typename T24, typename T25,
2007    typename T26, typename T27, typename T28, typename T29, typename T30,
2008    typename T31, typename T32, typename T33, typename T34, typename T35,
2009    typename T36, typename T37, typename T38, typename T39>
2010class ValueArray39 {
2011 public:
2012  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2013      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2014      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2015      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2016      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
2017      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2018      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2019      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2020      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2021      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2022      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
2023
2024  template <typename T>
2025  operator ParamGenerator<T>() const {
2026    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2027        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2028        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2029        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2030        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2031        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2032        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2033        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2034        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2035        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2036        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2037        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2038        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2039        static_cast<T>(v39_)};
2040    return ValuesIn(array);
2041  }
2042
2043 private:
2044  // No implementation - assignment is unsupported.
2045  void operator=(const ValueArray39& other);
2046
2047  const T1 v1_;
2048  const T2 v2_;
2049  const T3 v3_;
2050  const T4 v4_;
2051  const T5 v5_;
2052  const T6 v6_;
2053  const T7 v7_;
2054  const T8 v8_;
2055  const T9 v9_;
2056  const T10 v10_;
2057  const T11 v11_;
2058  const T12 v12_;
2059  const T13 v13_;
2060  const T14 v14_;
2061  const T15 v15_;
2062  const T16 v16_;
2063  const T17 v17_;
2064  const T18 v18_;
2065  const T19 v19_;
2066  const T20 v20_;
2067  const T21 v21_;
2068  const T22 v22_;
2069  const T23 v23_;
2070  const T24 v24_;
2071  const T25 v25_;
2072  const T26 v26_;
2073  const T27 v27_;
2074  const T28 v28_;
2075  const T29 v29_;
2076  const T30 v30_;
2077  const T31 v31_;
2078  const T32 v32_;
2079  const T33 v33_;
2080  const T34 v34_;
2081  const T35 v35_;
2082  const T36 v36_;
2083  const T37 v37_;
2084  const T38 v38_;
2085  const T39 v39_;
2086};
2087
2088template <typename T1, typename T2, typename T3, typename T4, typename T5,
2089    typename T6, typename T7, typename T8, typename T9, typename T10,
2090    typename T11, typename T12, typename T13, typename T14, typename T15,
2091    typename T16, typename T17, typename T18, typename T19, typename T20,
2092    typename T21, typename T22, typename T23, typename T24, typename T25,
2093    typename T26, typename T27, typename T28, typename T29, typename T30,
2094    typename T31, typename T32, typename T33, typename T34, typename T35,
2095    typename T36, typename T37, typename T38, typename T39, typename T40>
2096class ValueArray40 {
2097 public:
2098  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2099      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2100      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2101      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2102      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
2103      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2104      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2105      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2106      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2107      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2108      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2109      v40_(v40) {}
2110
2111  template <typename T>
2112  operator ParamGenerator<T>() const {
2113    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2114        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2115        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2116        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2117        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2118        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2119        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2120        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2121        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2122        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2123        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2124        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2125        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2126        static_cast<T>(v39_), static_cast<T>(v40_)};
2127    return ValuesIn(array);
2128  }
2129
2130 private:
2131  // No implementation - assignment is unsupported.
2132  void operator=(const ValueArray40& other);
2133
2134  const T1 v1_;
2135  const T2 v2_;
2136  const T3 v3_;
2137  const T4 v4_;
2138  const T5 v5_;
2139  const T6 v6_;
2140  const T7 v7_;
2141  const T8 v8_;
2142  const T9 v9_;
2143  const T10 v10_;
2144  const T11 v11_;
2145  const T12 v12_;
2146  const T13 v13_;
2147  const T14 v14_;
2148  const T15 v15_;
2149  const T16 v16_;
2150  const T17 v17_;
2151  const T18 v18_;
2152  const T19 v19_;
2153  const T20 v20_;
2154  const T21 v21_;
2155  const T22 v22_;
2156  const T23 v23_;
2157  const T24 v24_;
2158  const T25 v25_;
2159  const T26 v26_;
2160  const T27 v27_;
2161  const T28 v28_;
2162  const T29 v29_;
2163  const T30 v30_;
2164  const T31 v31_;
2165  const T32 v32_;
2166  const T33 v33_;
2167  const T34 v34_;
2168  const T35 v35_;
2169  const T36 v36_;
2170  const T37 v37_;
2171  const T38 v38_;
2172  const T39 v39_;
2173  const T40 v40_;
2174};
2175
2176template <typename T1, typename T2, typename T3, typename T4, typename T5,
2177    typename T6, typename T7, typename T8, typename T9, typename T10,
2178    typename T11, typename T12, typename T13, typename T14, typename T15,
2179    typename T16, typename T17, typename T18, typename T19, typename T20,
2180    typename T21, typename T22, typename T23, typename T24, typename T25,
2181    typename T26, typename T27, typename T28, typename T29, typename T30,
2182    typename T31, typename T32, typename T33, typename T34, typename T35,
2183    typename T36, typename T37, typename T38, typename T39, typename T40,
2184    typename T41>
2185class ValueArray41 {
2186 public:
2187  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2188      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2189      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2190      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2191      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
2192      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2193      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2194      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2195      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2196      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2197      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2198      v39_(v39), v40_(v40), v41_(v41) {}
2199
2200  template <typename T>
2201  operator ParamGenerator<T>() const {
2202    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2203        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2204        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2205        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2206        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2207        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2208        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2209        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2210        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2211        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2212        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2213        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2214        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2215        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
2216    return ValuesIn(array);
2217  }
2218
2219 private:
2220  // No implementation - assignment is unsupported.
2221  void operator=(const ValueArray41& other);
2222
2223  const T1 v1_;
2224  const T2 v2_;
2225  const T3 v3_;
2226  const T4 v4_;
2227  const T5 v5_;
2228  const T6 v6_;
2229  const T7 v7_;
2230  const T8 v8_;
2231  const T9 v9_;
2232  const T10 v10_;
2233  const T11 v11_;
2234  const T12 v12_;
2235  const T13 v13_;
2236  const T14 v14_;
2237  const T15 v15_;
2238  const T16 v16_;
2239  const T17 v17_;
2240  const T18 v18_;
2241  const T19 v19_;
2242  const T20 v20_;
2243  const T21 v21_;
2244  const T22 v22_;
2245  const T23 v23_;
2246  const T24 v24_;
2247  const T25 v25_;
2248  const T26 v26_;
2249  const T27 v27_;
2250  const T28 v28_;
2251  const T29 v29_;
2252  const T30 v30_;
2253  const T31 v31_;
2254  const T32 v32_;
2255  const T33 v33_;
2256  const T34 v34_;
2257  const T35 v35_;
2258  const T36 v36_;
2259  const T37 v37_;
2260  const T38 v38_;
2261  const T39 v39_;
2262  const T40 v40_;
2263  const T41 v41_;
2264};
2265
2266template <typename T1, typename T2, typename T3, typename T4, typename T5,
2267    typename T6, typename T7, typename T8, typename T9, typename T10,
2268    typename T11, typename T12, typename T13, typename T14, typename T15,
2269    typename T16, typename T17, typename T18, typename T19, typename T20,
2270    typename T21, typename T22, typename T23, typename T24, typename T25,
2271    typename T26, typename T27, typename T28, typename T29, typename T30,
2272    typename T31, typename T32, typename T33, typename T34, typename T35,
2273    typename T36, typename T37, typename T38, typename T39, typename T40,
2274    typename T41, typename T42>
2275class ValueArray42 {
2276 public:
2277  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2278      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2279      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2280      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2281      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2282      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2283      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2284      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2285      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2286      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2287      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2288      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
2289
2290  template <typename T>
2291  operator ParamGenerator<T>() const {
2292    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2293        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2294        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2295        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2296        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2297        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2298        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2299        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2300        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2301        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2302        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2303        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2304        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2305        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2306        static_cast<T>(v42_)};
2307    return ValuesIn(array);
2308  }
2309
2310 private:
2311  // No implementation - assignment is unsupported.
2312  void operator=(const ValueArray42& other);
2313
2314  const T1 v1_;
2315  const T2 v2_;
2316  const T3 v3_;
2317  const T4 v4_;
2318  const T5 v5_;
2319  const T6 v6_;
2320  const T7 v7_;
2321  const T8 v8_;
2322  const T9 v9_;
2323  const T10 v10_;
2324  const T11 v11_;
2325  const T12 v12_;
2326  const T13 v13_;
2327  const T14 v14_;
2328  const T15 v15_;
2329  const T16 v16_;
2330  const T17 v17_;
2331  const T18 v18_;
2332  const T19 v19_;
2333  const T20 v20_;
2334  const T21 v21_;
2335  const T22 v22_;
2336  const T23 v23_;
2337  const T24 v24_;
2338  const T25 v25_;
2339  const T26 v26_;
2340  const T27 v27_;
2341  const T28 v28_;
2342  const T29 v29_;
2343  const T30 v30_;
2344  const T31 v31_;
2345  const T32 v32_;
2346  const T33 v33_;
2347  const T34 v34_;
2348  const T35 v35_;
2349  const T36 v36_;
2350  const T37 v37_;
2351  const T38 v38_;
2352  const T39 v39_;
2353  const T40 v40_;
2354  const T41 v41_;
2355  const T42 v42_;
2356};
2357
2358template <typename T1, typename T2, typename T3, typename T4, typename T5,
2359    typename T6, typename T7, typename T8, typename T9, typename T10,
2360    typename T11, typename T12, typename T13, typename T14, typename T15,
2361    typename T16, typename T17, typename T18, typename T19, typename T20,
2362    typename T21, typename T22, typename T23, typename T24, typename T25,
2363    typename T26, typename T27, typename T28, typename T29, typename T30,
2364    typename T31, typename T32, typename T33, typename T34, typename T35,
2365    typename T36, typename T37, typename T38, typename T39, typename T40,
2366    typename T41, typename T42, typename T43>
2367class ValueArray43 {
2368 public:
2369  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2370      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2371      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2372      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2373      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2374      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
2375      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
2376      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
2377      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
2378      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
2379      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
2380      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
2381
2382  template <typename T>
2383  operator ParamGenerator<T>() const {
2384    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2385        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2386        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2387        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2388        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2389        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2390        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2391        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2392        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2393        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2394        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2395        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2396        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2397        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2398        static_cast<T>(v42_), static_cast<T>(v43_)};
2399    return ValuesIn(array);
2400  }
2401
2402 private:
2403  // No implementation - assignment is unsupported.
2404  void operator=(const ValueArray43& other);
2405
2406  const T1 v1_;
2407  const T2 v2_;
2408  const T3 v3_;
2409  const T4 v4_;
2410  const T5 v5_;
2411  const T6 v6_;
2412  const T7 v7_;
2413  const T8 v8_;
2414  const T9 v9_;
2415  const T10 v10_;
2416  const T11 v11_;
2417  const T12 v12_;
2418  const T13 v13_;
2419  const T14 v14_;
2420  const T15 v15_;
2421  const T16 v16_;
2422  const T17 v17_;
2423  const T18 v18_;
2424  const T19 v19_;
2425  const T20 v20_;
2426  const T21 v21_;
2427  const T22 v22_;
2428  const T23 v23_;
2429  const T24 v24_;
2430  const T25 v25_;
2431  const T26 v26_;
2432  const T27 v27_;
2433  const T28 v28_;
2434  const T29 v29_;
2435  const T30 v30_;
2436  const T31 v31_;
2437  const T32 v32_;
2438  const T33 v33_;
2439  const T34 v34_;
2440  const T35 v35_;
2441  const T36 v36_;
2442  const T37 v37_;
2443  const T38 v38_;
2444  const T39 v39_;
2445  const T40 v40_;
2446  const T41 v41_;
2447  const T42 v42_;
2448  const T43 v43_;
2449};
2450
2451template <typename T1, typename T2, typename T3, typename T4, typename T5,
2452    typename T6, typename T7, typename T8, typename T9, typename T10,
2453    typename T11, typename T12, typename T13, typename T14, typename T15,
2454    typename T16, typename T17, typename T18, typename T19, typename T20,
2455    typename T21, typename T22, typename T23, typename T24, typename T25,
2456    typename T26, typename T27, typename T28, typename T29, typename T30,
2457    typename T31, typename T32, typename T33, typename T34, typename T35,
2458    typename T36, typename T37, typename T38, typename T39, typename T40,
2459    typename T41, typename T42, typename T43, typename T44>
2460class ValueArray44 {
2461 public:
2462  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2463      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2464      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2465      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2466      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2467      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
2468      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
2469      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
2470      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
2471      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
2472      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
2473      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
2474      v43_(v43), v44_(v44) {}
2475
2476  template <typename T>
2477  operator ParamGenerator<T>() const {
2478    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2479        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2480        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2481        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2482        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2483        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2484        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2485        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2486        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2487        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2488        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2489        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2490        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2491        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2492        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
2493    return ValuesIn(array);
2494  }
2495
2496 private:
2497  // No implementation - assignment is unsupported.
2498  void operator=(const ValueArray44& other);
2499
2500  const T1 v1_;
2501  const T2 v2_;
2502  const T3 v3_;
2503  const T4 v4_;
2504  const T5 v5_;
2505  const T6 v6_;
2506  const T7 v7_;
2507  const T8 v8_;
2508  const T9 v9_;
2509  const T10 v10_;
2510  const T11 v11_;
2511  const T12 v12_;
2512  const T13 v13_;
2513  const T14 v14_;
2514  const T15 v15_;
2515  const T16 v16_;
2516  const T17 v17_;
2517  const T18 v18_;
2518  const T19 v19_;
2519  const T20 v20_;
2520  const T21 v21_;
2521  const T22 v22_;
2522  const T23 v23_;
2523  const T24 v24_;
2524  const T25 v25_;
2525  const T26 v26_;
2526  const T27 v27_;
2527  const T28 v28_;
2528  const T29 v29_;
2529  const T30 v30_;
2530  const T31 v31_;
2531  const T32 v32_;
2532  const T33 v33_;
2533  const T34 v34_;
2534  const T35 v35_;
2535  const T36 v36_;
2536  const T37 v37_;
2537  const T38 v38_;
2538  const T39 v39_;
2539  const T40 v40_;
2540  const T41 v41_;
2541  const T42 v42_;
2542  const T43 v43_;
2543  const T44 v44_;
2544};
2545
2546template <typename T1, typename T2, typename T3, typename T4, typename T5,
2547    typename T6, typename T7, typename T8, typename T9, typename T10,
2548    typename T11, typename T12, typename T13, typename T14, typename T15,
2549    typename T16, typename T17, typename T18, typename T19, typename T20,
2550    typename T21, typename T22, typename T23, typename T24, typename T25,
2551    typename T26, typename T27, typename T28, typename T29, typename T30,
2552    typename T31, typename T32, typename T33, typename T34, typename T35,
2553    typename T36, typename T37, typename T38, typename T39, typename T40,
2554    typename T41, typename T42, typename T43, typename T44, typename T45>
2555class ValueArray45 {
2556 public:
2557  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2558      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2559      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2560      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2561      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2562      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
2563      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
2564      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
2565      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
2566      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
2567      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
2568      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
2569      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
2570
2571  template <typename T>
2572  operator ParamGenerator<T>() const {
2573    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2574        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2575        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2576        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2577        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2578        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2579        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2580        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2581        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2582        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2583        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2584        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2585        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2586        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2587        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2588        static_cast<T>(v45_)};
2589    return ValuesIn(array);
2590  }
2591
2592 private:
2593  // No implementation - assignment is unsupported.
2594  void operator=(const ValueArray45& other);
2595
2596  const T1 v1_;
2597  const T2 v2_;
2598  const T3 v3_;
2599  const T4 v4_;
2600  const T5 v5_;
2601  const T6 v6_;
2602  const T7 v7_;
2603  const T8 v8_;
2604  const T9 v9_;
2605  const T10 v10_;
2606  const T11 v11_;
2607  const T12 v12_;
2608  const T13 v13_;
2609  const T14 v14_;
2610  const T15 v15_;
2611  const T16 v16_;
2612  const T17 v17_;
2613  const T18 v18_;
2614  const T19 v19_;
2615  const T20 v20_;
2616  const T21 v21_;
2617  const T22 v22_;
2618  const T23 v23_;
2619  const T24 v24_;
2620  const T25 v25_;
2621  const T26 v26_;
2622  const T27 v27_;
2623  const T28 v28_;
2624  const T29 v29_;
2625  const T30 v30_;
2626  const T31 v31_;
2627  const T32 v32_;
2628  const T33 v33_;
2629  const T34 v34_;
2630  const T35 v35_;
2631  const T36 v36_;
2632  const T37 v37_;
2633  const T38 v38_;
2634  const T39 v39_;
2635  const T40 v40_;
2636  const T41 v41_;
2637  const T42 v42_;
2638  const T43 v43_;
2639  const T44 v44_;
2640  const T45 v45_;
2641};
2642
2643template <typename T1, typename T2, typename T3, typename T4, typename T5,
2644    typename T6, typename T7, typename T8, typename T9, typename T10,
2645    typename T11, typename T12, typename T13, typename T14, typename T15,
2646    typename T16, typename T17, typename T18, typename T19, typename T20,
2647    typename T21, typename T22, typename T23, typename T24, typename T25,
2648    typename T26, typename T27, typename T28, typename T29, typename T30,
2649    typename T31, typename T32, typename T33, typename T34, typename T35,
2650    typename T36, typename T37, typename T38, typename T39, typename T40,
2651    typename T41, typename T42, typename T43, typename T44, typename T45,
2652    typename T46>
2653class ValueArray46 {
2654 public:
2655  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2656      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2657      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2658      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2659      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2660      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
2661      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2662      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2663      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2664      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2665      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2666      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2667      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
2668
2669  template <typename T>
2670  operator ParamGenerator<T>() const {
2671    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2672        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2673        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2674        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2675        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2676        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2677        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2678        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2679        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2680        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2681        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2682        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2683        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2684        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2685        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2686        static_cast<T>(v45_), static_cast<T>(v46_)};
2687    return ValuesIn(array);
2688  }
2689
2690 private:
2691  // No implementation - assignment is unsupported.
2692  void operator=(const ValueArray46& other);
2693
2694  const T1 v1_;
2695  const T2 v2_;
2696  const T3 v3_;
2697  const T4 v4_;
2698  const T5 v5_;
2699  const T6 v6_;
2700  const T7 v7_;
2701  const T8 v8_;
2702  const T9 v9_;
2703  const T10 v10_;
2704  const T11 v11_;
2705  const T12 v12_;
2706  const T13 v13_;
2707  const T14 v14_;
2708  const T15 v15_;
2709  const T16 v16_;
2710  const T17 v17_;
2711  const T18 v18_;
2712  const T19 v19_;
2713  const T20 v20_;
2714  const T21 v21_;
2715  const T22 v22_;
2716  const T23 v23_;
2717  const T24 v24_;
2718  const T25 v25_;
2719  const T26 v26_;
2720  const T27 v27_;
2721  const T28 v28_;
2722  const T29 v29_;
2723  const T30 v30_;
2724  const T31 v31_;
2725  const T32 v32_;
2726  const T33 v33_;
2727  const T34 v34_;
2728  const T35 v35_;
2729  const T36 v36_;
2730  const T37 v37_;
2731  const T38 v38_;
2732  const T39 v39_;
2733  const T40 v40_;
2734  const T41 v41_;
2735  const T42 v42_;
2736  const T43 v43_;
2737  const T44 v44_;
2738  const T45 v45_;
2739  const T46 v46_;
2740};
2741
2742template <typename T1, typename T2, typename T3, typename T4, typename T5,
2743    typename T6, typename T7, typename T8, typename T9, typename T10,
2744    typename T11, typename T12, typename T13, typename T14, typename T15,
2745    typename T16, typename T17, typename T18, typename T19, typename T20,
2746    typename T21, typename T22, typename T23, typename T24, typename T25,
2747    typename T26, typename T27, typename T28, typename T29, typename T30,
2748    typename T31, typename T32, typename T33, typename T34, typename T35,
2749    typename T36, typename T37, typename T38, typename T39, typename T40,
2750    typename T41, typename T42, typename T43, typename T44, typename T45,
2751    typename T46, typename T47>
2752class ValueArray47 {
2753 public:
2754  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2755      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2756      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2757      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2758      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2759      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
2760      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2761      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2762      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2763      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2764      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2765      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2766      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
2767      v47_(v47) {}
2768
2769  template <typename T>
2770  operator ParamGenerator<T>() const {
2771    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2772        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2773        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2774        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2775        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2776        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2777        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2778        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2779        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2780        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2781        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2782        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2783        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2784        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2785        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2786        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
2787    return ValuesIn(array);
2788  }
2789
2790 private:
2791  // No implementation - assignment is unsupported.
2792  void operator=(const ValueArray47& other);
2793
2794  const T1 v1_;
2795  const T2 v2_;
2796  const T3 v3_;
2797  const T4 v4_;
2798  const T5 v5_;
2799  const T6 v6_;
2800  const T7 v7_;
2801  const T8 v8_;
2802  const T9 v9_;
2803  const T10 v10_;
2804  const T11 v11_;
2805  const T12 v12_;
2806  const T13 v13_;
2807  const T14 v14_;
2808  const T15 v15_;
2809  const T16 v16_;
2810  const T17 v17_;
2811  const T18 v18_;
2812  const T19 v19_;
2813  const T20 v20_;
2814  const T21 v21_;
2815  const T22 v22_;
2816  const T23 v23_;
2817  const T24 v24_;
2818  const T25 v25_;
2819  const T26 v26_;
2820  const T27 v27_;
2821  const T28 v28_;
2822  const T29 v29_;
2823  const T30 v30_;
2824  const T31 v31_;
2825  const T32 v32_;
2826  const T33 v33_;
2827  const T34 v34_;
2828  const T35 v35_;
2829  const T36 v36_;
2830  const T37 v37_;
2831  const T38 v38_;
2832  const T39 v39_;
2833  const T40 v40_;
2834  const T41 v41_;
2835  const T42 v42_;
2836  const T43 v43_;
2837  const T44 v44_;
2838  const T45 v45_;
2839  const T46 v46_;
2840  const T47 v47_;
2841};
2842
2843template <typename T1, typename T2, typename T3, typename T4, typename T5,
2844    typename T6, typename T7, typename T8, typename T9, typename T10,
2845    typename T11, typename T12, typename T13, typename T14, typename T15,
2846    typename T16, typename T17, typename T18, typename T19, typename T20,
2847    typename T21, typename T22, typename T23, typename T24, typename T25,
2848    typename T26, typename T27, typename T28, typename T29, typename T30,
2849    typename T31, typename T32, typename T33, typename T34, typename T35,
2850    typename T36, typename T37, typename T38, typename T39, typename T40,
2851    typename T41, typename T42, typename T43, typename T44, typename T45,
2852    typename T46, typename T47, typename T48>
2853class ValueArray48 {
2854 public:
2855  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2856      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2857      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2858      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2859      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2860      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
2861      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2862      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2863      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2864      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2865      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2866      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2867      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
2868      v46_(v46), v47_(v47), v48_(v48) {}
2869
2870  template <typename T>
2871  operator ParamGenerator<T>() const {
2872    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2873        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2874        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2875        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2876        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2877        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2878        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2879        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2880        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2881        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2882        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2883        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2884        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2885        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2886        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2887        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
2888        static_cast<T>(v48_)};
2889    return ValuesIn(array);
2890  }
2891
2892 private:
2893  // No implementation - assignment is unsupported.
2894  void operator=(const ValueArray48& other);
2895
2896  const T1 v1_;
2897  const T2 v2_;
2898  const T3 v3_;
2899  const T4 v4_;
2900  const T5 v5_;
2901  const T6 v6_;
2902  const T7 v7_;
2903  const T8 v8_;
2904  const T9 v9_;
2905  const T10 v10_;
2906  const T11 v11_;
2907  const T12 v12_;
2908  const T13 v13_;
2909  const T14 v14_;
2910  const T15 v15_;
2911  const T16 v16_;
2912  const T17 v17_;
2913  const T18 v18_;
2914  const T19 v19_;
2915  const T20 v20_;
2916  const T21 v21_;
2917  const T22 v22_;
2918  const T23 v23_;
2919  const T24 v24_;
2920  const T25 v25_;
2921  const T26 v26_;
2922  const T27 v27_;
2923  const T28 v28_;
2924  const T29 v29_;
2925  const T30 v30_;
2926  const T31 v31_;
2927  const T32 v32_;
2928  const T33 v33_;
2929  const T34 v34_;
2930  const T35 v35_;
2931  const T36 v36_;
2932  const T37 v37_;
2933  const T38 v38_;
2934  const T39 v39_;
2935  const T40 v40_;
2936  const T41 v41_;
2937  const T42 v42_;
2938  const T43 v43_;
2939  const T44 v44_;
2940  const T45 v45_;
2941  const T46 v46_;
2942  const T47 v47_;
2943  const T48 v48_;
2944};
2945
2946template <typename T1, typename T2, typename T3, typename T4, typename T5,
2947    typename T6, typename T7, typename T8, typename T9, typename T10,
2948    typename T11, typename T12, typename T13, typename T14, typename T15,
2949    typename T16, typename T17, typename T18, typename T19, typename T20,
2950    typename T21, typename T22, typename T23, typename T24, typename T25,
2951    typename T26, typename T27, typename T28, typename T29, typename T30,
2952    typename T31, typename T32, typename T33, typename T34, typename T35,
2953    typename T36, typename T37, typename T38, typename T39, typename T40,
2954    typename T41, typename T42, typename T43, typename T44, typename T45,
2955    typename T46, typename T47, typename T48, typename T49>
2956class ValueArray49 {
2957 public:
2958  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2959      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2960      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2961      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2962      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2963      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
2964      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2965      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2966      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2967      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2968      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2969      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2970      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2971      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
2972
2973  template <typename T>
2974  operator ParamGenerator<T>() const {
2975    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2976        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2977        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2978        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2979        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2980        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2981        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2982        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2983        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2984        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2985        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2986        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2987        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2988        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2989        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2990        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
2991        static_cast<T>(v48_), static_cast<T>(v49_)};
2992    return ValuesIn(array);
2993  }
2994
2995 private:
2996  // No implementation - assignment is unsupported.
2997  void operator=(const ValueArray49& other);
2998
2999  const T1 v1_;
3000  const T2 v2_;
3001  const T3 v3_;
3002  const T4 v4_;
3003  const T5 v5_;
3004  const T6 v6_;
3005  const T7 v7_;
3006  const T8 v8_;
3007  const T9 v9_;
3008  const T10 v10_;
3009  const T11 v11_;
3010  const T12 v12_;
3011  const T13 v13_;
3012  const T14 v14_;
3013  const T15 v15_;
3014  const T16 v16_;
3015  const T17 v17_;
3016  const T18 v18_;
3017  const T19 v19_;
3018  const T20 v20_;
3019  const T21 v21_;
3020  const T22 v22_;
3021  const T23 v23_;
3022  const T24 v24_;
3023  const T25 v25_;
3024  const T26 v26_;
3025  const T27 v27_;
3026  const T28 v28_;
3027  const T29 v29_;
3028  const T30 v30_;
3029  const T31 v31_;
3030  const T32 v32_;
3031  const T33 v33_;
3032  const T34 v34_;
3033  const T35 v35_;
3034  const T36 v36_;
3035  const T37 v37_;
3036  const T38 v38_;
3037  const T39 v39_;
3038  const T40 v40_;
3039  const T41 v41_;
3040  const T42 v42_;
3041  const T43 v43_;
3042  const T44 v44_;
3043  const T45 v45_;
3044  const T46 v46_;
3045  const T47 v47_;
3046  const T48 v48_;
3047  const T49 v49_;
3048};
3049
3050template <typename T1, typename T2, typename T3, typename T4, typename T5,
3051    typename T6, typename T7, typename T8, typename T9, typename T10,
3052    typename T11, typename T12, typename T13, typename T14, typename T15,
3053    typename T16, typename T17, typename T18, typename T19, typename T20,
3054    typename T21, typename T22, typename T23, typename T24, typename T25,
3055    typename T26, typename T27, typename T28, typename T29, typename T30,
3056    typename T31, typename T32, typename T33, typename T34, typename T35,
3057    typename T36, typename T37, typename T38, typename T39, typename T40,
3058    typename T41, typename T42, typename T43, typename T44, typename T45,
3059    typename T46, typename T47, typename T48, typename T49, typename T50>
3060class ValueArray50 {
3061 public:
3062  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3063      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
3064      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
3065      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
3066      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
3067      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
3068      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
3069      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
3070      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
3071      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
3072      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
3073      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
3074      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
3075      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
3076
3077  template <typename T>
3078  operator ParamGenerator<T>() const {
3079    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
3080        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
3081        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
3082        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
3083        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
3084        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
3085        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
3086        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
3087        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
3088        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
3089        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
3090        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
3091        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
3092        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
3093        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
3094        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
3095        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
3096    return ValuesIn(array);
3097  }
3098
3099 private:
3100  // No implementation - assignment is unsupported.
3101  void operator=(const ValueArray50& other);
3102
3103  const T1 v1_;
3104  const T2 v2_;
3105  const T3 v3_;
3106  const T4 v4_;
3107  const T5 v5_;
3108  const T6 v6_;
3109  const T7 v7_;
3110  const T8 v8_;
3111  const T9 v9_;
3112  const T10 v10_;
3113  const T11 v11_;
3114  const T12 v12_;
3115  const T13 v13_;
3116  const T14 v14_;
3117  const T15 v15_;
3118  const T16 v16_;
3119  const T17 v17_;
3120  const T18 v18_;
3121  const T19 v19_;
3122  const T20 v20_;
3123  const T21 v21_;
3124  const T22 v22_;
3125  const T23 v23_;
3126  const T24 v24_;
3127  const T25 v25_;
3128  const T26 v26_;
3129  const T27 v27_;
3130  const T28 v28_;
3131  const T29 v29_;
3132  const T30 v30_;
3133  const T31 v31_;
3134  const T32 v32_;
3135  const T33 v33_;
3136  const T34 v34_;
3137  const T35 v35_;
3138  const T36 v36_;
3139  const T37 v37_;
3140  const T38 v38_;
3141  const T39 v39_;
3142  const T40 v40_;
3143  const T41 v41_;
3144  const T42 v42_;
3145  const T43 v43_;
3146  const T44 v44_;
3147  const T45 v45_;
3148  const T46 v46_;
3149  const T47 v47_;
3150  const T48 v48_;
3151  const T49 v49_;
3152  const T50 v50_;
3153};
3154
3155# if GTEST_HAS_COMBINE
3156// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
3157//
3158// Generates values from the Cartesian product of values produced
3159// by the argument generators.
3160//
3161template <typename T1, typename T2>
3162class CartesianProductGenerator2
3163    : public ParamGeneratorInterface< ::testing::tuple<T1, T2> > {
3164 public:
3165  typedef ::testing::tuple<T1, T2> ParamType;
3166
3167  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
3168      const ParamGenerator<T2>& g2)
3169      : g1_(g1), g2_(g2) {}
3170  virtual ~CartesianProductGenerator2() {}
3171
3172  virtual ParamIteratorInterface<ParamType>* Begin() const {
3173    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
3174  }
3175  virtual ParamIteratorInterface<ParamType>* End() const {
3176    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
3177  }
3178
3179 private:
3180  class Iterator : public ParamIteratorInterface<ParamType> {
3181   public:
3182    Iterator(const ParamGeneratorInterface<ParamType>* base,
3183      const ParamGenerator<T1>& g1,
3184      const typename ParamGenerator<T1>::iterator& current1,
3185      const ParamGenerator<T2>& g2,
3186      const typename ParamGenerator<T2>::iterator& current2)
3187        : base_(base),
3188          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3189          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
3190      ComputeCurrentValue();
3191    }
3192    virtual ~Iterator() {}
3193
3194    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3195      return base_;
3196    }
3197    // Advance should not be called on beyond-of-range iterators
3198    // so no component iterators must be beyond end of range, either.
3199    virtual void Advance() {
3200      assert(!AtEnd());
3201      ++current2_;
3202      if (current2_ == end2_) {
3203        current2_ = begin2_;
3204        ++current1_;
3205      }
3206      ComputeCurrentValue();
3207    }
3208    virtual ParamIteratorInterface<ParamType>* Clone() const {
3209      return new Iterator(*this);
3210    }
3211    virtual const ParamType* Current() const { return &current_value_; }
3212    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3213      // Having the same base generator guarantees that the other
3214      // iterator is of the same type and we can downcast.
3215      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3216          << "The program attempted to compare iterators "
3217          << "from different generators." << std::endl;
3218      const Iterator* typed_other =
3219          CheckedDowncastToActualType<const Iterator>(&other);
3220      // We must report iterators equal if they both point beyond their
3221      // respective ranges. That can happen in a variety of fashions,
3222      // so we have to consult AtEnd().
3223      return (AtEnd() && typed_other->AtEnd()) ||
3224         (
3225          current1_ == typed_other->current1_ &&
3226          current2_ == typed_other->current2_);
3227    }
3228
3229   private:
3230    Iterator(const Iterator& other)
3231        : base_(other.base_),
3232        begin1_(other.begin1_),
3233        end1_(other.end1_),
3234        current1_(other.current1_),
3235        begin2_(other.begin2_),
3236        end2_(other.end2_),
3237        current2_(other.current2_) {
3238      ComputeCurrentValue();
3239    }
3240
3241    void ComputeCurrentValue() {
3242      if (!AtEnd())
3243        current_value_ = ParamType(*current1_, *current2_);
3244    }
3245    bool AtEnd() const {
3246      // We must report iterator past the end of the range when either of the
3247      // component iterators has reached the end of its range.
3248      return
3249          current1_ == end1_ ||
3250          current2_ == end2_;
3251    }
3252
3253    // No implementation - assignment is unsupported.
3254    void operator=(const Iterator& other);
3255
3256    const ParamGeneratorInterface<ParamType>* const base_;
3257    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3258    // current[i]_ is the actual traversing iterator.
3259    const typename ParamGenerator<T1>::iterator begin1_;
3260    const typename ParamGenerator<T1>::iterator end1_;
3261    typename ParamGenerator<T1>::iterator current1_;
3262    const typename ParamGenerator<T2>::iterator begin2_;
3263    const typename ParamGenerator<T2>::iterator end2_;
3264    typename ParamGenerator<T2>::iterator current2_;
3265    ParamType current_value_;
3266  };  // class CartesianProductGenerator2::Iterator
3267
3268  // No implementation - assignment is unsupported.
3269  void operator=(const CartesianProductGenerator2& other);
3270
3271  const ParamGenerator<T1> g1_;
3272  const ParamGenerator<T2> g2_;
3273};  // class CartesianProductGenerator2
3274
3275
3276template <typename T1, typename T2, typename T3>
3277class CartesianProductGenerator3
3278    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3> > {
3279 public:
3280  typedef ::testing::tuple<T1, T2, T3> ParamType;
3281
3282  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
3283      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
3284      : g1_(g1), g2_(g2), g3_(g3) {}
3285  virtual ~CartesianProductGenerator3() {}
3286
3287  virtual ParamIteratorInterface<ParamType>* Begin() const {
3288    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3289        g3_.begin());
3290  }
3291  virtual ParamIteratorInterface<ParamType>* End() const {
3292    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
3293  }
3294
3295 private:
3296  class Iterator : public ParamIteratorInterface<ParamType> {
3297   public:
3298    Iterator(const ParamGeneratorInterface<ParamType>* base,
3299      const ParamGenerator<T1>& g1,
3300      const typename ParamGenerator<T1>::iterator& current1,
3301      const ParamGenerator<T2>& g2,
3302      const typename ParamGenerator<T2>::iterator& current2,
3303      const ParamGenerator<T3>& g3,
3304      const typename ParamGenerator<T3>::iterator& current3)
3305        : base_(base),
3306          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3307          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3308          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
3309      ComputeCurrentValue();
3310    }
3311    virtual ~Iterator() {}
3312
3313    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3314      return base_;
3315    }
3316    // Advance should not be called on beyond-of-range iterators
3317    // so no component iterators must be beyond end of range, either.
3318    virtual void Advance() {
3319      assert(!AtEnd());
3320      ++current3_;
3321      if (current3_ == end3_) {
3322        current3_ = begin3_;
3323        ++current2_;
3324      }
3325      if (current2_ == end2_) {
3326        current2_ = begin2_;
3327        ++current1_;
3328      }
3329      ComputeCurrentValue();
3330    }
3331    virtual ParamIteratorInterface<ParamType>* Clone() const {
3332      return new Iterator(*this);
3333    }
3334    virtual const ParamType* Current() const { return &current_value_; }
3335    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3336      // Having the same base generator guarantees that the other
3337      // iterator is of the same type and we can downcast.
3338      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3339          << "The program attempted to compare iterators "
3340          << "from different generators." << std::endl;
3341      const Iterator* typed_other =
3342          CheckedDowncastToActualType<const Iterator>(&other);
3343      // We must report iterators equal if they both point beyond their
3344      // respective ranges. That can happen in a variety of fashions,
3345      // so we have to consult AtEnd().
3346      return (AtEnd() && typed_other->AtEnd()) ||
3347         (
3348          current1_ == typed_other->current1_ &&
3349          current2_ == typed_other->current2_ &&
3350          current3_ == typed_other->current3_);
3351    }
3352
3353   private:
3354    Iterator(const Iterator& other)
3355        : base_(other.base_),
3356        begin1_(other.begin1_),
3357        end1_(other.end1_),
3358        current1_(other.current1_),
3359        begin2_(other.begin2_),
3360        end2_(other.end2_),
3361        current2_(other.current2_),
3362        begin3_(other.begin3_),
3363        end3_(other.end3_),
3364        current3_(other.current3_) {
3365      ComputeCurrentValue();
3366    }
3367
3368    void ComputeCurrentValue() {
3369      if (!AtEnd())
3370        current_value_ = ParamType(*current1_, *current2_, *current3_);
3371    }
3372    bool AtEnd() const {
3373      // We must report iterator past the end of the range when either of the
3374      // component iterators has reached the end of its range.
3375      return
3376          current1_ == end1_ ||
3377          current2_ == end2_ ||
3378          current3_ == end3_;
3379    }
3380
3381    // No implementation - assignment is unsupported.
3382    void operator=(const Iterator& other);
3383
3384    const ParamGeneratorInterface<ParamType>* const base_;
3385    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3386    // current[i]_ is the actual traversing iterator.
3387    const typename ParamGenerator<T1>::iterator begin1_;
3388    const typename ParamGenerator<T1>::iterator end1_;
3389    typename ParamGenerator<T1>::iterator current1_;
3390    const typename ParamGenerator<T2>::iterator begin2_;
3391    const typename ParamGenerator<T2>::iterator end2_;
3392    typename ParamGenerator<T2>::iterator current2_;
3393    const typename ParamGenerator<T3>::iterator begin3_;
3394    const typename ParamGenerator<T3>::iterator end3_;
3395    typename ParamGenerator<T3>::iterator current3_;
3396    ParamType current_value_;
3397  };  // class CartesianProductGenerator3::Iterator
3398
3399  // No implementation - assignment is unsupported.
3400  void operator=(const CartesianProductGenerator3& other);
3401
3402  const ParamGenerator<T1> g1_;
3403  const ParamGenerator<T2> g2_;
3404  const ParamGenerator<T3> g3_;
3405};  // class CartesianProductGenerator3
3406
3407
3408template <typename T1, typename T2, typename T3, typename T4>
3409class CartesianProductGenerator4
3410    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4> > {
3411 public:
3412  typedef ::testing::tuple<T1, T2, T3, T4> ParamType;
3413
3414  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
3415      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3416      const ParamGenerator<T4>& g4)
3417      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
3418  virtual ~CartesianProductGenerator4() {}
3419
3420  virtual ParamIteratorInterface<ParamType>* Begin() const {
3421    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3422        g3_.begin(), g4_, g4_.begin());
3423  }
3424  virtual ParamIteratorInterface<ParamType>* End() const {
3425    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3426        g4_, g4_.end());
3427  }
3428
3429 private:
3430  class Iterator : public ParamIteratorInterface<ParamType> {
3431   public:
3432    Iterator(const ParamGeneratorInterface<ParamType>* base,
3433      const ParamGenerator<T1>& g1,
3434      const typename ParamGenerator<T1>::iterator& current1,
3435      const ParamGenerator<T2>& g2,
3436      const typename ParamGenerator<T2>::iterator& current2,
3437      const ParamGenerator<T3>& g3,
3438      const typename ParamGenerator<T3>::iterator& current3,
3439      const ParamGenerator<T4>& g4,
3440      const typename ParamGenerator<T4>::iterator& current4)
3441        : base_(base),
3442          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3443          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3444          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3445          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
3446      ComputeCurrentValue();
3447    }
3448    virtual ~Iterator() {}
3449
3450    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3451      return base_;
3452    }
3453    // Advance should not be called on beyond-of-range iterators
3454    // so no component iterators must be beyond end of range, either.
3455    virtual void Advance() {
3456      assert(!AtEnd());
3457      ++current4_;
3458      if (current4_ == end4_) {
3459        current4_ = begin4_;
3460        ++current3_;
3461      }
3462      if (current3_ == end3_) {
3463        current3_ = begin3_;
3464        ++current2_;
3465      }
3466      if (current2_ == end2_) {
3467        current2_ = begin2_;
3468        ++current1_;
3469      }
3470      ComputeCurrentValue();
3471    }
3472    virtual ParamIteratorInterface<ParamType>* Clone() const {
3473      return new Iterator(*this);
3474    }
3475    virtual const ParamType* Current() const { return &current_value_; }
3476    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3477      // Having the same base generator guarantees that the other
3478      // iterator is of the same type and we can downcast.
3479      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3480          << "The program attempted to compare iterators "
3481          << "from different generators." << std::endl;
3482      const Iterator* typed_other =
3483          CheckedDowncastToActualType<const Iterator>(&other);
3484      // We must report iterators equal if they both point beyond their
3485      // respective ranges. That can happen in a variety of fashions,
3486      // so we have to consult AtEnd().
3487      return (AtEnd() && typed_other->AtEnd()) ||
3488         (
3489          current1_ == typed_other->current1_ &&
3490          current2_ == typed_other->current2_ &&
3491          current3_ == typed_other->current3_ &&
3492          current4_ == typed_other->current4_);
3493    }
3494
3495   private:
3496    Iterator(const Iterator& other)
3497        : base_(other.base_),
3498        begin1_(other.begin1_),
3499        end1_(other.end1_),
3500        current1_(other.current1_),
3501        begin2_(other.begin2_),
3502        end2_(other.end2_),
3503        current2_(other.current2_),
3504        begin3_(other.begin3_),
3505        end3_(other.end3_),
3506        current3_(other.current3_),
3507        begin4_(other.begin4_),
3508        end4_(other.end4_),
3509        current4_(other.current4_) {
3510      ComputeCurrentValue();
3511    }
3512
3513    void ComputeCurrentValue() {
3514      if (!AtEnd())
3515        current_value_ = ParamType(*current1_, *current2_, *current3_,
3516            *current4_);
3517    }
3518    bool AtEnd() const {
3519      // We must report iterator past the end of the range when either of the
3520      // component iterators has reached the end of its range.
3521      return
3522          current1_ == end1_ ||
3523          current2_ == end2_ ||
3524          current3_ == end3_ ||
3525          current4_ == end4_;
3526    }
3527
3528    // No implementation - assignment is unsupported.
3529    void operator=(const Iterator& other);
3530
3531    const ParamGeneratorInterface<ParamType>* const base_;
3532    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3533    // current[i]_ is the actual traversing iterator.
3534    const typename ParamGenerator<T1>::iterator begin1_;
3535    const typename ParamGenerator<T1>::iterator end1_;
3536    typename ParamGenerator<T1>::iterator current1_;
3537    const typename ParamGenerator<T2>::iterator begin2_;
3538    const typename ParamGenerator<T2>::iterator end2_;
3539    typename ParamGenerator<T2>::iterator current2_;
3540    const typename ParamGenerator<T3>::iterator begin3_;
3541    const typename ParamGenerator<T3>::iterator end3_;
3542    typename ParamGenerator<T3>::iterator current3_;
3543    const typename ParamGenerator<T4>::iterator begin4_;
3544    const typename ParamGenerator<T4>::iterator end4_;
3545    typename ParamGenerator<T4>::iterator current4_;
3546    ParamType current_value_;
3547  };  // class CartesianProductGenerator4::Iterator
3548
3549  // No implementation - assignment is unsupported.
3550  void operator=(const CartesianProductGenerator4& other);
3551
3552  const ParamGenerator<T1> g1_;
3553  const ParamGenerator<T2> g2_;
3554  const ParamGenerator<T3> g3_;
3555  const ParamGenerator<T4> g4_;
3556};  // class CartesianProductGenerator4
3557
3558
3559template <typename T1, typename T2, typename T3, typename T4, typename T5>
3560class CartesianProductGenerator5
3561    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5> > {
3562 public:
3563  typedef ::testing::tuple<T1, T2, T3, T4, T5> ParamType;
3564
3565  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
3566      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3567      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
3568      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
3569  virtual ~CartesianProductGenerator5() {}
3570
3571  virtual ParamIteratorInterface<ParamType>* Begin() const {
3572    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3573        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
3574  }
3575  virtual ParamIteratorInterface<ParamType>* End() const {
3576    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3577        g4_, g4_.end(), g5_, g5_.end());
3578  }
3579
3580 private:
3581  class Iterator : public ParamIteratorInterface<ParamType> {
3582   public:
3583    Iterator(const ParamGeneratorInterface<ParamType>* base,
3584      const ParamGenerator<T1>& g1,
3585      const typename ParamGenerator<T1>::iterator& current1,
3586      const ParamGenerator<T2>& g2,
3587      const typename ParamGenerator<T2>::iterator& current2,
3588      const ParamGenerator<T3>& g3,
3589      const typename ParamGenerator<T3>::iterator& current3,
3590      const ParamGenerator<T4>& g4,
3591      const typename ParamGenerator<T4>::iterator& current4,
3592      const ParamGenerator<T5>& g5,
3593      const typename ParamGenerator<T5>::iterator& current5)
3594        : base_(base),
3595          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3596          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3597          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3598          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3599          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
3600      ComputeCurrentValue();
3601    }
3602    virtual ~Iterator() {}
3603
3604    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3605      return base_;
3606    }
3607    // Advance should not be called on beyond-of-range iterators
3608    // so no component iterators must be beyond end of range, either.
3609    virtual void Advance() {
3610      assert(!AtEnd());
3611      ++current5_;
3612      if (current5_ == end5_) {
3613        current5_ = begin5_;
3614        ++current4_;
3615      }
3616      if (current4_ == end4_) {
3617        current4_ = begin4_;
3618        ++current3_;
3619      }
3620      if (current3_ == end3_) {
3621        current3_ = begin3_;
3622        ++current2_;
3623      }
3624      if (current2_ == end2_) {
3625        current2_ = begin2_;
3626        ++current1_;
3627      }
3628      ComputeCurrentValue();
3629    }
3630    virtual ParamIteratorInterface<ParamType>* Clone() const {
3631      return new Iterator(*this);
3632    }
3633    virtual const ParamType* Current() const { return &current_value_; }
3634    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3635      // Having the same base generator guarantees that the other
3636      // iterator is of the same type and we can downcast.
3637      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3638          << "The program attempted to compare iterators "
3639          << "from different generators." << std::endl;
3640      const Iterator* typed_other =
3641          CheckedDowncastToActualType<const Iterator>(&other);
3642      // We must report iterators equal if they both point beyond their
3643      // respective ranges. That can happen in a variety of fashions,
3644      // so we have to consult AtEnd().
3645      return (AtEnd() && typed_other->AtEnd()) ||
3646         (
3647          current1_ == typed_other->current1_ &&
3648          current2_ == typed_other->current2_ &&
3649          current3_ == typed_other->current3_ &&
3650          current4_ == typed_other->current4_ &&
3651          current5_ == typed_other->current5_);
3652    }
3653
3654   private:
3655    Iterator(const Iterator& other)
3656        : base_(other.base_),
3657        begin1_(other.begin1_),
3658        end1_(other.end1_),
3659        current1_(other.current1_),
3660        begin2_(other.begin2_),
3661        end2_(other.end2_),
3662        current2_(other.current2_),
3663        begin3_(other.begin3_),
3664        end3_(other.end3_),
3665        current3_(other.current3_),
3666        begin4_(other.begin4_),
3667        end4_(other.end4_),
3668        current4_(other.current4_),
3669        begin5_(other.begin5_),
3670        end5_(other.end5_),
3671        current5_(other.current5_) {
3672      ComputeCurrentValue();
3673    }
3674
3675    void ComputeCurrentValue() {
3676      if (!AtEnd())
3677        current_value_ = ParamType(*current1_, *current2_, *current3_,
3678            *current4_, *current5_);
3679    }
3680    bool AtEnd() const {
3681      // We must report iterator past the end of the range when either of the
3682      // component iterators has reached the end of its range.
3683      return
3684          current1_ == end1_ ||
3685          current2_ == end2_ ||
3686          current3_ == end3_ ||
3687          current4_ == end4_ ||
3688          current5_ == end5_;
3689    }
3690
3691    // No implementation - assignment is unsupported.
3692    void operator=(const Iterator& other);
3693
3694    const ParamGeneratorInterface<ParamType>* const base_;
3695    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3696    // current[i]_ is the actual traversing iterator.
3697    const typename ParamGenerator<T1>::iterator begin1_;
3698    const typename ParamGenerator<T1>::iterator end1_;
3699    typename ParamGenerator<T1>::iterator current1_;
3700    const typename ParamGenerator<T2>::iterator begin2_;
3701    const typename ParamGenerator<T2>::iterator end2_;
3702    typename ParamGenerator<T2>::iterator current2_;
3703    const typename ParamGenerator<T3>::iterator begin3_;
3704    const typename ParamGenerator<T3>::iterator end3_;
3705    typename ParamGenerator<T3>::iterator current3_;
3706    const typename ParamGenerator<T4>::iterator begin4_;
3707    const typename ParamGenerator<T4>::iterator end4_;
3708    typename ParamGenerator<T4>::iterator current4_;
3709    const typename ParamGenerator<T5>::iterator begin5_;
3710    const typename ParamGenerator<T5>::iterator end5_;
3711    typename ParamGenerator<T5>::iterator current5_;
3712    ParamType current_value_;
3713  };  // class CartesianProductGenerator5::Iterator
3714
3715  // No implementation - assignment is unsupported.
3716  void operator=(const CartesianProductGenerator5& other);
3717
3718  const ParamGenerator<T1> g1_;
3719  const ParamGenerator<T2> g2_;
3720  const ParamGenerator<T3> g3_;
3721  const ParamGenerator<T4> g4_;
3722  const ParamGenerator<T5> g5_;
3723};  // class CartesianProductGenerator5
3724
3725
3726template <typename T1, typename T2, typename T3, typename T4, typename T5,
3727    typename T6>
3728class CartesianProductGenerator6
3729    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5,
3730        T6> > {
3731 public:
3732  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6> ParamType;
3733
3734  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
3735      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3736      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3737      const ParamGenerator<T6>& g6)
3738      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
3739  virtual ~CartesianProductGenerator6() {}
3740
3741  virtual ParamIteratorInterface<ParamType>* Begin() const {
3742    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3743        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
3744  }
3745  virtual ParamIteratorInterface<ParamType>* End() const {
3746    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3747        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
3748  }
3749
3750 private:
3751  class Iterator : public ParamIteratorInterface<ParamType> {
3752   public:
3753    Iterator(const ParamGeneratorInterface<ParamType>* base,
3754      const ParamGenerator<T1>& g1,
3755      const typename ParamGenerator<T1>::iterator& current1,
3756      const ParamGenerator<T2>& g2,
3757      const typename ParamGenerator<T2>::iterator& current2,
3758      const ParamGenerator<T3>& g3,
3759      const typename ParamGenerator<T3>::iterator& current3,
3760      const ParamGenerator<T4>& g4,
3761      const typename ParamGenerator<T4>::iterator& current4,
3762      const ParamGenerator<T5>& g5,
3763      const typename ParamGenerator<T5>::iterator& current5,
3764      const ParamGenerator<T6>& g6,
3765      const typename ParamGenerator<T6>::iterator& current6)
3766        : base_(base),
3767          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3768          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3769          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3770          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3771          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3772          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
3773      ComputeCurrentValue();
3774    }
3775    virtual ~Iterator() {}
3776
3777    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3778      return base_;
3779    }
3780    // Advance should not be called on beyond-of-range iterators
3781    // so no component iterators must be beyond end of range, either.
3782    virtual void Advance() {
3783      assert(!AtEnd());
3784      ++current6_;
3785      if (current6_ == end6_) {
3786        current6_ = begin6_;
3787        ++current5_;
3788      }
3789      if (current5_ == end5_) {
3790        current5_ = begin5_;
3791        ++current4_;
3792      }
3793      if (current4_ == end4_) {
3794        current4_ = begin4_;
3795        ++current3_;
3796      }
3797      if (current3_ == end3_) {
3798        current3_ = begin3_;
3799        ++current2_;
3800      }
3801      if (current2_ == end2_) {
3802        current2_ = begin2_;
3803        ++current1_;
3804      }
3805      ComputeCurrentValue();
3806    }
3807    virtual ParamIteratorInterface<ParamType>* Clone() const {
3808      return new Iterator(*this);
3809    }
3810    virtual const ParamType* Current() const { return &current_value_; }
3811    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3812      // Having the same base generator guarantees that the other
3813      // iterator is of the same type and we can downcast.
3814      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3815          << "The program attempted to compare iterators "
3816          << "from different generators." << std::endl;
3817      const Iterator* typed_other =
3818          CheckedDowncastToActualType<const Iterator>(&other);
3819      // We must report iterators equal if they both point beyond their
3820      // respective ranges. That can happen in a variety of fashions,
3821      // so we have to consult AtEnd().
3822      return (AtEnd() && typed_other->AtEnd()) ||
3823         (
3824          current1_ == typed_other->current1_ &&
3825          current2_ == typed_other->current2_ &&
3826          current3_ == typed_other->current3_ &&
3827          current4_ == typed_other->current4_ &&
3828          current5_ == typed_other->current5_ &&
3829          current6_ == typed_other->current6_);
3830    }
3831
3832   private:
3833    Iterator(const Iterator& other)
3834        : base_(other.base_),
3835        begin1_(other.begin1_),
3836        end1_(other.end1_),
3837        current1_(other.current1_),
3838        begin2_(other.begin2_),
3839        end2_(other.end2_),
3840        current2_(other.current2_),
3841        begin3_(other.begin3_),
3842        end3_(other.end3_),
3843        current3_(other.current3_),
3844        begin4_(other.begin4_),
3845        end4_(other.end4_),
3846        current4_(other.current4_),
3847        begin5_(other.begin5_),
3848        end5_(other.end5_),
3849        current5_(other.current5_),
3850        begin6_(other.begin6_),
3851        end6_(other.end6_),
3852        current6_(other.current6_) {
3853      ComputeCurrentValue();
3854    }
3855
3856    void ComputeCurrentValue() {
3857      if (!AtEnd())
3858        current_value_ = ParamType(*current1_, *current2_, *current3_,
3859            *current4_, *current5_, *current6_);
3860    }
3861    bool AtEnd() const {
3862      // We must report iterator past the end of the range when either of the
3863      // component iterators has reached the end of its range.
3864      return
3865          current1_ == end1_ ||
3866          current2_ == end2_ ||
3867          current3_ == end3_ ||
3868          current4_ == end4_ ||
3869          current5_ == end5_ ||
3870          current6_ == end6_;
3871    }
3872
3873    // No implementation - assignment is unsupported.
3874    void operator=(const Iterator& other);
3875
3876    const ParamGeneratorInterface<ParamType>* const base_;
3877    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3878    // current[i]_ is the actual traversing iterator.
3879    const typename ParamGenerator<T1>::iterator begin1_;
3880    const typename ParamGenerator<T1>::iterator end1_;
3881    typename ParamGenerator<T1>::iterator current1_;
3882    const typename ParamGenerator<T2>::iterator begin2_;
3883    const typename ParamGenerator<T2>::iterator end2_;
3884    typename ParamGenerator<T2>::iterator current2_;
3885    const typename ParamGenerator<T3>::iterator begin3_;
3886    const typename ParamGenerator<T3>::iterator end3_;
3887    typename ParamGenerator<T3>::iterator current3_;
3888    const typename ParamGenerator<T4>::iterator begin4_;
3889    const typename ParamGenerator<T4>::iterator end4_;
3890    typename ParamGenerator<T4>::iterator current4_;
3891    const typename ParamGenerator<T5>::iterator begin5_;
3892    const typename ParamGenerator<T5>::iterator end5_;
3893    typename ParamGenerator<T5>::iterator current5_;
3894    const typename ParamGenerator<T6>::iterator begin6_;
3895    const typename ParamGenerator<T6>::iterator end6_;
3896    typename ParamGenerator<T6>::iterator current6_;
3897    ParamType current_value_;
3898  };  // class CartesianProductGenerator6::Iterator
3899
3900  // No implementation - assignment is unsupported.
3901  void operator=(const CartesianProductGenerator6& other);
3902
3903  const ParamGenerator<T1> g1_;
3904  const ParamGenerator<T2> g2_;
3905  const ParamGenerator<T3> g3_;
3906  const ParamGenerator<T4> g4_;
3907  const ParamGenerator<T5> g5_;
3908  const ParamGenerator<T6> g6_;
3909};  // class CartesianProductGenerator6
3910
3911
3912template <typename T1, typename T2, typename T3, typename T4, typename T5,
3913    typename T6, typename T7>
3914class CartesianProductGenerator7
3915    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
3916        T7> > {
3917 public:
3918  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
3919
3920  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
3921      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3922      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3923      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
3924      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
3925  virtual ~CartesianProductGenerator7() {}
3926
3927  virtual ParamIteratorInterface<ParamType>* Begin() const {
3928    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3929        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3930        g7_.begin());
3931  }
3932  virtual ParamIteratorInterface<ParamType>* End() const {
3933    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3934        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
3935  }
3936
3937 private:
3938  class Iterator : public ParamIteratorInterface<ParamType> {
3939   public:
3940    Iterator(const ParamGeneratorInterface<ParamType>* base,
3941      const ParamGenerator<T1>& g1,
3942      const typename ParamGenerator<T1>::iterator& current1,
3943      const ParamGenerator<T2>& g2,
3944      const typename ParamGenerator<T2>::iterator& current2,
3945      const ParamGenerator<T3>& g3,
3946      const typename ParamGenerator<T3>::iterator& current3,
3947      const ParamGenerator<T4>& g4,
3948      const typename ParamGenerator<T4>::iterator& current4,
3949      const ParamGenerator<T5>& g5,
3950      const typename ParamGenerator<T5>::iterator& current5,
3951      const ParamGenerator<T6>& g6,
3952      const typename ParamGenerator<T6>::iterator& current6,
3953      const ParamGenerator<T7>& g7,
3954      const typename ParamGenerator<T7>::iterator& current7)
3955        : base_(base),
3956          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3957          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3958          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3959          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3960          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3961          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3962          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
3963      ComputeCurrentValue();
3964    }
3965    virtual ~Iterator() {}
3966
3967    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3968      return base_;
3969    }
3970    // Advance should not be called on beyond-of-range iterators
3971    // so no component iterators must be beyond end of range, either.
3972    virtual void Advance() {
3973      assert(!AtEnd());
3974      ++current7_;
3975      if (current7_ == end7_) {
3976        current7_ = begin7_;
3977        ++current6_;
3978      }
3979      if (current6_ == end6_) {
3980        current6_ = begin6_;
3981        ++current5_;
3982      }
3983      if (current5_ == end5_) {
3984        current5_ = begin5_;
3985        ++current4_;
3986      }
3987      if (current4_ == end4_) {
3988        current4_ = begin4_;
3989        ++current3_;
3990      }
3991      if (current3_ == end3_) {
3992        current3_ = begin3_;
3993        ++current2_;
3994      }
3995      if (current2_ == end2_) {
3996        current2_ = begin2_;
3997        ++current1_;
3998      }
3999      ComputeCurrentValue();
4000    }
4001    virtual ParamIteratorInterface<ParamType>* Clone() const {
4002      return new Iterator(*this);
4003    }
4004    virtual const ParamType* Current() const { return &current_value_; }
4005    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4006      // Having the same base generator guarantees that the other
4007      // iterator is of the same type and we can downcast.
4008      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4009          << "The program attempted to compare iterators "
4010          << "from different generators." << std::endl;
4011      const Iterator* typed_other =
4012          CheckedDowncastToActualType<const Iterator>(&other);
4013      // We must report iterators equal if they both point beyond their
4014      // respective ranges. That can happen in a variety of fashions,
4015      // so we have to consult AtEnd().
4016      return (AtEnd() && typed_other->AtEnd()) ||
4017         (
4018          current1_ == typed_other->current1_ &&
4019          current2_ == typed_other->current2_ &&
4020          current3_ == typed_other->current3_ &&
4021          current4_ == typed_other->current4_ &&
4022          current5_ == typed_other->current5_ &&
4023          current6_ == typed_other->current6_ &&
4024          current7_ == typed_other->current7_);
4025    }
4026
4027   private:
4028    Iterator(const Iterator& other)
4029        : base_(other.base_),
4030        begin1_(other.begin1_),
4031        end1_(other.end1_),
4032        current1_(other.current1_),
4033        begin2_(other.begin2_),
4034        end2_(other.end2_),
4035        current2_(other.current2_),
4036        begin3_(other.begin3_),
4037        end3_(other.end3_),
4038        current3_(other.current3_),
4039        begin4_(other.begin4_),
4040        end4_(other.end4_),
4041        current4_(other.current4_),
4042        begin5_(other.begin5_),
4043        end5_(other.end5_),
4044        current5_(other.current5_),
4045        begin6_(other.begin6_),
4046        end6_(other.end6_),
4047        current6_(other.current6_),
4048        begin7_(other.begin7_),
4049        end7_(other.end7_),
4050        current7_(other.current7_) {
4051      ComputeCurrentValue();
4052    }
4053
4054    void ComputeCurrentValue() {
4055      if (!AtEnd())
4056        current_value_ = ParamType(*current1_, *current2_, *current3_,
4057            *current4_, *current5_, *current6_, *current7_);
4058    }
4059    bool AtEnd() const {
4060      // We must report iterator past the end of the range when either of the
4061      // component iterators has reached the end of its range.
4062      return
4063          current1_ == end1_ ||
4064          current2_ == end2_ ||
4065          current3_ == end3_ ||
4066          current4_ == end4_ ||
4067          current5_ == end5_ ||
4068          current6_ == end6_ ||
4069          current7_ == end7_;
4070    }
4071
4072    // No implementation - assignment is unsupported.
4073    void operator=(const Iterator& other);
4074
4075    const ParamGeneratorInterface<ParamType>* const base_;
4076    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4077    // current[i]_ is the actual traversing iterator.
4078    const typename ParamGenerator<T1>::iterator begin1_;
4079    const typename ParamGenerator<T1>::iterator end1_;
4080    typename ParamGenerator<T1>::iterator current1_;
4081    const typename ParamGenerator<T2>::iterator begin2_;
4082    const typename ParamGenerator<T2>::iterator end2_;
4083    typename ParamGenerator<T2>::iterator current2_;
4084    const typename ParamGenerator<T3>::iterator begin3_;
4085    const typename ParamGenerator<T3>::iterator end3_;
4086    typename ParamGenerator<T3>::iterator current3_;
4087    const typename ParamGenerator<T4>::iterator begin4_;
4088    const typename ParamGenerator<T4>::iterator end4_;
4089    typename ParamGenerator<T4>::iterator current4_;
4090    const typename ParamGenerator<T5>::iterator begin5_;
4091    const typename ParamGenerator<T5>::iterator end5_;
4092    typename ParamGenerator<T5>::iterator current5_;
4093    const typename ParamGenerator<T6>::iterator begin6_;
4094    const typename ParamGenerator<T6>::iterator end6_;
4095    typename ParamGenerator<T6>::iterator current6_;
4096    const typename ParamGenerator<T7>::iterator begin7_;
4097    const typename ParamGenerator<T7>::iterator end7_;
4098    typename ParamGenerator<T7>::iterator current7_;
4099    ParamType current_value_;
4100  };  // class CartesianProductGenerator7::Iterator
4101
4102  // No implementation - assignment is unsupported.
4103  void operator=(const CartesianProductGenerator7& other);
4104
4105  const ParamGenerator<T1> g1_;
4106  const ParamGenerator<T2> g2_;
4107  const ParamGenerator<T3> g3_;
4108  const ParamGenerator<T4> g4_;
4109  const ParamGenerator<T5> g5_;
4110  const ParamGenerator<T6> g6_;
4111  const ParamGenerator<T7> g7_;
4112};  // class CartesianProductGenerator7
4113
4114
4115template <typename T1, typename T2, typename T3, typename T4, typename T5,
4116    typename T6, typename T7, typename T8>
4117class CartesianProductGenerator8
4118    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
4119        T7, T8> > {
4120 public:
4121  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
4122
4123  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
4124      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4125      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4126      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4127      const ParamGenerator<T8>& g8)
4128      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
4129          g8_(g8) {}
4130  virtual ~CartesianProductGenerator8() {}
4131
4132  virtual ParamIteratorInterface<ParamType>* Begin() const {
4133    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4134        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4135        g7_.begin(), g8_, g8_.begin());
4136  }
4137  virtual ParamIteratorInterface<ParamType>* End() const {
4138    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4139        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4140        g8_.end());
4141  }
4142
4143 private:
4144  class Iterator : public ParamIteratorInterface<ParamType> {
4145   public:
4146    Iterator(const ParamGeneratorInterface<ParamType>* base,
4147      const ParamGenerator<T1>& g1,
4148      const typename ParamGenerator<T1>::iterator& current1,
4149      const ParamGenerator<T2>& g2,
4150      const typename ParamGenerator<T2>::iterator& current2,
4151      const ParamGenerator<T3>& g3,
4152      const typename ParamGenerator<T3>::iterator& current3,
4153      const ParamGenerator<T4>& g4,
4154      const typename ParamGenerator<T4>::iterator& current4,
4155      const ParamGenerator<T5>& g5,
4156      const typename ParamGenerator<T5>::iterator& current5,
4157      const ParamGenerator<T6>& g6,
4158      const typename ParamGenerator<T6>::iterator& current6,
4159      const ParamGenerator<T7>& g7,
4160      const typename ParamGenerator<T7>::iterator& current7,
4161      const ParamGenerator<T8>& g8,
4162      const typename ParamGenerator<T8>::iterator& current8)
4163        : base_(base),
4164          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4165          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4166          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4167          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4168          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4169          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4170          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4171          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
4172      ComputeCurrentValue();
4173    }
4174    virtual ~Iterator() {}
4175
4176    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4177      return base_;
4178    }
4179    // Advance should not be called on beyond-of-range iterators
4180    // so no component iterators must be beyond end of range, either.
4181    virtual void Advance() {
4182      assert(!AtEnd());
4183      ++current8_;
4184      if (current8_ == end8_) {
4185        current8_ = begin8_;
4186        ++current7_;
4187      }
4188      if (current7_ == end7_) {
4189        current7_ = begin7_;
4190        ++current6_;
4191      }
4192      if (current6_ == end6_) {
4193        current6_ = begin6_;
4194        ++current5_;
4195      }
4196      if (current5_ == end5_) {
4197        current5_ = begin5_;
4198        ++current4_;
4199      }
4200      if (current4_ == end4_) {
4201        current4_ = begin4_;
4202        ++current3_;
4203      }
4204      if (current3_ == end3_) {
4205        current3_ = begin3_;
4206        ++current2_;
4207      }
4208      if (current2_ == end2_) {
4209        current2_ = begin2_;
4210        ++current1_;
4211      }
4212      ComputeCurrentValue();
4213    }
4214    virtual ParamIteratorInterface<ParamType>* Clone() const {
4215      return new Iterator(*this);
4216    }
4217    virtual const ParamType* Current() const { return &current_value_; }
4218    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4219      // Having the same base generator guarantees that the other
4220      // iterator is of the same type and we can downcast.
4221      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4222          << "The program attempted to compare iterators "
4223          << "from different generators." << std::endl;
4224      const Iterator* typed_other =
4225          CheckedDowncastToActualType<const Iterator>(&other);
4226      // We must report iterators equal if they both point beyond their
4227      // respective ranges. That can happen in a variety of fashions,
4228      // so we have to consult AtEnd().
4229      return (AtEnd() && typed_other->AtEnd()) ||
4230         (
4231          current1_ == typed_other->current1_ &&
4232          current2_ == typed_other->current2_ &&
4233          current3_ == typed_other->current3_ &&
4234          current4_ == typed_other->current4_ &&
4235          current5_ == typed_other->current5_ &&
4236          current6_ == typed_other->current6_ &&
4237          current7_ == typed_other->current7_ &&
4238          current8_ == typed_other->current8_);
4239    }
4240
4241   private:
4242    Iterator(const Iterator& other)
4243        : base_(other.base_),
4244        begin1_(other.begin1_),
4245        end1_(other.end1_),
4246        current1_(other.current1_),
4247        begin2_(other.begin2_),
4248        end2_(other.end2_),
4249        current2_(other.current2_),
4250        begin3_(other.begin3_),
4251        end3_(other.end3_),
4252        current3_(other.current3_),
4253        begin4_(other.begin4_),
4254        end4_(other.end4_),
4255        current4_(other.current4_),
4256        begin5_(other.begin5_),
4257        end5_(other.end5_),
4258        current5_(other.current5_),
4259        begin6_(other.begin6_),
4260        end6_(other.end6_),
4261        current6_(other.current6_),
4262        begin7_(other.begin7_),
4263        end7_(other.end7_),
4264        current7_(other.current7_),
4265        begin8_(other.begin8_),
4266        end8_(other.end8_),
4267        current8_(other.current8_) {
4268      ComputeCurrentValue();
4269    }
4270
4271    void ComputeCurrentValue() {
4272      if (!AtEnd())
4273        current_value_ = ParamType(*current1_, *current2_, *current3_,
4274            *current4_, *current5_, *current6_, *current7_, *current8_);
4275    }
4276    bool AtEnd() const {
4277      // We must report iterator past the end of the range when either of the
4278      // component iterators has reached the end of its range.
4279      return
4280          current1_ == end1_ ||
4281          current2_ == end2_ ||
4282          current3_ == end3_ ||
4283          current4_ == end4_ ||
4284          current5_ == end5_ ||
4285          current6_ == end6_ ||
4286          current7_ == end7_ ||
4287          current8_ == end8_;
4288    }
4289
4290    // No implementation - assignment is unsupported.
4291    void operator=(const Iterator& other);
4292
4293    const ParamGeneratorInterface<ParamType>* const base_;
4294    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4295    // current[i]_ is the actual traversing iterator.
4296    const typename ParamGenerator<T1>::iterator begin1_;
4297    const typename ParamGenerator<T1>::iterator end1_;
4298    typename ParamGenerator<T1>::iterator current1_;
4299    const typename ParamGenerator<T2>::iterator begin2_;
4300    const typename ParamGenerator<T2>::iterator end2_;
4301    typename ParamGenerator<T2>::iterator current2_;
4302    const typename ParamGenerator<T3>::iterator begin3_;
4303    const typename ParamGenerator<T3>::iterator end3_;
4304    typename ParamGenerator<T3>::iterator current3_;
4305    const typename ParamGenerator<T4>::iterator begin4_;
4306    const typename ParamGenerator<T4>::iterator end4_;
4307    typename ParamGenerator<T4>::iterator current4_;
4308    const typename ParamGenerator<T5>::iterator begin5_;
4309    const typename ParamGenerator<T5>::iterator end5_;
4310    typename ParamGenerator<T5>::iterator current5_;
4311    const typename ParamGenerator<T6>::iterator begin6_;
4312    const typename ParamGenerator<T6>::iterator end6_;
4313    typename ParamGenerator<T6>::iterator current6_;
4314    const typename ParamGenerator<T7>::iterator begin7_;
4315    const typename ParamGenerator<T7>::iterator end7_;
4316    typename ParamGenerator<T7>::iterator current7_;
4317    const typename ParamGenerator<T8>::iterator begin8_;
4318    const typename ParamGenerator<T8>::iterator end8_;
4319    typename ParamGenerator<T8>::iterator current8_;
4320    ParamType current_value_;
4321  };  // class CartesianProductGenerator8::Iterator
4322
4323  // No implementation - assignment is unsupported.
4324  void operator=(const CartesianProductGenerator8& other);
4325
4326  const ParamGenerator<T1> g1_;
4327  const ParamGenerator<T2> g2_;
4328  const ParamGenerator<T3> g3_;
4329  const ParamGenerator<T4> g4_;
4330  const ParamGenerator<T5> g5_;
4331  const ParamGenerator<T6> g6_;
4332  const ParamGenerator<T7> g7_;
4333  const ParamGenerator<T8> g8_;
4334};  // class CartesianProductGenerator8
4335
4336
4337template <typename T1, typename T2, typename T3, typename T4, typename T5,
4338    typename T6, typename T7, typename T8, typename T9>
4339class CartesianProductGenerator9
4340    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
4341        T7, T8, T9> > {
4342 public:
4343  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
4344
4345  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
4346      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4347      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4348      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4349      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
4350      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4351          g9_(g9) {}
4352  virtual ~CartesianProductGenerator9() {}
4353
4354  virtual ParamIteratorInterface<ParamType>* Begin() const {
4355    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4356        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4357        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
4358  }
4359  virtual ParamIteratorInterface<ParamType>* End() const {
4360    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4361        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4362        g8_.end(), g9_, g9_.end());
4363  }
4364
4365 private:
4366  class Iterator : public ParamIteratorInterface<ParamType> {
4367   public:
4368    Iterator(const ParamGeneratorInterface<ParamType>* base,
4369      const ParamGenerator<T1>& g1,
4370      const typename ParamGenerator<T1>::iterator& current1,
4371      const ParamGenerator<T2>& g2,
4372      const typename ParamGenerator<T2>::iterator& current2,
4373      const ParamGenerator<T3>& g3,
4374      const typename ParamGenerator<T3>::iterator& current3,
4375      const ParamGenerator<T4>& g4,
4376      const typename ParamGenerator<T4>::iterator& current4,
4377      const ParamGenerator<T5>& g5,
4378      const typename ParamGenerator<T5>::iterator& current5,
4379      const ParamGenerator<T6>& g6,
4380      const typename ParamGenerator<T6>::iterator& current6,
4381      const ParamGenerator<T7>& g7,
4382      const typename ParamGenerator<T7>::iterator& current7,
4383      const ParamGenerator<T8>& g8,
4384      const typename ParamGenerator<T8>::iterator& current8,
4385      const ParamGenerator<T9>& g9,
4386      const typename ParamGenerator<T9>::iterator& current9)
4387        : base_(base),
4388          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4389          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4390          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4391          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4392          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4393          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4394          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4395          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4396          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
4397      ComputeCurrentValue();
4398    }
4399    virtual ~Iterator() {}
4400
4401    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4402      return base_;
4403    }
4404    // Advance should not be called on beyond-of-range iterators
4405    // so no component iterators must be beyond end of range, either.
4406    virtual void Advance() {
4407      assert(!AtEnd());
4408      ++current9_;
4409      if (current9_ == end9_) {
4410        current9_ = begin9_;
4411        ++current8_;
4412      }
4413      if (current8_ == end8_) {
4414        current8_ = begin8_;
4415        ++current7_;
4416      }
4417      if (current7_ == end7_) {
4418        current7_ = begin7_;
4419        ++current6_;
4420      }
4421      if (current6_ == end6_) {
4422        current6_ = begin6_;
4423        ++current5_;
4424      }
4425      if (current5_ == end5_) {
4426        current5_ = begin5_;
4427        ++current4_;
4428      }
4429      if (current4_ == end4_) {
4430        current4_ = begin4_;
4431        ++current3_;
4432      }
4433      if (current3_ == end3_) {
4434        current3_ = begin3_;
4435        ++current2_;
4436      }
4437      if (current2_ == end2_) {
4438        current2_ = begin2_;
4439        ++current1_;
4440      }
4441      ComputeCurrentValue();
4442    }
4443    virtual ParamIteratorInterface<ParamType>* Clone() const {
4444      return new Iterator(*this);
4445    }
4446    virtual const ParamType* Current() const { return &current_value_; }
4447    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4448      // Having the same base generator guarantees that the other
4449      // iterator is of the same type and we can downcast.
4450      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4451          << "The program attempted to compare iterators "
4452          << "from different generators." << std::endl;
4453      const Iterator* typed_other =
4454          CheckedDowncastToActualType<const Iterator>(&other);
4455      // We must report iterators equal if they both point beyond their
4456      // respective ranges. That can happen in a variety of fashions,
4457      // so we have to consult AtEnd().
4458      return (AtEnd() && typed_other->AtEnd()) ||
4459         (
4460          current1_ == typed_other->current1_ &&
4461          current2_ == typed_other->current2_ &&
4462          current3_ == typed_other->current3_ &&
4463          current4_ == typed_other->current4_ &&
4464          current5_ == typed_other->current5_ &&
4465          current6_ == typed_other->current6_ &&
4466          current7_ == typed_other->current7_ &&
4467          current8_ == typed_other->current8_ &&
4468          current9_ == typed_other->current9_);
4469    }
4470
4471   private:
4472    Iterator(const Iterator& other)
4473        : base_(other.base_),
4474        begin1_(other.begin1_),
4475        end1_(other.end1_),
4476        current1_(other.current1_),
4477        begin2_(other.begin2_),
4478        end2_(other.end2_),
4479        current2_(other.current2_),
4480        begin3_(other.begin3_),
4481        end3_(other.end3_),
4482        current3_(other.current3_),
4483        begin4_(other.begin4_),
4484        end4_(other.end4_),
4485        current4_(other.current4_),
4486        begin5_(other.begin5_),
4487        end5_(other.end5_),
4488        current5_(other.current5_),
4489        begin6_(other.begin6_),
4490        end6_(other.end6_),
4491        current6_(other.current6_),
4492        begin7_(other.begin7_),
4493        end7_(other.end7_),
4494        current7_(other.current7_),
4495        begin8_(other.begin8_),
4496        end8_(other.end8_),
4497        current8_(other.current8_),
4498        begin9_(other.begin9_),
4499        end9_(other.end9_),
4500        current9_(other.current9_) {
4501      ComputeCurrentValue();
4502    }
4503
4504    void ComputeCurrentValue() {
4505      if (!AtEnd())
4506        current_value_ = ParamType(*current1_, *current2_, *current3_,
4507            *current4_, *current5_, *current6_, *current7_, *current8_,
4508            *current9_);
4509    }
4510    bool AtEnd() const {
4511      // We must report iterator past the end of the range when either of the
4512      // component iterators has reached the end of its range.
4513      return
4514          current1_ == end1_ ||
4515          current2_ == end2_ ||
4516          current3_ == end3_ ||
4517          current4_ == end4_ ||
4518          current5_ == end5_ ||
4519          current6_ == end6_ ||
4520          current7_ == end7_ ||
4521          current8_ == end8_ ||
4522          current9_ == end9_;
4523    }
4524
4525    // No implementation - assignment is unsupported.
4526    void operator=(const Iterator& other);
4527
4528    const ParamGeneratorInterface<ParamType>* const base_;
4529    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4530    // current[i]_ is the actual traversing iterator.
4531    const typename ParamGenerator<T1>::iterator begin1_;
4532    const typename ParamGenerator<T1>::iterator end1_;
4533    typename ParamGenerator<T1>::iterator current1_;
4534    const typename ParamGenerator<T2>::iterator begin2_;
4535    const typename ParamGenerator<T2>::iterator end2_;
4536    typename ParamGenerator<T2>::iterator current2_;
4537    const typename ParamGenerator<T3>::iterator begin3_;
4538    const typename ParamGenerator<T3>::iterator end3_;
4539    typename ParamGenerator<T3>::iterator current3_;
4540    const typename ParamGenerator<T4>::iterator begin4_;
4541    const typename ParamGenerator<T4>::iterator end4_;
4542    typename ParamGenerator<T4>::iterator current4_;
4543    const typename ParamGenerator<T5>::iterator begin5_;
4544    const typename ParamGenerator<T5>::iterator end5_;
4545    typename ParamGenerator<T5>::iterator current5_;
4546    const typename ParamGenerator<T6>::iterator begin6_;
4547    const typename ParamGenerator<T6>::iterator end6_;
4548    typename ParamGenerator<T6>::iterator current6_;
4549    const typename ParamGenerator<T7>::iterator begin7_;
4550    const typename ParamGenerator<T7>::iterator end7_;
4551    typename ParamGenerator<T7>::iterator current7_;
4552    const typename ParamGenerator<T8>::iterator begin8_;
4553    const typename ParamGenerator<T8>::iterator end8_;
4554    typename ParamGenerator<T8>::iterator current8_;
4555    const typename ParamGenerator<T9>::iterator begin9_;
4556    const typename ParamGenerator<T9>::iterator end9_;
4557    typename ParamGenerator<T9>::iterator current9_;
4558    ParamType current_value_;
4559  };  // class CartesianProductGenerator9::Iterator
4560
4561  // No implementation - assignment is unsupported.
4562  void operator=(const CartesianProductGenerator9& other);
4563
4564  const ParamGenerator<T1> g1_;
4565  const ParamGenerator<T2> g2_;
4566  const ParamGenerator<T3> g3_;
4567  const ParamGenerator<T4> g4_;
4568  const ParamGenerator<T5> g5_;
4569  const ParamGenerator<T6> g6_;
4570  const ParamGenerator<T7> g7_;
4571  const ParamGenerator<T8> g8_;
4572  const ParamGenerator<T9> g9_;
4573};  // class CartesianProductGenerator9
4574
4575
4576template <typename T1, typename T2, typename T3, typename T4, typename T5,
4577    typename T6, typename T7, typename T8, typename T9, typename T10>
4578class CartesianProductGenerator10
4579    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
4580        T7, T8, T9, T10> > {
4581 public:
4582  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
4583
4584  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
4585      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4586      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4587      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4588      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
4589      const ParamGenerator<T10>& g10)
4590      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4591          g9_(g9), g10_(g10) {}
4592  virtual ~CartesianProductGenerator10() {}
4593
4594  virtual ParamIteratorInterface<ParamType>* Begin() const {
4595    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4596        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4597        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
4598  }
4599  virtual ParamIteratorInterface<ParamType>* End() const {
4600    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4601        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4602        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
4603  }
4604
4605 private:
4606  class Iterator : public ParamIteratorInterface<ParamType> {
4607   public:
4608    Iterator(const ParamGeneratorInterface<ParamType>* base,
4609      const ParamGenerator<T1>& g1,
4610      const typename ParamGenerator<T1>::iterator& current1,
4611      const ParamGenerator<T2>& g2,
4612      const typename ParamGenerator<T2>::iterator& current2,
4613      const ParamGenerator<T3>& g3,
4614      const typename ParamGenerator<T3>::iterator& current3,
4615      const ParamGenerator<T4>& g4,
4616      const typename ParamGenerator<T4>::iterator& current4,
4617      const ParamGenerator<T5>& g5,
4618      const typename ParamGenerator<T5>::iterator& current5,
4619      const ParamGenerator<T6>& g6,
4620      const typename ParamGenerator<T6>::iterator& current6,
4621      const ParamGenerator<T7>& g7,
4622      const typename ParamGenerator<T7>::iterator& current7,
4623      const ParamGenerator<T8>& g8,
4624      const typename ParamGenerator<T8>::iterator& current8,
4625      const ParamGenerator<T9>& g9,
4626      const typename ParamGenerator<T9>::iterator& current9,
4627      const ParamGenerator<T10>& g10,
4628      const typename ParamGenerator<T10>::iterator& current10)
4629        : base_(base),
4630          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4631          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4632          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4633          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4634          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4635          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4636          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4637          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4638          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
4639          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
4640      ComputeCurrentValue();
4641    }
4642    virtual ~Iterator() {}
4643
4644    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4645      return base_;
4646    }
4647    // Advance should not be called on beyond-of-range iterators
4648    // so no component iterators must be beyond end of range, either.
4649    virtual void Advance() {
4650      assert(!AtEnd());
4651      ++current10_;
4652      if (current10_ == end10_) {
4653        current10_ = begin10_;
4654        ++current9_;
4655      }
4656      if (current9_ == end9_) {
4657        current9_ = begin9_;
4658        ++current8_;
4659      }
4660      if (current8_ == end8_) {
4661        current8_ = begin8_;
4662        ++current7_;
4663      }
4664      if (current7_ == end7_) {
4665        current7_ = begin7_;
4666        ++current6_;
4667      }
4668      if (current6_ == end6_) {
4669        current6_ = begin6_;
4670        ++current5_;
4671      }
4672      if (current5_ == end5_) {
4673        current5_ = begin5_;
4674        ++current4_;
4675      }
4676      if (current4_ == end4_) {
4677        current4_ = begin4_;
4678        ++current3_;
4679      }
4680      if (current3_ == end3_) {
4681        current3_ = begin3_;
4682        ++current2_;
4683      }
4684      if (current2_ == end2_) {
4685        current2_ = begin2_;
4686        ++current1_;
4687      }
4688      ComputeCurrentValue();
4689    }
4690    virtual ParamIteratorInterface<ParamType>* Clone() const {
4691      return new Iterator(*this);
4692    }
4693    virtual const ParamType* Current() const { return &current_value_; }
4694    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4695      // Having the same base generator guarantees that the other
4696      // iterator is of the same type and we can downcast.
4697      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4698          << "The program attempted to compare iterators "
4699          << "from different generators." << std::endl;
4700      const Iterator* typed_other =
4701          CheckedDowncastToActualType<const Iterator>(&other);
4702      // We must report iterators equal if they both point beyond their
4703      // respective ranges. That can happen in a variety of fashions,
4704      // so we have to consult AtEnd().
4705      return (AtEnd() && typed_other->AtEnd()) ||
4706         (
4707          current1_ == typed_other->current1_ &&
4708          current2_ == typed_other->current2_ &&
4709          current3_ == typed_other->current3_ &&
4710          current4_ == typed_other->current4_ &&
4711          current5_ == typed_other->current5_ &&
4712          current6_ == typed_other->current6_ &&
4713          current7_ == typed_other->current7_ &&
4714          current8_ == typed_other->current8_ &&
4715          current9_ == typed_other->current9_ &&
4716          current10_ == typed_other->current10_);
4717    }
4718
4719   private:
4720    Iterator(const Iterator& other)
4721        : base_(other.base_),
4722        begin1_(other.begin1_),
4723        end1_(other.end1_),
4724        current1_(other.current1_),
4725        begin2_(other.begin2_),
4726        end2_(other.end2_),
4727        current2_(other.current2_),
4728        begin3_(other.begin3_),
4729        end3_(other.end3_),
4730        current3_(other.current3_),
4731        begin4_(other.begin4_),
4732        end4_(other.end4_),
4733        current4_(other.current4_),
4734        begin5_(other.begin5_),
4735        end5_(other.end5_),
4736        current5_(other.current5_),
4737        begin6_(other.begin6_),
4738        end6_(other.end6_),
4739        current6_(other.current6_),
4740        begin7_(other.begin7_),
4741        end7_(other.end7_),
4742        current7_(other.current7_),
4743        begin8_(other.begin8_),
4744        end8_(other.end8_),
4745        current8_(other.current8_),
4746        begin9_(other.begin9_),
4747        end9_(other.end9_),
4748        current9_(other.current9_),
4749        begin10_(other.begin10_),
4750        end10_(other.end10_),
4751        current10_(other.current10_) {
4752      ComputeCurrentValue();
4753    }
4754
4755    void ComputeCurrentValue() {
4756      if (!AtEnd())
4757        current_value_ = ParamType(*current1_, *current2_, *current3_,
4758            *current4_, *current5_, *current6_, *current7_, *current8_,
4759            *current9_, *current10_);
4760    }
4761    bool AtEnd() const {
4762      // We must report iterator past the end of the range when either of the
4763      // component iterators has reached the end of its range.
4764      return
4765          current1_ == end1_ ||
4766          current2_ == end2_ ||
4767          current3_ == end3_ ||
4768          current4_ == end4_ ||
4769          current5_ == end5_ ||
4770          current6_ == end6_ ||
4771          current7_ == end7_ ||
4772          current8_ == end8_ ||
4773          current9_ == end9_ ||
4774          current10_ == end10_;
4775    }
4776
4777    // No implementation - assignment is unsupported.
4778    void operator=(const Iterator& other);
4779
4780    const ParamGeneratorInterface<ParamType>* const base_;
4781    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4782    // current[i]_ is the actual traversing iterator.
4783    const typename ParamGenerator<T1>::iterator begin1_;
4784    const typename ParamGenerator<T1>::iterator end1_;
4785    typename ParamGenerator<T1>::iterator current1_;
4786    const typename ParamGenerator<T2>::iterator begin2_;
4787    const typename ParamGenerator<T2>::iterator end2_;
4788    typename ParamGenerator<T2>::iterator current2_;
4789    const typename ParamGenerator<T3>::iterator begin3_;
4790    const typename ParamGenerator<T3>::iterator end3_;
4791    typename ParamGenerator<T3>::iterator current3_;
4792    const typename ParamGenerator<T4>::iterator begin4_;
4793    const typename ParamGenerator<T4>::iterator end4_;
4794    typename ParamGenerator<T4>::iterator current4_;
4795    const typename ParamGenerator<T5>::iterator begin5_;
4796    const typename ParamGenerator<T5>::iterator end5_;
4797    typename ParamGenerator<T5>::iterator current5_;
4798    const typename ParamGenerator<T6>::iterator begin6_;
4799    const typename ParamGenerator<T6>::iterator end6_;
4800    typename ParamGenerator<T6>::iterator current6_;
4801    const typename ParamGenerator<T7>::iterator begin7_;
4802    const typename ParamGenerator<T7>::iterator end7_;
4803    typename ParamGenerator<T7>::iterator current7_;
4804    const typename ParamGenerator<T8>::iterator begin8_;
4805    const typename ParamGenerator<T8>::iterator end8_;
4806    typename ParamGenerator<T8>::iterator current8_;
4807    const typename ParamGenerator<T9>::iterator begin9_;
4808    const typename ParamGenerator<T9>::iterator end9_;
4809    typename ParamGenerator<T9>::iterator current9_;
4810    const typename ParamGenerator<T10>::iterator begin10_;
4811    const typename ParamGenerator<T10>::iterator end10_;
4812    typename ParamGenerator<T10>::iterator current10_;
4813    ParamType current_value_;
4814  };  // class CartesianProductGenerator10::Iterator
4815
4816  // No implementation - assignment is unsupported.
4817  void operator=(const CartesianProductGenerator10& other);
4818
4819  const ParamGenerator<T1> g1_;
4820  const ParamGenerator<T2> g2_;
4821  const ParamGenerator<T3> g3_;
4822  const ParamGenerator<T4> g4_;
4823  const ParamGenerator<T5> g5_;
4824  const ParamGenerator<T6> g6_;
4825  const ParamGenerator<T7> g7_;
4826  const ParamGenerator<T8> g8_;
4827  const ParamGenerator<T9> g9_;
4828  const ParamGenerator<T10> g10_;
4829};  // class CartesianProductGenerator10
4830
4831
4832// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
4833//
4834// Helper classes providing Combine() with polymorphic features. They allow
4835// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
4836// convertible to U.
4837//
4838template <class Generator1, class Generator2>
4839class CartesianProductHolder2 {
4840 public:
4841CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
4842      : g1_(g1), g2_(g2) {}
4843  template <typename T1, typename T2>
4844  operator ParamGenerator< ::testing::tuple<T1, T2> >() const {
4845    return ParamGenerator< ::testing::tuple<T1, T2> >(
4846        new CartesianProductGenerator2<T1, T2>(
4847        static_cast<ParamGenerator<T1> >(g1_),
4848        static_cast<ParamGenerator<T2> >(g2_)));
4849  }
4850
4851 private:
4852  // No implementation - assignment is unsupported.
4853  void operator=(const CartesianProductHolder2& other);
4854
4855  const Generator1 g1_;
4856  const Generator2 g2_;
4857};  // class CartesianProductHolder2
4858
4859template <class Generator1, class Generator2, class Generator3>
4860class CartesianProductHolder3 {
4861 public:
4862CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
4863    const Generator3& g3)
4864      : g1_(g1), g2_(g2), g3_(g3) {}
4865  template <typename T1, typename T2, typename T3>
4866  operator ParamGenerator< ::testing::tuple<T1, T2, T3> >() const {
4867    return ParamGenerator< ::testing::tuple<T1, T2, T3> >(
4868        new CartesianProductGenerator3<T1, T2, T3>(
4869        static_cast<ParamGenerator<T1> >(g1_),
4870        static_cast<ParamGenerator<T2> >(g2_),
4871        static_cast<ParamGenerator<T3> >(g3_)));
4872  }
4873
4874 private:
4875  // No implementation - assignment is unsupported.
4876  void operator=(const CartesianProductHolder3& other);
4877
4878  const Generator1 g1_;
4879  const Generator2 g2_;
4880  const Generator3 g3_;
4881};  // class CartesianProductHolder3
4882
4883template <class Generator1, class Generator2, class Generator3,
4884    class Generator4>
4885class CartesianProductHolder4 {
4886 public:
4887CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
4888    const Generator3& g3, const Generator4& g4)
4889      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
4890  template <typename T1, typename T2, typename T3, typename T4>
4891  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >() const {
4892    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >(
4893        new CartesianProductGenerator4<T1, T2, T3, T4>(
4894        static_cast<ParamGenerator<T1> >(g1_),
4895        static_cast<ParamGenerator<T2> >(g2_),
4896        static_cast<ParamGenerator<T3> >(g3_),
4897        static_cast<ParamGenerator<T4> >(g4_)));
4898  }
4899
4900 private:
4901  // No implementation - assignment is unsupported.
4902  void operator=(const CartesianProductHolder4& other);
4903
4904  const Generator1 g1_;
4905  const Generator2 g2_;
4906  const Generator3 g3_;
4907  const Generator4 g4_;
4908};  // class CartesianProductHolder4
4909
4910template <class Generator1, class Generator2, class Generator3,
4911    class Generator4, class Generator5>
4912class CartesianProductHolder5 {
4913 public:
4914CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
4915    const Generator3& g3, const Generator4& g4, const Generator5& g5)
4916      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
4917  template <typename T1, typename T2, typename T3, typename T4, typename T5>
4918  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >() const {
4919    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >(
4920        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
4921        static_cast<ParamGenerator<T1> >(g1_),
4922        static_cast<ParamGenerator<T2> >(g2_),
4923        static_cast<ParamGenerator<T3> >(g3_),
4924        static_cast<ParamGenerator<T4> >(g4_),
4925        static_cast<ParamGenerator<T5> >(g5_)));
4926  }
4927
4928 private:
4929  // No implementation - assignment is unsupported.
4930  void operator=(const CartesianProductHolder5& other);
4931
4932  const Generator1 g1_;
4933  const Generator2 g2_;
4934  const Generator3 g3_;
4935  const Generator4 g4_;
4936  const Generator5 g5_;
4937};  // class CartesianProductHolder5
4938
4939template <class Generator1, class Generator2, class Generator3,
4940    class Generator4, class Generator5, class Generator6>
4941class CartesianProductHolder6 {
4942 public:
4943CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
4944    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4945    const Generator6& g6)
4946      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
4947  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4948      typename T6>
4949  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >() const {
4950    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >(
4951        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
4952        static_cast<ParamGenerator<T1> >(g1_),
4953        static_cast<ParamGenerator<T2> >(g2_),
4954        static_cast<ParamGenerator<T3> >(g3_),
4955        static_cast<ParamGenerator<T4> >(g4_),
4956        static_cast<ParamGenerator<T5> >(g5_),
4957        static_cast<ParamGenerator<T6> >(g6_)));
4958  }
4959
4960 private:
4961  // No implementation - assignment is unsupported.
4962  void operator=(const CartesianProductHolder6& other);
4963
4964  const Generator1 g1_;
4965  const Generator2 g2_;
4966  const Generator3 g3_;
4967  const Generator4 g4_;
4968  const Generator5 g5_;
4969  const Generator6 g6_;
4970};  // class CartesianProductHolder6
4971
4972template <class Generator1, class Generator2, class Generator3,
4973    class Generator4, class Generator5, class Generator6, class Generator7>
4974class CartesianProductHolder7 {
4975 public:
4976CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
4977    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4978    const Generator6& g6, const Generator7& g7)
4979      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
4980  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4981      typename T6, typename T7>
4982  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6,
4983      T7> >() const {
4984    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> >(
4985        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
4986        static_cast<ParamGenerator<T1> >(g1_),
4987        static_cast<ParamGenerator<T2> >(g2_),
4988        static_cast<ParamGenerator<T3> >(g3_),
4989        static_cast<ParamGenerator<T4> >(g4_),
4990        static_cast<ParamGenerator<T5> >(g5_),
4991        static_cast<ParamGenerator<T6> >(g6_),
4992        static_cast<ParamGenerator<T7> >(g7_)));
4993  }
4994
4995 private:
4996  // No implementation - assignment is unsupported.
4997  void operator=(const CartesianProductHolder7& other);
4998
4999  const Generator1 g1_;
5000  const Generator2 g2_;
5001  const Generator3 g3_;
5002  const Generator4 g4_;
5003  const Generator5 g5_;
5004  const Generator6 g6_;
5005  const Generator7 g7_;
5006};  // class CartesianProductHolder7
5007
5008template <class Generator1, class Generator2, class Generator3,
5009    class Generator4, class Generator5, class Generator6, class Generator7,
5010    class Generator8>
5011class CartesianProductHolder8 {
5012 public:
5013CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
5014    const Generator3& g3, const Generator4& g4, const Generator5& g5,
5015    const Generator6& g6, const Generator7& g7, const Generator8& g8)
5016      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
5017          g8_(g8) {}
5018  template <typename T1, typename T2, typename T3, typename T4, typename T5,
5019      typename T6, typename T7, typename T8>
5020  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7,
5021      T8> >() const {
5022    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
5023        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
5024        static_cast<ParamGenerator<T1> >(g1_),
5025        static_cast<ParamGenerator<T2> >(g2_),
5026        static_cast<ParamGenerator<T3> >(g3_),
5027        static_cast<ParamGenerator<T4> >(g4_),
5028        static_cast<ParamGenerator<T5> >(g5_),
5029        static_cast<ParamGenerator<T6> >(g6_),
5030        static_cast<ParamGenerator<T7> >(g7_),
5031        static_cast<ParamGenerator<T8> >(g8_)));
5032  }
5033
5034 private:
5035  // No implementation - assignment is unsupported.
5036  void operator=(const CartesianProductHolder8& other);
5037
5038  const Generator1 g1_;
5039  const Generator2 g2_;
5040  const Generator3 g3_;
5041  const Generator4 g4_;
5042  const Generator5 g5_;
5043  const Generator6 g6_;
5044  const Generator7 g7_;
5045  const Generator8 g8_;
5046};  // class CartesianProductHolder8
5047
5048template <class Generator1, class Generator2, class Generator3,
5049    class Generator4, class Generator5, class Generator6, class Generator7,
5050    class Generator8, class Generator9>
5051class CartesianProductHolder9 {
5052 public:
5053CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
5054    const Generator3& g3, const Generator4& g4, const Generator5& g5,
5055    const Generator6& g6, const Generator7& g7, const Generator8& g8,
5056    const Generator9& g9)
5057      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
5058          g9_(g9) {}
5059  template <typename T1, typename T2, typename T3, typename T4, typename T5,
5060      typename T6, typename T7, typename T8, typename T9>
5061  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
5062      T9> >() const {
5063    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
5064        T9> >(
5065        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
5066        static_cast<ParamGenerator<T1> >(g1_),
5067        static_cast<ParamGenerator<T2> >(g2_),
5068        static_cast<ParamGenerator<T3> >(g3_),
5069        static_cast<ParamGenerator<T4> >(g4_),
5070        static_cast<ParamGenerator<T5> >(g5_),
5071        static_cast<ParamGenerator<T6> >(g6_),
5072        static_cast<ParamGenerator<T7> >(g7_),
5073        static_cast<ParamGenerator<T8> >(g8_),
5074        static_cast<ParamGenerator<T9> >(g9_)));
5075  }
5076
5077 private:
5078  // No implementation - assignment is unsupported.
5079  void operator=(const CartesianProductHolder9& other);
5080
5081  const Generator1 g1_;
5082  const Generator2 g2_;
5083  const Generator3 g3_;
5084  const Generator4 g4_;
5085  const Generator5 g5_;
5086  const Generator6 g6_;
5087  const Generator7 g7_;
5088  const Generator8 g8_;
5089  const Generator9 g9_;
5090};  // class CartesianProductHolder9
5091
5092template <class Generator1, class Generator2, class Generator3,
5093    class Generator4, class Generator5, class Generator6, class Generator7,
5094    class Generator8, class Generator9, class Generator10>
5095class CartesianProductHolder10 {
5096 public:
5097CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
5098    const Generator3& g3, const Generator4& g4, const Generator5& g5,
5099    const Generator6& g6, const Generator7& g7, const Generator8& g8,
5100    const Generator9& g9, const Generator10& g10)
5101      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
5102          g9_(g9), g10_(g10) {}
5103  template <typename T1, typename T2, typename T3, typename T4, typename T5,
5104      typename T6, typename T7, typename T8, typename T9, typename T10>
5105  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,
5106      T10> >() const {
5107    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,
5108        T10> >(
5109        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
5110            T10>(
5111        static_cast<ParamGenerator<T1> >(g1_),
5112        static_cast<ParamGenerator<T2> >(g2_),
5113        static_cast<ParamGenerator<T3> >(g3_),
5114        static_cast<ParamGenerator<T4> >(g4_),
5115        static_cast<ParamGenerator<T5> >(g5_),
5116        static_cast<ParamGenerator<T6> >(g6_),
5117        static_cast<ParamGenerator<T7> >(g7_),
5118        static_cast<ParamGenerator<T8> >(g8_),
5119        static_cast<ParamGenerator<T9> >(g9_),
5120        static_cast<ParamGenerator<T10> >(g10_)));
5121  }
5122
5123 private:
5124  // No implementation - assignment is unsupported.
5125  void operator=(const CartesianProductHolder10& other);
5126
5127  const Generator1 g1_;
5128  const Generator2 g2_;
5129  const Generator3 g3_;
5130  const Generator4 g4_;
5131  const Generator5 g5_;
5132  const Generator6 g6_;
5133  const Generator7 g7_;
5134  const Generator8 g8_;
5135  const Generator9 g9_;
5136  const Generator10 g10_;
5137};  // class CartesianProductHolder10
5138
5139# endif  // GTEST_HAS_COMBINE
5140
5141}  // namespace internal
5142}  // namespace testing
5143
5144#endif  //  GTEST_HAS_PARAM_TEST
5145
5146#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
5147