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