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