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