Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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