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


ros_opcua_impl_freeopcua
Author(s): Denis Štogl
autogenerated on Tue Jan 19 2021 03:06:16