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