source: gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h@ 12753

Last change on this file since 12753 was 12746, checked in by hock@…, 11 years ago

integrated the Google Testing Framework (gtest)

and wrote an Hello World test, to ensure the framework is working..

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