LCOV - code coverage report
Current view: top level - third_party/googletest/include/gtest/internal - gtest-param-util-generated.h (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 11 11 100.0 %
Date: 2015-10-10 Functions: 8 8 100.0 %

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

Generated by: LCOV version 1.10