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