Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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