gtest-param-util-generated.h
Go to the documentation of this file.
00001 // This file was GENERATED by command:
00002 //     pump.py gtest-param-util-generated.h.pump
00003 // DO NOT EDIT BY HAND!!!
00004 
00005 // Copyright 2008 Google Inc.
00006 // All Rights Reserved.
00007 //
00008 // Redistribution and use in source and binary forms, with or without
00009 // modification, are permitted provided that the following conditions are
00010 // met:
00011 //
00012 //     * Redistributions of source code must retain the above copyright
00013 // notice, this list of conditions and the following disclaimer.
00014 //     * Redistributions in binary form must reproduce the above
00015 // copyright notice, this list of conditions and the following disclaimer
00016 // in the documentation and/or other materials provided with the
00017 // distribution.
00018 //     * Neither the name of Google Inc. nor the names of its
00019 // contributors may be used to endorse or promote products derived from
00020 // this software without specific prior written permission.
00021 //
00022 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00023 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00024 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00025 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00026 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00027 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00028 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00029 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00030 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00031 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00032 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 //
00034 // Author: vladl@google.com (Vlad Losev)
00035 
00036 // Type and function utilities for implementing parameterized tests.
00037 // This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
00038 //
00039 // Currently Google Test supports at most 50 arguments in Values,
00040 // and at most 10 arguments in Combine. Please contact
00041 // googletestframework@googlegroups.com if you need more.
00042 // Please note that the number of arguments to Combine is limited
00043 // by the maximum arity of the implementation of tr1::tuple which is
00044 // currently set at 10.
00045 
00046 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
00047 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
00048 
00049 // scripts/fuse_gtest.py depends on gtest's own header being #included
00050 // *unconditionally*.  Therefore these #includes cannot be moved
00051 // inside #if GTEST_HAS_PARAM_TEST.
00052 #include "gtest/internal/gtest-param-util.h"
00053 #include "gtest/internal/gtest-port.h"
00054 
00055 #if GTEST_HAS_PARAM_TEST
00056 
00057 namespace testing {
00058 
00059 // Forward declarations of ValuesIn(), which is implemented in
00060 // include/gtest/gtest-param-test.h.
00061 template <typename ForwardIterator>
00062 internal::ParamGenerator<
00063   typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
00064 ValuesIn(ForwardIterator begin, ForwardIterator end);
00065 
00066 template <typename T, size_t N>
00067 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
00068 
00069 template <class Container>
00070 internal::ParamGenerator<typename Container::value_type> ValuesIn(
00071     const Container& container);
00072 
00073 namespace internal {
00074 
00075 // Used in the Values() function to provide polymorphic capabilities.
00076 template <typename T1>
00077 class ValueArray1 {
00078  public:
00079   explicit ValueArray1(T1 v1) : v1_(v1) {}
00080 
00081   template <typename T>
00082   operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
00083 
00084  private:
00085   // No implementation - assignment is unsupported.
00086   void operator=(const ValueArray1& other);
00087 
00088   const T1 v1_;
00089 };
00090 
00091 template <typename T1, typename T2>
00092 class ValueArray2 {
00093  public:
00094   ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
00095 
00096   template <typename T>
00097   operator ParamGenerator<T>() const {
00098     const T array[] = {v1_, v2_};
00099     return ValuesIn(array);
00100   }
00101 
00102  private:
00103   // No implementation - assignment is unsupported.
00104   void operator=(const ValueArray2& other);
00105 
00106   const T1 v1_;
00107   const T2 v2_;
00108 };
00109 
00110 template <typename T1, typename T2, typename T3>
00111 class ValueArray3 {
00112  public:
00113   ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
00114 
00115   template <typename T>
00116   operator ParamGenerator<T>() const {
00117     const T array[] = {v1_, v2_, v3_};
00118     return ValuesIn(array);
00119   }
00120 
00121  private:
00122   // No implementation - assignment is unsupported.
00123   void operator=(const ValueArray3& other);
00124 
00125   const T1 v1_;
00126   const T2 v2_;
00127   const T3 v3_;
00128 };
00129 
00130 template <typename T1, typename T2, typename T3, typename T4>
00131 class ValueArray4 {
00132  public:
00133   ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
00134       v4_(v4) {}
00135 
00136   template <typename T>
00137   operator ParamGenerator<T>() const {
00138     const T array[] = {v1_, v2_, v3_, v4_};
00139     return ValuesIn(array);
00140   }
00141 
00142  private:
00143   // No implementation - assignment is unsupported.
00144   void operator=(const ValueArray4& other);
00145 
00146   const T1 v1_;
00147   const T2 v2_;
00148   const T3 v3_;
00149   const T4 v4_;
00150 };
00151 
00152 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00153 class ValueArray5 {
00154  public:
00155   ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
00156       v4_(v4), v5_(v5) {}
00157 
00158   template <typename T>
00159   operator ParamGenerator<T>() const {
00160     const T array[] = {v1_, v2_, v3_, v4_, v5_};
00161     return ValuesIn(array);
00162   }
00163 
00164  private:
00165   // No implementation - assignment is unsupported.
00166   void operator=(const ValueArray5& other);
00167 
00168   const T1 v1_;
00169   const T2 v2_;
00170   const T3 v3_;
00171   const T4 v4_;
00172   const T5 v5_;
00173 };
00174 
00175 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00176     typename T6>
00177 class ValueArray6 {
00178  public:
00179   ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
00180       v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
00181 
00182   template <typename T>
00183   operator ParamGenerator<T>() const {
00184     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
00185     return ValuesIn(array);
00186   }
00187 
00188  private:
00189   // No implementation - assignment is unsupported.
00190   void operator=(const ValueArray6& other);
00191 
00192   const T1 v1_;
00193   const T2 v2_;
00194   const T3 v3_;
00195   const T4 v4_;
00196   const T5 v5_;
00197   const T6 v6_;
00198 };
00199 
00200 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00201     typename T6, typename T7>
00202 class ValueArray7 {
00203  public:
00204   ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
00205       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
00206 
00207   template <typename T>
00208   operator ParamGenerator<T>() const {
00209     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
00210     return ValuesIn(array);
00211   }
00212 
00213  private:
00214   // No implementation - assignment is unsupported.
00215   void operator=(const ValueArray7& other);
00216 
00217   const T1 v1_;
00218   const T2 v2_;
00219   const T3 v3_;
00220   const T4 v4_;
00221   const T5 v5_;
00222   const T6 v6_;
00223   const T7 v7_;
00224 };
00225 
00226 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00227     typename T6, typename T7, typename T8>
00228 class ValueArray8 {
00229  public:
00230   ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
00231       T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00232       v8_(v8) {}
00233 
00234   template <typename T>
00235   operator ParamGenerator<T>() const {
00236     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
00237     return ValuesIn(array);
00238   }
00239 
00240  private:
00241   // No implementation - assignment is unsupported.
00242   void operator=(const ValueArray8& other);
00243 
00244   const T1 v1_;
00245   const T2 v2_;
00246   const T3 v3_;
00247   const T4 v4_;
00248   const T5 v5_;
00249   const T6 v6_;
00250   const T7 v7_;
00251   const T8 v8_;
00252 };
00253 
00254 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00255     typename T6, typename T7, typename T8, typename T9>
00256 class ValueArray9 {
00257  public:
00258   ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
00259       T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00260       v8_(v8), v9_(v9) {}
00261 
00262   template <typename T>
00263   operator ParamGenerator<T>() const {
00264     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
00265     return ValuesIn(array);
00266   }
00267 
00268  private:
00269   // No implementation - assignment is unsupported.
00270   void operator=(const ValueArray9& other);
00271 
00272   const T1 v1_;
00273   const T2 v2_;
00274   const T3 v3_;
00275   const T4 v4_;
00276   const T5 v5_;
00277   const T6 v6_;
00278   const T7 v7_;
00279   const T8 v8_;
00280   const T9 v9_;
00281 };
00282 
00283 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00284     typename T6, typename T7, typename T8, typename T9, typename T10>
00285 class ValueArray10 {
00286  public:
00287   ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00288       T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00289       v8_(v8), v9_(v9), v10_(v10) {}
00290 
00291   template <typename T>
00292   operator ParamGenerator<T>() const {
00293     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
00294     return ValuesIn(array);
00295   }
00296 
00297  private:
00298   // No implementation - assignment is unsupported.
00299   void operator=(const ValueArray10& other);
00300 
00301   const T1 v1_;
00302   const T2 v2_;
00303   const T3 v3_;
00304   const T4 v4_;
00305   const T5 v5_;
00306   const T6 v6_;
00307   const T7 v7_;
00308   const T8 v8_;
00309   const T9 v9_;
00310   const T10 v10_;
00311 };
00312 
00313 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00314     typename T6, typename T7, typename T8, typename T9, typename T10,
00315     typename T11>
00316 class ValueArray11 {
00317  public:
00318   ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00319       T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
00320       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
00321 
00322   template <typename T>
00323   operator ParamGenerator<T>() const {
00324     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
00325     return ValuesIn(array);
00326   }
00327 
00328  private:
00329   // No implementation - assignment is unsupported.
00330   void operator=(const ValueArray11& other);
00331 
00332   const T1 v1_;
00333   const T2 v2_;
00334   const T3 v3_;
00335   const T4 v4_;
00336   const T5 v5_;
00337   const T6 v6_;
00338   const T7 v7_;
00339   const T8 v8_;
00340   const T9 v9_;
00341   const T10 v10_;
00342   const T11 v11_;
00343 };
00344 
00345 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00346     typename T6, typename T7, typename T8, typename T9, typename T10,
00347     typename T11, typename T12>
00348 class ValueArray12 {
00349  public:
00350   ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00351       T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
00352       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
00353 
00354   template <typename T>
00355   operator ParamGenerator<T>() const {
00356     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00357         v12_};
00358     return ValuesIn(array);
00359   }
00360 
00361  private:
00362   // No implementation - assignment is unsupported.
00363   void operator=(const ValueArray12& other);
00364 
00365   const T1 v1_;
00366   const T2 v2_;
00367   const T3 v3_;
00368   const T4 v4_;
00369   const T5 v5_;
00370   const T6 v6_;
00371   const T7 v7_;
00372   const T8 v8_;
00373   const T9 v9_;
00374   const T10 v10_;
00375   const T11 v11_;
00376   const T12 v12_;
00377 };
00378 
00379 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00380     typename T6, typename T7, typename T8, typename T9, typename T10,
00381     typename T11, typename T12, typename T13>
00382 class ValueArray13 {
00383  public:
00384   ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00385       T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
00386       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
00387       v12_(v12), v13_(v13) {}
00388 
00389   template <typename T>
00390   operator ParamGenerator<T>() const {
00391     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00392         v12_, v13_};
00393     return ValuesIn(array);
00394   }
00395 
00396  private:
00397   // No implementation - assignment is unsupported.
00398   void operator=(const ValueArray13& other);
00399 
00400   const T1 v1_;
00401   const T2 v2_;
00402   const T3 v3_;
00403   const T4 v4_;
00404   const T5 v5_;
00405   const T6 v6_;
00406   const T7 v7_;
00407   const T8 v8_;
00408   const T9 v9_;
00409   const T10 v10_;
00410   const T11 v11_;
00411   const T12 v12_;
00412   const T13 v13_;
00413 };
00414 
00415 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00416     typename T6, typename T7, typename T8, typename T9, typename T10,
00417     typename T11, typename T12, typename T13, typename T14>
00418 class ValueArray14 {
00419  public:
00420   ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00421       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
00422       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
00423       v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
00424 
00425   template <typename T>
00426   operator ParamGenerator<T>() const {
00427     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00428         v12_, v13_, v14_};
00429     return ValuesIn(array);
00430   }
00431 
00432  private:
00433   // No implementation - assignment is unsupported.
00434   void operator=(const ValueArray14& other);
00435 
00436   const T1 v1_;
00437   const T2 v2_;
00438   const T3 v3_;
00439   const T4 v4_;
00440   const T5 v5_;
00441   const T6 v6_;
00442   const T7 v7_;
00443   const T8 v8_;
00444   const T9 v9_;
00445   const T10 v10_;
00446   const T11 v11_;
00447   const T12 v12_;
00448   const T13 v13_;
00449   const T14 v14_;
00450 };
00451 
00452 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00453     typename T6, typename T7, typename T8, typename T9, typename T10,
00454     typename T11, typename T12, typename T13, typename T14, typename T15>
00455 class ValueArray15 {
00456  public:
00457   ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00458       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
00459       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
00460       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
00461 
00462   template <typename T>
00463   operator ParamGenerator<T>() const {
00464     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00465         v12_, v13_, v14_, v15_};
00466     return ValuesIn(array);
00467   }
00468 
00469  private:
00470   // No implementation - assignment is unsupported.
00471   void operator=(const ValueArray15& other);
00472 
00473   const T1 v1_;
00474   const T2 v2_;
00475   const T3 v3_;
00476   const T4 v4_;
00477   const T5 v5_;
00478   const T6 v6_;
00479   const T7 v7_;
00480   const T8 v8_;
00481   const T9 v9_;
00482   const T10 v10_;
00483   const T11 v11_;
00484   const T12 v12_;
00485   const T13 v13_;
00486   const T14 v14_;
00487   const T15 v15_;
00488 };
00489 
00490 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00491     typename T6, typename T7, typename T8, typename T9, typename T10,
00492     typename T11, typename T12, typename T13, typename T14, typename T15,
00493     typename T16>
00494 class ValueArray16 {
00495  public:
00496   ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00497       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
00498       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
00499       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
00500       v16_(v16) {}
00501 
00502   template <typename T>
00503   operator ParamGenerator<T>() const {
00504     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00505         v12_, v13_, v14_, v15_, v16_};
00506     return ValuesIn(array);
00507   }
00508 
00509  private:
00510   // No implementation - assignment is unsupported.
00511   void operator=(const ValueArray16& other);
00512 
00513   const T1 v1_;
00514   const T2 v2_;
00515   const T3 v3_;
00516   const T4 v4_;
00517   const T5 v5_;
00518   const T6 v6_;
00519   const T7 v7_;
00520   const T8 v8_;
00521   const T9 v9_;
00522   const T10 v10_;
00523   const T11 v11_;
00524   const T12 v12_;
00525   const T13 v13_;
00526   const T14 v14_;
00527   const T15 v15_;
00528   const T16 v16_;
00529 };
00530 
00531 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00532     typename T6, typename T7, typename T8, typename T9, typename T10,
00533     typename T11, typename T12, typename T13, typename T14, typename T15,
00534     typename T16, typename T17>
00535 class ValueArray17 {
00536  public:
00537   ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00538       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
00539       T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00540       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
00541       v15_(v15), v16_(v16), v17_(v17) {}
00542 
00543   template <typename T>
00544   operator ParamGenerator<T>() const {
00545     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00546         v12_, v13_, v14_, v15_, v16_, v17_};
00547     return ValuesIn(array);
00548   }
00549 
00550  private:
00551   // No implementation - assignment is unsupported.
00552   void operator=(const ValueArray17& other);
00553 
00554   const T1 v1_;
00555   const T2 v2_;
00556   const T3 v3_;
00557   const T4 v4_;
00558   const T5 v5_;
00559   const T6 v6_;
00560   const T7 v7_;
00561   const T8 v8_;
00562   const T9 v9_;
00563   const T10 v10_;
00564   const T11 v11_;
00565   const T12 v12_;
00566   const T13 v13_;
00567   const T14 v14_;
00568   const T15 v15_;
00569   const T16 v16_;
00570   const T17 v17_;
00571 };
00572 
00573 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00574     typename T6, typename T7, typename T8, typename T9, typename T10,
00575     typename T11, typename T12, typename T13, typename T14, typename T15,
00576     typename T16, typename T17, typename T18>
00577 class ValueArray18 {
00578  public:
00579   ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00580       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00581       T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00582       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
00583       v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
00584 
00585   template <typename T>
00586   operator ParamGenerator<T>() const {
00587     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00588         v12_, v13_, v14_, v15_, v16_, v17_, v18_};
00589     return ValuesIn(array);
00590   }
00591 
00592  private:
00593   // No implementation - assignment is unsupported.
00594   void operator=(const ValueArray18& other);
00595 
00596   const T1 v1_;
00597   const T2 v2_;
00598   const T3 v3_;
00599   const T4 v4_;
00600   const T5 v5_;
00601   const T6 v6_;
00602   const T7 v7_;
00603   const T8 v8_;
00604   const T9 v9_;
00605   const T10 v10_;
00606   const T11 v11_;
00607   const T12 v12_;
00608   const T13 v13_;
00609   const T14 v14_;
00610   const T15 v15_;
00611   const T16 v16_;
00612   const T17 v17_;
00613   const T18 v18_;
00614 };
00615 
00616 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00617     typename T6, typename T7, typename T8, typename T9, typename T10,
00618     typename T11, typename T12, typename T13, typename T14, typename T15,
00619     typename T16, typename T17, typename T18, typename T19>
00620 class ValueArray19 {
00621  public:
00622   ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00623       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00624       T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
00625       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
00626       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
00627 
00628   template <typename T>
00629   operator ParamGenerator<T>() const {
00630     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00631         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
00632     return ValuesIn(array);
00633   }
00634 
00635  private:
00636   // No implementation - assignment is unsupported.
00637   void operator=(const ValueArray19& other);
00638 
00639   const T1 v1_;
00640   const T2 v2_;
00641   const T3 v3_;
00642   const T4 v4_;
00643   const T5 v5_;
00644   const T6 v6_;
00645   const T7 v7_;
00646   const T8 v8_;
00647   const T9 v9_;
00648   const T10 v10_;
00649   const T11 v11_;
00650   const T12 v12_;
00651   const T13 v13_;
00652   const T14 v14_;
00653   const T15 v15_;
00654   const T16 v16_;
00655   const T17 v17_;
00656   const T18 v18_;
00657   const T19 v19_;
00658 };
00659 
00660 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00661     typename T6, typename T7, typename T8, typename T9, typename T10,
00662     typename T11, typename T12, typename T13, typename T14, typename T15,
00663     typename T16, typename T17, typename T18, typename T19, typename T20>
00664 class ValueArray20 {
00665  public:
00666   ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00667       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00668       T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
00669       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
00670       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
00671       v19_(v19), v20_(v20) {}
00672 
00673   template <typename T>
00674   operator ParamGenerator<T>() const {
00675     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00676         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
00677     return ValuesIn(array);
00678   }
00679 
00680  private:
00681   // No implementation - assignment is unsupported.
00682   void operator=(const ValueArray20& other);
00683 
00684   const T1 v1_;
00685   const T2 v2_;
00686   const T3 v3_;
00687   const T4 v4_;
00688   const T5 v5_;
00689   const T6 v6_;
00690   const T7 v7_;
00691   const T8 v8_;
00692   const T9 v9_;
00693   const T10 v10_;
00694   const T11 v11_;
00695   const T12 v12_;
00696   const T13 v13_;
00697   const T14 v14_;
00698   const T15 v15_;
00699   const T16 v16_;
00700   const T17 v17_;
00701   const T18 v18_;
00702   const T19 v19_;
00703   const T20 v20_;
00704 };
00705 
00706 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00707     typename T6, typename T7, typename T8, typename T9, typename T10,
00708     typename T11, typename T12, typename T13, typename T14, typename T15,
00709     typename T16, typename T17, typename T18, typename T19, typename T20,
00710     typename T21>
00711 class ValueArray21 {
00712  public:
00713   ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00714       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00715       T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
00716       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
00717       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
00718       v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
00719 
00720   template <typename T>
00721   operator ParamGenerator<T>() const {
00722     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00723         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
00724     return ValuesIn(array);
00725   }
00726 
00727  private:
00728   // No implementation - assignment is unsupported.
00729   void operator=(const ValueArray21& other);
00730 
00731   const T1 v1_;
00732   const T2 v2_;
00733   const T3 v3_;
00734   const T4 v4_;
00735   const T5 v5_;
00736   const T6 v6_;
00737   const T7 v7_;
00738   const T8 v8_;
00739   const T9 v9_;
00740   const T10 v10_;
00741   const T11 v11_;
00742   const T12 v12_;
00743   const T13 v13_;
00744   const T14 v14_;
00745   const T15 v15_;
00746   const T16 v16_;
00747   const T17 v17_;
00748   const T18 v18_;
00749   const T19 v19_;
00750   const T20 v20_;
00751   const T21 v21_;
00752 };
00753 
00754 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00755     typename T6, typename T7, typename T8, typename T9, typename T10,
00756     typename T11, typename T12, typename T13, typename T14, typename T15,
00757     typename T16, typename T17, typename T18, typename T19, typename T20,
00758     typename T21, typename T22>
00759 class ValueArray22 {
00760  public:
00761   ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00762       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00763       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
00764       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
00765       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
00766       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
00767 
00768   template <typename T>
00769   operator ParamGenerator<T>() const {
00770     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00771         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
00772     return ValuesIn(array);
00773   }
00774 
00775  private:
00776   // No implementation - assignment is unsupported.
00777   void operator=(const ValueArray22& other);
00778 
00779   const T1 v1_;
00780   const T2 v2_;
00781   const T3 v3_;
00782   const T4 v4_;
00783   const T5 v5_;
00784   const T6 v6_;
00785   const T7 v7_;
00786   const T8 v8_;
00787   const T9 v9_;
00788   const T10 v10_;
00789   const T11 v11_;
00790   const T12 v12_;
00791   const T13 v13_;
00792   const T14 v14_;
00793   const T15 v15_;
00794   const T16 v16_;
00795   const T17 v17_;
00796   const T18 v18_;
00797   const T19 v19_;
00798   const T20 v20_;
00799   const T21 v21_;
00800   const T22 v22_;
00801 };
00802 
00803 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00804     typename T6, typename T7, typename T8, typename T9, typename T10,
00805     typename T11, typename T12, typename T13, typename T14, typename T15,
00806     typename T16, typename T17, typename T18, typename T19, typename T20,
00807     typename T21, typename T22, typename T23>
00808 class ValueArray23 {
00809  public:
00810   ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00811       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00812       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
00813       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
00814       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
00815       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
00816       v23_(v23) {}
00817 
00818   template <typename T>
00819   operator ParamGenerator<T>() const {
00820     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00821         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
00822         v23_};
00823     return ValuesIn(array);
00824   }
00825 
00826  private:
00827   // No implementation - assignment is unsupported.
00828   void operator=(const ValueArray23& other);
00829 
00830   const T1 v1_;
00831   const T2 v2_;
00832   const T3 v3_;
00833   const T4 v4_;
00834   const T5 v5_;
00835   const T6 v6_;
00836   const T7 v7_;
00837   const T8 v8_;
00838   const T9 v9_;
00839   const T10 v10_;
00840   const T11 v11_;
00841   const T12 v12_;
00842   const T13 v13_;
00843   const T14 v14_;
00844   const T15 v15_;
00845   const T16 v16_;
00846   const T17 v17_;
00847   const T18 v18_;
00848   const T19 v19_;
00849   const T20 v20_;
00850   const T21 v21_;
00851   const T22 v22_;
00852   const T23 v23_;
00853 };
00854 
00855 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00856     typename T6, typename T7, typename T8, typename T9, typename T10,
00857     typename T11, typename T12, typename T13, typename T14, typename T15,
00858     typename T16, typename T17, typename T18, typename T19, typename T20,
00859     typename T21, typename T22, typename T23, typename T24>
00860 class ValueArray24 {
00861  public:
00862   ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00863       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00864       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
00865       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
00866       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
00867       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
00868       v22_(v22), v23_(v23), v24_(v24) {}
00869 
00870   template <typename T>
00871   operator ParamGenerator<T>() const {
00872     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00873         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
00874         v24_};
00875     return ValuesIn(array);
00876   }
00877 
00878  private:
00879   // No implementation - assignment is unsupported.
00880   void operator=(const ValueArray24& other);
00881 
00882   const T1 v1_;
00883   const T2 v2_;
00884   const T3 v3_;
00885   const T4 v4_;
00886   const T5 v5_;
00887   const T6 v6_;
00888   const T7 v7_;
00889   const T8 v8_;
00890   const T9 v9_;
00891   const T10 v10_;
00892   const T11 v11_;
00893   const T12 v12_;
00894   const T13 v13_;
00895   const T14 v14_;
00896   const T15 v15_;
00897   const T16 v16_;
00898   const T17 v17_;
00899   const T18 v18_;
00900   const T19 v19_;
00901   const T20 v20_;
00902   const T21 v21_;
00903   const T22 v22_;
00904   const T23 v23_;
00905   const T24 v24_;
00906 };
00907 
00908 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00909     typename T6, typename T7, typename T8, typename T9, typename T10,
00910     typename T11, typename T12, typename T13, typename T14, typename T15,
00911     typename T16, typename T17, typename T18, typename T19, typename T20,
00912     typename T21, typename T22, typename T23, typename T24, typename T25>
00913 class ValueArray25 {
00914  public:
00915   ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00916       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00917       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
00918       T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00919       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
00920       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
00921       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
00922 
00923   template <typename T>
00924   operator ParamGenerator<T>() const {
00925     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00926         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
00927         v24_, v25_};
00928     return ValuesIn(array);
00929   }
00930 
00931  private:
00932   // No implementation - assignment is unsupported.
00933   void operator=(const ValueArray25& other);
00934 
00935   const T1 v1_;
00936   const T2 v2_;
00937   const T3 v3_;
00938   const T4 v4_;
00939   const T5 v5_;
00940   const T6 v6_;
00941   const T7 v7_;
00942   const T8 v8_;
00943   const T9 v9_;
00944   const T10 v10_;
00945   const T11 v11_;
00946   const T12 v12_;
00947   const T13 v13_;
00948   const T14 v14_;
00949   const T15 v15_;
00950   const T16 v16_;
00951   const T17 v17_;
00952   const T18 v18_;
00953   const T19 v19_;
00954   const T20 v20_;
00955   const T21 v21_;
00956   const T22 v22_;
00957   const T23 v23_;
00958   const T24 v24_;
00959   const T25 v25_;
00960 };
00961 
00962 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00963     typename T6, typename T7, typename T8, typename T9, typename T10,
00964     typename T11, typename T12, typename T13, typename T14, typename T15,
00965     typename T16, typename T17, typename T18, typename T19, typename T20,
00966     typename T21, typename T22, typename T23, typename T24, typename T25,
00967     typename T26>
00968 class ValueArray26 {
00969  public:
00970   ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00971       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00972       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00973       T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
00974       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
00975       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
00976       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
00977 
00978   template <typename T>
00979   operator ParamGenerator<T>() const {
00980     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
00981         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
00982         v24_, v25_, v26_};
00983     return ValuesIn(array);
00984   }
00985 
00986  private:
00987   // No implementation - assignment is unsupported.
00988   void operator=(const ValueArray26& other);
00989 
00990   const T1 v1_;
00991   const T2 v2_;
00992   const T3 v3_;
00993   const T4 v4_;
00994   const T5 v5_;
00995   const T6 v6_;
00996   const T7 v7_;
00997   const T8 v8_;
00998   const T9 v9_;
00999   const T10 v10_;
01000   const T11 v11_;
01001   const T12 v12_;
01002   const T13 v13_;
01003   const T14 v14_;
01004   const T15 v15_;
01005   const T16 v16_;
01006   const T17 v17_;
01007   const T18 v18_;
01008   const T19 v19_;
01009   const T20 v20_;
01010   const T21 v21_;
01011   const T22 v22_;
01012   const T23 v23_;
01013   const T24 v24_;
01014   const T25 v25_;
01015   const T26 v26_;
01016 };
01017 
01018 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01019     typename T6, typename T7, typename T8, typename T9, typename T10,
01020     typename T11, typename T12, typename T13, typename T14, typename T15,
01021     typename T16, typename T17, typename T18, typename T19, typename T20,
01022     typename T21, typename T22, typename T23, typename T24, typename T25,
01023     typename T26, typename T27>
01024 class ValueArray27 {
01025  public:
01026   ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01027       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01028       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01029       T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
01030       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
01031       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
01032       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
01033       v26_(v26), v27_(v27) {}
01034 
01035   template <typename T>
01036   operator ParamGenerator<T>() const {
01037     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01038         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01039         v24_, v25_, v26_, v27_};
01040     return ValuesIn(array);
01041   }
01042 
01043  private:
01044   // No implementation - assignment is unsupported.
01045   void operator=(const ValueArray27& other);
01046 
01047   const T1 v1_;
01048   const T2 v2_;
01049   const T3 v3_;
01050   const T4 v4_;
01051   const T5 v5_;
01052   const T6 v6_;
01053   const T7 v7_;
01054   const T8 v8_;
01055   const T9 v9_;
01056   const T10 v10_;
01057   const T11 v11_;
01058   const T12 v12_;
01059   const T13 v13_;
01060   const T14 v14_;
01061   const T15 v15_;
01062   const T16 v16_;
01063   const T17 v17_;
01064   const T18 v18_;
01065   const T19 v19_;
01066   const T20 v20_;
01067   const T21 v21_;
01068   const T22 v22_;
01069   const T23 v23_;
01070   const T24 v24_;
01071   const T25 v25_;
01072   const T26 v26_;
01073   const T27 v27_;
01074 };
01075 
01076 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01077     typename T6, typename T7, typename T8, typename T9, typename T10,
01078     typename T11, typename T12, typename T13, typename T14, typename T15,
01079     typename T16, typename T17, typename T18, typename T19, typename T20,
01080     typename T21, typename T22, typename T23, typename T24, typename T25,
01081     typename T26, typename T27, typename T28>
01082 class ValueArray28 {
01083  public:
01084   ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01085       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01086       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01087       T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
01088       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
01089       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
01090       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
01091       v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
01092 
01093   template <typename T>
01094   operator ParamGenerator<T>() const {
01095     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01096         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01097         v24_, v25_, v26_, v27_, v28_};
01098     return ValuesIn(array);
01099   }
01100 
01101  private:
01102   // No implementation - assignment is unsupported.
01103   void operator=(const ValueArray28& other);
01104 
01105   const T1 v1_;
01106   const T2 v2_;
01107   const T3 v3_;
01108   const T4 v4_;
01109   const T5 v5_;
01110   const T6 v6_;
01111   const T7 v7_;
01112   const T8 v8_;
01113   const T9 v9_;
01114   const T10 v10_;
01115   const T11 v11_;
01116   const T12 v12_;
01117   const T13 v13_;
01118   const T14 v14_;
01119   const T15 v15_;
01120   const T16 v16_;
01121   const T17 v17_;
01122   const T18 v18_;
01123   const T19 v19_;
01124   const T20 v20_;
01125   const T21 v21_;
01126   const T22 v22_;
01127   const T23 v23_;
01128   const T24 v24_;
01129   const T25 v25_;
01130   const T26 v26_;
01131   const T27 v27_;
01132   const T28 v28_;
01133 };
01134 
01135 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01136     typename T6, typename T7, typename T8, typename T9, typename T10,
01137     typename T11, typename T12, typename T13, typename T14, typename T15,
01138     typename T16, typename T17, typename T18, typename T19, typename T20,
01139     typename T21, typename T22, typename T23, typename T24, typename T25,
01140     typename T26, typename T27, typename T28, typename T29>
01141 class ValueArray29 {
01142  public:
01143   ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01144       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01145       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01146       T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
01147       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
01148       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
01149       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
01150       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
01151 
01152   template <typename T>
01153   operator ParamGenerator<T>() const {
01154     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01155         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01156         v24_, v25_, v26_, v27_, v28_, v29_};
01157     return ValuesIn(array);
01158   }
01159 
01160  private:
01161   // No implementation - assignment is unsupported.
01162   void operator=(const ValueArray29& other);
01163 
01164   const T1 v1_;
01165   const T2 v2_;
01166   const T3 v3_;
01167   const T4 v4_;
01168   const T5 v5_;
01169   const T6 v6_;
01170   const T7 v7_;
01171   const T8 v8_;
01172   const T9 v9_;
01173   const T10 v10_;
01174   const T11 v11_;
01175   const T12 v12_;
01176   const T13 v13_;
01177   const T14 v14_;
01178   const T15 v15_;
01179   const T16 v16_;
01180   const T17 v17_;
01181   const T18 v18_;
01182   const T19 v19_;
01183   const T20 v20_;
01184   const T21 v21_;
01185   const T22 v22_;
01186   const T23 v23_;
01187   const T24 v24_;
01188   const T25 v25_;
01189   const T26 v26_;
01190   const T27 v27_;
01191   const T28 v28_;
01192   const T29 v29_;
01193 };
01194 
01195 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01196     typename T6, typename T7, typename T8, typename T9, typename T10,
01197     typename T11, typename T12, typename T13, typename T14, typename T15,
01198     typename T16, typename T17, typename T18, typename T19, typename T20,
01199     typename T21, typename T22, typename T23, typename T24, typename T25,
01200     typename T26, typename T27, typename T28, typename T29, typename T30>
01201 class ValueArray30 {
01202  public:
01203   ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01204       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01205       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01206       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
01207       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
01208       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
01209       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
01210       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
01211       v29_(v29), v30_(v30) {}
01212 
01213   template <typename T>
01214   operator ParamGenerator<T>() const {
01215     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01216         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01217         v24_, v25_, v26_, v27_, v28_, v29_, v30_};
01218     return ValuesIn(array);
01219   }
01220 
01221  private:
01222   // No implementation - assignment is unsupported.
01223   void operator=(const ValueArray30& other);
01224 
01225   const T1 v1_;
01226   const T2 v2_;
01227   const T3 v3_;
01228   const T4 v4_;
01229   const T5 v5_;
01230   const T6 v6_;
01231   const T7 v7_;
01232   const T8 v8_;
01233   const T9 v9_;
01234   const T10 v10_;
01235   const T11 v11_;
01236   const T12 v12_;
01237   const T13 v13_;
01238   const T14 v14_;
01239   const T15 v15_;
01240   const T16 v16_;
01241   const T17 v17_;
01242   const T18 v18_;
01243   const T19 v19_;
01244   const T20 v20_;
01245   const T21 v21_;
01246   const T22 v22_;
01247   const T23 v23_;
01248   const T24 v24_;
01249   const T25 v25_;
01250   const T26 v26_;
01251   const T27 v27_;
01252   const T28 v28_;
01253   const T29 v29_;
01254   const T30 v30_;
01255 };
01256 
01257 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01258     typename T6, typename T7, typename T8, typename T9, typename T10,
01259     typename T11, typename T12, typename T13, typename T14, typename T15,
01260     typename T16, typename T17, typename T18, typename T19, typename T20,
01261     typename T21, typename T22, typename T23, typename T24, typename T25,
01262     typename T26, typename T27, typename T28, typename T29, typename T30,
01263     typename T31>
01264 class ValueArray31 {
01265  public:
01266   ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01267       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01268       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01269       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
01270       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
01271       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
01272       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
01273       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
01274       v29_(v29), v30_(v30), v31_(v31) {}
01275 
01276   template <typename T>
01277   operator ParamGenerator<T>() const {
01278     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01279         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01280         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
01281     return ValuesIn(array);
01282   }
01283 
01284  private:
01285   // No implementation - assignment is unsupported.
01286   void operator=(const ValueArray31& other);
01287 
01288   const T1 v1_;
01289   const T2 v2_;
01290   const T3 v3_;
01291   const T4 v4_;
01292   const T5 v5_;
01293   const T6 v6_;
01294   const T7 v7_;
01295   const T8 v8_;
01296   const T9 v9_;
01297   const T10 v10_;
01298   const T11 v11_;
01299   const T12 v12_;
01300   const T13 v13_;
01301   const T14 v14_;
01302   const T15 v15_;
01303   const T16 v16_;
01304   const T17 v17_;
01305   const T18 v18_;
01306   const T19 v19_;
01307   const T20 v20_;
01308   const T21 v21_;
01309   const T22 v22_;
01310   const T23 v23_;
01311   const T24 v24_;
01312   const T25 v25_;
01313   const T26 v26_;
01314   const T27 v27_;
01315   const T28 v28_;
01316   const T29 v29_;
01317   const T30 v30_;
01318   const T31 v31_;
01319 };
01320 
01321 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01322     typename T6, typename T7, typename T8, typename T9, typename T10,
01323     typename T11, typename T12, typename T13, typename T14, typename T15,
01324     typename T16, typename T17, typename T18, typename T19, typename T20,
01325     typename T21, typename T22, typename T23, typename T24, typename T25,
01326     typename T26, typename T27, typename T28, typename T29, typename T30,
01327     typename T31, typename T32>
01328 class ValueArray32 {
01329  public:
01330   ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01331       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01332       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01333       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
01334       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
01335       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
01336       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
01337       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
01338       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
01339 
01340   template <typename T>
01341   operator ParamGenerator<T>() const {
01342     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01343         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01344         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
01345     return ValuesIn(array);
01346   }
01347 
01348  private:
01349   // No implementation - assignment is unsupported.
01350   void operator=(const ValueArray32& other);
01351 
01352   const T1 v1_;
01353   const T2 v2_;
01354   const T3 v3_;
01355   const T4 v4_;
01356   const T5 v5_;
01357   const T6 v6_;
01358   const T7 v7_;
01359   const T8 v8_;
01360   const T9 v9_;
01361   const T10 v10_;
01362   const T11 v11_;
01363   const T12 v12_;
01364   const T13 v13_;
01365   const T14 v14_;
01366   const T15 v15_;
01367   const T16 v16_;
01368   const T17 v17_;
01369   const T18 v18_;
01370   const T19 v19_;
01371   const T20 v20_;
01372   const T21 v21_;
01373   const T22 v22_;
01374   const T23 v23_;
01375   const T24 v24_;
01376   const T25 v25_;
01377   const T26 v26_;
01378   const T27 v27_;
01379   const T28 v28_;
01380   const T29 v29_;
01381   const T30 v30_;
01382   const T31 v31_;
01383   const T32 v32_;
01384 };
01385 
01386 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01387     typename T6, typename T7, typename T8, typename T9, typename T10,
01388     typename T11, typename T12, typename T13, typename T14, typename T15,
01389     typename T16, typename T17, typename T18, typename T19, typename T20,
01390     typename T21, typename T22, typename T23, typename T24, typename T25,
01391     typename T26, typename T27, typename T28, typename T29, typename T30,
01392     typename T31, typename T32, typename T33>
01393 class ValueArray33 {
01394  public:
01395   ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01396       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01397       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01398       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
01399       T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
01400       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
01401       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
01402       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
01403       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
01404       v33_(v33) {}
01405 
01406   template <typename T>
01407   operator ParamGenerator<T>() const {
01408     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01409         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01410         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
01411     return ValuesIn(array);
01412   }
01413 
01414  private:
01415   // No implementation - assignment is unsupported.
01416   void operator=(const ValueArray33& other);
01417 
01418   const T1 v1_;
01419   const T2 v2_;
01420   const T3 v3_;
01421   const T4 v4_;
01422   const T5 v5_;
01423   const T6 v6_;
01424   const T7 v7_;
01425   const T8 v8_;
01426   const T9 v9_;
01427   const T10 v10_;
01428   const T11 v11_;
01429   const T12 v12_;
01430   const T13 v13_;
01431   const T14 v14_;
01432   const T15 v15_;
01433   const T16 v16_;
01434   const T17 v17_;
01435   const T18 v18_;
01436   const T19 v19_;
01437   const T20 v20_;
01438   const T21 v21_;
01439   const T22 v22_;
01440   const T23 v23_;
01441   const T24 v24_;
01442   const T25 v25_;
01443   const T26 v26_;
01444   const T27 v27_;
01445   const T28 v28_;
01446   const T29 v29_;
01447   const T30 v30_;
01448   const T31 v31_;
01449   const T32 v32_;
01450   const T33 v33_;
01451 };
01452 
01453 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01454     typename T6, typename T7, typename T8, typename T9, typename T10,
01455     typename T11, typename T12, typename T13, typename T14, typename T15,
01456     typename T16, typename T17, typename T18, typename T19, typename T20,
01457     typename T21, typename T22, typename T23, typename T24, typename T25,
01458     typename T26, typename T27, typename T28, typename T29, typename T30,
01459     typename T31, typename T32, typename T33, typename T34>
01460 class ValueArray34 {
01461  public:
01462   ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01463       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01464       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01465       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01466       T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
01467       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
01468       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
01469       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
01470       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
01471       v33_(v33), v34_(v34) {}
01472 
01473   template <typename T>
01474   operator ParamGenerator<T>() const {
01475     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01476         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01477         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
01478     return ValuesIn(array);
01479   }
01480 
01481  private:
01482   // No implementation - assignment is unsupported.
01483   void operator=(const ValueArray34& other);
01484 
01485   const T1 v1_;
01486   const T2 v2_;
01487   const T3 v3_;
01488   const T4 v4_;
01489   const T5 v5_;
01490   const T6 v6_;
01491   const T7 v7_;
01492   const T8 v8_;
01493   const T9 v9_;
01494   const T10 v10_;
01495   const T11 v11_;
01496   const T12 v12_;
01497   const T13 v13_;
01498   const T14 v14_;
01499   const T15 v15_;
01500   const T16 v16_;
01501   const T17 v17_;
01502   const T18 v18_;
01503   const T19 v19_;
01504   const T20 v20_;
01505   const T21 v21_;
01506   const T22 v22_;
01507   const T23 v23_;
01508   const T24 v24_;
01509   const T25 v25_;
01510   const T26 v26_;
01511   const T27 v27_;
01512   const T28 v28_;
01513   const T29 v29_;
01514   const T30 v30_;
01515   const T31 v31_;
01516   const T32 v32_;
01517   const T33 v33_;
01518   const T34 v34_;
01519 };
01520 
01521 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01522     typename T6, typename T7, typename T8, typename T9, typename T10,
01523     typename T11, typename T12, typename T13, typename T14, typename T15,
01524     typename T16, typename T17, typename T18, typename T19, typename T20,
01525     typename T21, typename T22, typename T23, typename T24, typename T25,
01526     typename T26, typename T27, typename T28, typename T29, typename T30,
01527     typename T31, typename T32, typename T33, typename T34, typename T35>
01528 class ValueArray35 {
01529  public:
01530   ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01531       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01532       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01533       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01534       T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
01535       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
01536       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
01537       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
01538       v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
01539       v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
01540 
01541   template <typename T>
01542   operator ParamGenerator<T>() const {
01543     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01544         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01545         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
01546         v35_};
01547     return ValuesIn(array);
01548   }
01549 
01550  private:
01551   // No implementation - assignment is unsupported.
01552   void operator=(const ValueArray35& other);
01553 
01554   const T1 v1_;
01555   const T2 v2_;
01556   const T3 v3_;
01557   const T4 v4_;
01558   const T5 v5_;
01559   const T6 v6_;
01560   const T7 v7_;
01561   const T8 v8_;
01562   const T9 v9_;
01563   const T10 v10_;
01564   const T11 v11_;
01565   const T12 v12_;
01566   const T13 v13_;
01567   const T14 v14_;
01568   const T15 v15_;
01569   const T16 v16_;
01570   const T17 v17_;
01571   const T18 v18_;
01572   const T19 v19_;
01573   const T20 v20_;
01574   const T21 v21_;
01575   const T22 v22_;
01576   const T23 v23_;
01577   const T24 v24_;
01578   const T25 v25_;
01579   const T26 v26_;
01580   const T27 v27_;
01581   const T28 v28_;
01582   const T29 v29_;
01583   const T30 v30_;
01584   const T31 v31_;
01585   const T32 v32_;
01586   const T33 v33_;
01587   const T34 v34_;
01588   const T35 v35_;
01589 };
01590 
01591 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01592     typename T6, typename T7, typename T8, typename T9, typename T10,
01593     typename T11, typename T12, typename T13, typename T14, typename T15,
01594     typename T16, typename T17, typename T18, typename T19, typename T20,
01595     typename T21, typename T22, typename T23, typename T24, typename T25,
01596     typename T26, typename T27, typename T28, typename T29, typename T30,
01597     typename T31, typename T32, typename T33, typename T34, typename T35,
01598     typename T36>
01599 class ValueArray36 {
01600  public:
01601   ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01602       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01603       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01604       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01605       T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
01606       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
01607       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
01608       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
01609       v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
01610       v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
01611 
01612   template <typename T>
01613   operator ParamGenerator<T>() const {
01614     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01615         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01616         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
01617         v36_};
01618     return ValuesIn(array);
01619   }
01620 
01621  private:
01622   // No implementation - assignment is unsupported.
01623   void operator=(const ValueArray36& other);
01624 
01625   const T1 v1_;
01626   const T2 v2_;
01627   const T3 v3_;
01628   const T4 v4_;
01629   const T5 v5_;
01630   const T6 v6_;
01631   const T7 v7_;
01632   const T8 v8_;
01633   const T9 v9_;
01634   const T10 v10_;
01635   const T11 v11_;
01636   const T12 v12_;
01637   const T13 v13_;
01638   const T14 v14_;
01639   const T15 v15_;
01640   const T16 v16_;
01641   const T17 v17_;
01642   const T18 v18_;
01643   const T19 v19_;
01644   const T20 v20_;
01645   const T21 v21_;
01646   const T22 v22_;
01647   const T23 v23_;
01648   const T24 v24_;
01649   const T25 v25_;
01650   const T26 v26_;
01651   const T27 v27_;
01652   const T28 v28_;
01653   const T29 v29_;
01654   const T30 v30_;
01655   const T31 v31_;
01656   const T32 v32_;
01657   const T33 v33_;
01658   const T34 v34_;
01659   const T35 v35_;
01660   const T36 v36_;
01661 };
01662 
01663 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01664     typename T6, typename T7, typename T8, typename T9, typename T10,
01665     typename T11, typename T12, typename T13, typename T14, typename T15,
01666     typename T16, typename T17, typename T18, typename T19, typename T20,
01667     typename T21, typename T22, typename T23, typename T24, typename T25,
01668     typename T26, typename T27, typename T28, typename T29, typename T30,
01669     typename T31, typename T32, typename T33, typename T34, typename T35,
01670     typename T36, typename T37>
01671 class ValueArray37 {
01672  public:
01673   ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01674       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01675       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01676       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01677       T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
01678       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
01679       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
01680       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
01681       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
01682       v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
01683       v36_(v36), v37_(v37) {}
01684 
01685   template <typename T>
01686   operator ParamGenerator<T>() const {
01687     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01688         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01689         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
01690         v36_, v37_};
01691     return ValuesIn(array);
01692   }
01693 
01694  private:
01695   // No implementation - assignment is unsupported.
01696   void operator=(const ValueArray37& other);
01697 
01698   const T1 v1_;
01699   const T2 v2_;
01700   const T3 v3_;
01701   const T4 v4_;
01702   const T5 v5_;
01703   const T6 v6_;
01704   const T7 v7_;
01705   const T8 v8_;
01706   const T9 v9_;
01707   const T10 v10_;
01708   const T11 v11_;
01709   const T12 v12_;
01710   const T13 v13_;
01711   const T14 v14_;
01712   const T15 v15_;
01713   const T16 v16_;
01714   const T17 v17_;
01715   const T18 v18_;
01716   const T19 v19_;
01717   const T20 v20_;
01718   const T21 v21_;
01719   const T22 v22_;
01720   const T23 v23_;
01721   const T24 v24_;
01722   const T25 v25_;
01723   const T26 v26_;
01724   const T27 v27_;
01725   const T28 v28_;
01726   const T29 v29_;
01727   const T30 v30_;
01728   const T31 v31_;
01729   const T32 v32_;
01730   const T33 v33_;
01731   const T34 v34_;
01732   const T35 v35_;
01733   const T36 v36_;
01734   const T37 v37_;
01735 };
01736 
01737 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01738     typename T6, typename T7, typename T8, typename T9, typename T10,
01739     typename T11, typename T12, typename T13, typename T14, typename T15,
01740     typename T16, typename T17, typename T18, typename T19, typename T20,
01741     typename T21, typename T22, typename T23, typename T24, typename T25,
01742     typename T26, typename T27, typename T28, typename T29, typename T30,
01743     typename T31, typename T32, typename T33, typename T34, typename T35,
01744     typename T36, typename T37, typename T38>
01745 class ValueArray38 {
01746  public:
01747   ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01748       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01749       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01750       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01751       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
01752       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
01753       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
01754       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
01755       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
01756       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
01757       v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
01758 
01759   template <typename T>
01760   operator ParamGenerator<T>() const {
01761     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01762         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01763         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
01764         v36_, v37_, v38_};
01765     return ValuesIn(array);
01766   }
01767 
01768  private:
01769   // No implementation - assignment is unsupported.
01770   void operator=(const ValueArray38& other);
01771 
01772   const T1 v1_;
01773   const T2 v2_;
01774   const T3 v3_;
01775   const T4 v4_;
01776   const T5 v5_;
01777   const T6 v6_;
01778   const T7 v7_;
01779   const T8 v8_;
01780   const T9 v9_;
01781   const T10 v10_;
01782   const T11 v11_;
01783   const T12 v12_;
01784   const T13 v13_;
01785   const T14 v14_;
01786   const T15 v15_;
01787   const T16 v16_;
01788   const T17 v17_;
01789   const T18 v18_;
01790   const T19 v19_;
01791   const T20 v20_;
01792   const T21 v21_;
01793   const T22 v22_;
01794   const T23 v23_;
01795   const T24 v24_;
01796   const T25 v25_;
01797   const T26 v26_;
01798   const T27 v27_;
01799   const T28 v28_;
01800   const T29 v29_;
01801   const T30 v30_;
01802   const T31 v31_;
01803   const T32 v32_;
01804   const T33 v33_;
01805   const T34 v34_;
01806   const T35 v35_;
01807   const T36 v36_;
01808   const T37 v37_;
01809   const T38 v38_;
01810 };
01811 
01812 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01813     typename T6, typename T7, typename T8, typename T9, typename T10,
01814     typename T11, typename T12, typename T13, typename T14, typename T15,
01815     typename T16, typename T17, typename T18, typename T19, typename T20,
01816     typename T21, typename T22, typename T23, typename T24, typename T25,
01817     typename T26, typename T27, typename T28, typename T29, typename T30,
01818     typename T31, typename T32, typename T33, typename T34, typename T35,
01819     typename T36, typename T37, typename T38, typename T39>
01820 class ValueArray39 {
01821  public:
01822   ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01823       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01824       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01825       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01826       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
01827       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
01828       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
01829       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
01830       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
01831       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
01832       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
01833 
01834   template <typename T>
01835   operator ParamGenerator<T>() const {
01836     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01837         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01838         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
01839         v36_, v37_, v38_, v39_};
01840     return ValuesIn(array);
01841   }
01842 
01843  private:
01844   // No implementation - assignment is unsupported.
01845   void operator=(const ValueArray39& other);
01846 
01847   const T1 v1_;
01848   const T2 v2_;
01849   const T3 v3_;
01850   const T4 v4_;
01851   const T5 v5_;
01852   const T6 v6_;
01853   const T7 v7_;
01854   const T8 v8_;
01855   const T9 v9_;
01856   const T10 v10_;
01857   const T11 v11_;
01858   const T12 v12_;
01859   const T13 v13_;
01860   const T14 v14_;
01861   const T15 v15_;
01862   const T16 v16_;
01863   const T17 v17_;
01864   const T18 v18_;
01865   const T19 v19_;
01866   const T20 v20_;
01867   const T21 v21_;
01868   const T22 v22_;
01869   const T23 v23_;
01870   const T24 v24_;
01871   const T25 v25_;
01872   const T26 v26_;
01873   const T27 v27_;
01874   const T28 v28_;
01875   const T29 v29_;
01876   const T30 v30_;
01877   const T31 v31_;
01878   const T32 v32_;
01879   const T33 v33_;
01880   const T34 v34_;
01881   const T35 v35_;
01882   const T36 v36_;
01883   const T37 v37_;
01884   const T38 v38_;
01885   const T39 v39_;
01886 };
01887 
01888 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01889     typename T6, typename T7, typename T8, typename T9, typename T10,
01890     typename T11, typename T12, typename T13, typename T14, typename T15,
01891     typename T16, typename T17, typename T18, typename T19, typename T20,
01892     typename T21, typename T22, typename T23, typename T24, typename T25,
01893     typename T26, typename T27, typename T28, typename T29, typename T30,
01894     typename T31, typename T32, typename T33, typename T34, typename T35,
01895     typename T36, typename T37, typename T38, typename T39, typename T40>
01896 class ValueArray40 {
01897  public:
01898   ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01899       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01900       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01901       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01902       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
01903       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
01904       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
01905       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
01906       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
01907       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
01908       v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
01909       v40_(v40) {}
01910 
01911   template <typename T>
01912   operator ParamGenerator<T>() const {
01913     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01914         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01915         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
01916         v36_, v37_, v38_, v39_, v40_};
01917     return ValuesIn(array);
01918   }
01919 
01920  private:
01921   // No implementation - assignment is unsupported.
01922   void operator=(const ValueArray40& other);
01923 
01924   const T1 v1_;
01925   const T2 v2_;
01926   const T3 v3_;
01927   const T4 v4_;
01928   const T5 v5_;
01929   const T6 v6_;
01930   const T7 v7_;
01931   const T8 v8_;
01932   const T9 v9_;
01933   const T10 v10_;
01934   const T11 v11_;
01935   const T12 v12_;
01936   const T13 v13_;
01937   const T14 v14_;
01938   const T15 v15_;
01939   const T16 v16_;
01940   const T17 v17_;
01941   const T18 v18_;
01942   const T19 v19_;
01943   const T20 v20_;
01944   const T21 v21_;
01945   const T22 v22_;
01946   const T23 v23_;
01947   const T24 v24_;
01948   const T25 v25_;
01949   const T26 v26_;
01950   const T27 v27_;
01951   const T28 v28_;
01952   const T29 v29_;
01953   const T30 v30_;
01954   const T31 v31_;
01955   const T32 v32_;
01956   const T33 v33_;
01957   const T34 v34_;
01958   const T35 v35_;
01959   const T36 v36_;
01960   const T37 v37_;
01961   const T38 v38_;
01962   const T39 v39_;
01963   const T40 v40_;
01964 };
01965 
01966 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01967     typename T6, typename T7, typename T8, typename T9, typename T10,
01968     typename T11, typename T12, typename T13, typename T14, typename T15,
01969     typename T16, typename T17, typename T18, typename T19, typename T20,
01970     typename T21, typename T22, typename T23, typename T24, typename T25,
01971     typename T26, typename T27, typename T28, typename T29, typename T30,
01972     typename T31, typename T32, typename T33, typename T34, typename T35,
01973     typename T36, typename T37, typename T38, typename T39, typename T40,
01974     typename T41>
01975 class ValueArray41 {
01976  public:
01977   ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01978       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01979       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01980       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01981       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
01982       T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
01983       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
01984       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
01985       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
01986       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
01987       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
01988       v39_(v39), v40_(v40), v41_(v41) {}
01989 
01990   template <typename T>
01991   operator ParamGenerator<T>() const {
01992     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
01993         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
01994         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
01995         v36_, v37_, v38_, v39_, v40_, v41_};
01996     return ValuesIn(array);
01997   }
01998 
01999  private:
02000   // No implementation - assignment is unsupported.
02001   void operator=(const ValueArray41& other);
02002 
02003   const T1 v1_;
02004   const T2 v2_;
02005   const T3 v3_;
02006   const T4 v4_;
02007   const T5 v5_;
02008   const T6 v6_;
02009   const T7 v7_;
02010   const T8 v8_;
02011   const T9 v9_;
02012   const T10 v10_;
02013   const T11 v11_;
02014   const T12 v12_;
02015   const T13 v13_;
02016   const T14 v14_;
02017   const T15 v15_;
02018   const T16 v16_;
02019   const T17 v17_;
02020   const T18 v18_;
02021   const T19 v19_;
02022   const T20 v20_;
02023   const T21 v21_;
02024   const T22 v22_;
02025   const T23 v23_;
02026   const T24 v24_;
02027   const T25 v25_;
02028   const T26 v26_;
02029   const T27 v27_;
02030   const T28 v28_;
02031   const T29 v29_;
02032   const T30 v30_;
02033   const T31 v31_;
02034   const T32 v32_;
02035   const T33 v33_;
02036   const T34 v34_;
02037   const T35 v35_;
02038   const T36 v36_;
02039   const T37 v37_;
02040   const T38 v38_;
02041   const T39 v39_;
02042   const T40 v40_;
02043   const T41 v41_;
02044 };
02045 
02046 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02047     typename T6, typename T7, typename T8, typename T9, typename T10,
02048     typename T11, typename T12, typename T13, typename T14, typename T15,
02049     typename T16, typename T17, typename T18, typename T19, typename T20,
02050     typename T21, typename T22, typename T23, typename T24, typename T25,
02051     typename T26, typename T27, typename T28, typename T29, typename T30,
02052     typename T31, typename T32, typename T33, typename T34, typename T35,
02053     typename T36, typename T37, typename T38, typename T39, typename T40,
02054     typename T41, typename T42>
02055 class ValueArray42 {
02056  public:
02057   ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02058       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02059       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02060       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02061       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02062       T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
02063       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
02064       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
02065       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
02066       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
02067       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
02068       v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
02069 
02070   template <typename T>
02071   operator ParamGenerator<T>() const {
02072     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02073         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02074         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02075         v36_, v37_, v38_, v39_, v40_, v41_, v42_};
02076     return ValuesIn(array);
02077   }
02078 
02079  private:
02080   // No implementation - assignment is unsupported.
02081   void operator=(const ValueArray42& other);
02082 
02083   const T1 v1_;
02084   const T2 v2_;
02085   const T3 v3_;
02086   const T4 v4_;
02087   const T5 v5_;
02088   const T6 v6_;
02089   const T7 v7_;
02090   const T8 v8_;
02091   const T9 v9_;
02092   const T10 v10_;
02093   const T11 v11_;
02094   const T12 v12_;
02095   const T13 v13_;
02096   const T14 v14_;
02097   const T15 v15_;
02098   const T16 v16_;
02099   const T17 v17_;
02100   const T18 v18_;
02101   const T19 v19_;
02102   const T20 v20_;
02103   const T21 v21_;
02104   const T22 v22_;
02105   const T23 v23_;
02106   const T24 v24_;
02107   const T25 v25_;
02108   const T26 v26_;
02109   const T27 v27_;
02110   const T28 v28_;
02111   const T29 v29_;
02112   const T30 v30_;
02113   const T31 v31_;
02114   const T32 v32_;
02115   const T33 v33_;
02116   const T34 v34_;
02117   const T35 v35_;
02118   const T36 v36_;
02119   const T37 v37_;
02120   const T38 v38_;
02121   const T39 v39_;
02122   const T40 v40_;
02123   const T41 v41_;
02124   const T42 v42_;
02125 };
02126 
02127 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02128     typename T6, typename T7, typename T8, typename T9, typename T10,
02129     typename T11, typename T12, typename T13, typename T14, typename T15,
02130     typename T16, typename T17, typename T18, typename T19, typename T20,
02131     typename T21, typename T22, typename T23, typename T24, typename T25,
02132     typename T26, typename T27, typename T28, typename T29, typename T30,
02133     typename T31, typename T32, typename T33, typename T34, typename T35,
02134     typename T36, typename T37, typename T38, typename T39, typename T40,
02135     typename T41, typename T42, typename T43>
02136 class ValueArray43 {
02137  public:
02138   ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02139       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02140       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02141       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02142       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02143       T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
02144       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
02145       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
02146       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
02147       v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
02148       v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
02149       v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
02150 
02151   template <typename T>
02152   operator ParamGenerator<T>() const {
02153     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02154         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02155         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02156         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
02157     return ValuesIn(array);
02158   }
02159 
02160  private:
02161   // No implementation - assignment is unsupported.
02162   void operator=(const ValueArray43& other);
02163 
02164   const T1 v1_;
02165   const T2 v2_;
02166   const T3 v3_;
02167   const T4 v4_;
02168   const T5 v5_;
02169   const T6 v6_;
02170   const T7 v7_;
02171   const T8 v8_;
02172   const T9 v9_;
02173   const T10 v10_;
02174   const T11 v11_;
02175   const T12 v12_;
02176   const T13 v13_;
02177   const T14 v14_;
02178   const T15 v15_;
02179   const T16 v16_;
02180   const T17 v17_;
02181   const T18 v18_;
02182   const T19 v19_;
02183   const T20 v20_;
02184   const T21 v21_;
02185   const T22 v22_;
02186   const T23 v23_;
02187   const T24 v24_;
02188   const T25 v25_;
02189   const T26 v26_;
02190   const T27 v27_;
02191   const T28 v28_;
02192   const T29 v29_;
02193   const T30 v30_;
02194   const T31 v31_;
02195   const T32 v32_;
02196   const T33 v33_;
02197   const T34 v34_;
02198   const T35 v35_;
02199   const T36 v36_;
02200   const T37 v37_;
02201   const T38 v38_;
02202   const T39 v39_;
02203   const T40 v40_;
02204   const T41 v41_;
02205   const T42 v42_;
02206   const T43 v43_;
02207 };
02208 
02209 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02210     typename T6, typename T7, typename T8, typename T9, typename T10,
02211     typename T11, typename T12, typename T13, typename T14, typename T15,
02212     typename T16, typename T17, typename T18, typename T19, typename T20,
02213     typename T21, typename T22, typename T23, typename T24, typename T25,
02214     typename T26, typename T27, typename T28, typename T29, typename T30,
02215     typename T31, typename T32, typename T33, typename T34, typename T35,
02216     typename T36, typename T37, typename T38, typename T39, typename T40,
02217     typename T41, typename T42, typename T43, typename T44>
02218 class ValueArray44 {
02219  public:
02220   ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02221       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02222       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02223       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02224       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02225       T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
02226       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
02227       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
02228       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
02229       v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
02230       v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
02231       v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
02232       v43_(v43), v44_(v44) {}
02233 
02234   template <typename T>
02235   operator ParamGenerator<T>() const {
02236     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02237         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02238         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02239         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
02240     return ValuesIn(array);
02241   }
02242 
02243  private:
02244   // No implementation - assignment is unsupported.
02245   void operator=(const ValueArray44& other);
02246 
02247   const T1 v1_;
02248   const T2 v2_;
02249   const T3 v3_;
02250   const T4 v4_;
02251   const T5 v5_;
02252   const T6 v6_;
02253   const T7 v7_;
02254   const T8 v8_;
02255   const T9 v9_;
02256   const T10 v10_;
02257   const T11 v11_;
02258   const T12 v12_;
02259   const T13 v13_;
02260   const T14 v14_;
02261   const T15 v15_;
02262   const T16 v16_;
02263   const T17 v17_;
02264   const T18 v18_;
02265   const T19 v19_;
02266   const T20 v20_;
02267   const T21 v21_;
02268   const T22 v22_;
02269   const T23 v23_;
02270   const T24 v24_;
02271   const T25 v25_;
02272   const T26 v26_;
02273   const T27 v27_;
02274   const T28 v28_;
02275   const T29 v29_;
02276   const T30 v30_;
02277   const T31 v31_;
02278   const T32 v32_;
02279   const T33 v33_;
02280   const T34 v34_;
02281   const T35 v35_;
02282   const T36 v36_;
02283   const T37 v37_;
02284   const T38 v38_;
02285   const T39 v39_;
02286   const T40 v40_;
02287   const T41 v41_;
02288   const T42 v42_;
02289   const T43 v43_;
02290   const T44 v44_;
02291 };
02292 
02293 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02294     typename T6, typename T7, typename T8, typename T9, typename T10,
02295     typename T11, typename T12, typename T13, typename T14, typename T15,
02296     typename T16, typename T17, typename T18, typename T19, typename T20,
02297     typename T21, typename T22, typename T23, typename T24, typename T25,
02298     typename T26, typename T27, typename T28, typename T29, typename T30,
02299     typename T31, typename T32, typename T33, typename T34, typename T35,
02300     typename T36, typename T37, typename T38, typename T39, typename T40,
02301     typename T41, typename T42, typename T43, typename T44, typename T45>
02302 class ValueArray45 {
02303  public:
02304   ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02305       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02306       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02307       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02308       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02309       T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
02310       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
02311       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
02312       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
02313       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
02314       v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
02315       v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
02316       v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
02317 
02318   template <typename T>
02319   operator ParamGenerator<T>() const {
02320     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02321         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02322         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02323         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
02324     return ValuesIn(array);
02325   }
02326 
02327  private:
02328   // No implementation - assignment is unsupported.
02329   void operator=(const ValueArray45& other);
02330 
02331   const T1 v1_;
02332   const T2 v2_;
02333   const T3 v3_;
02334   const T4 v4_;
02335   const T5 v5_;
02336   const T6 v6_;
02337   const T7 v7_;
02338   const T8 v8_;
02339   const T9 v9_;
02340   const T10 v10_;
02341   const T11 v11_;
02342   const T12 v12_;
02343   const T13 v13_;
02344   const T14 v14_;
02345   const T15 v15_;
02346   const T16 v16_;
02347   const T17 v17_;
02348   const T18 v18_;
02349   const T19 v19_;
02350   const T20 v20_;
02351   const T21 v21_;
02352   const T22 v22_;
02353   const T23 v23_;
02354   const T24 v24_;
02355   const T25 v25_;
02356   const T26 v26_;
02357   const T27 v27_;
02358   const T28 v28_;
02359   const T29 v29_;
02360   const T30 v30_;
02361   const T31 v31_;
02362   const T32 v32_;
02363   const T33 v33_;
02364   const T34 v34_;
02365   const T35 v35_;
02366   const T36 v36_;
02367   const T37 v37_;
02368   const T38 v38_;
02369   const T39 v39_;
02370   const T40 v40_;
02371   const T41 v41_;
02372   const T42 v42_;
02373   const T43 v43_;
02374   const T44 v44_;
02375   const T45 v45_;
02376 };
02377 
02378 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02379     typename T6, typename T7, typename T8, typename T9, typename T10,
02380     typename T11, typename T12, typename T13, typename T14, typename T15,
02381     typename T16, typename T17, typename T18, typename T19, typename T20,
02382     typename T21, typename T22, typename T23, typename T24, typename T25,
02383     typename T26, typename T27, typename T28, typename T29, typename T30,
02384     typename T31, typename T32, typename T33, typename T34, typename T35,
02385     typename T36, typename T37, typename T38, typename T39, typename T40,
02386     typename T41, typename T42, typename T43, typename T44, typename T45,
02387     typename T46>
02388 class ValueArray46 {
02389  public:
02390   ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02391       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02392       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02393       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02394       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02395       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
02396       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
02397       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
02398       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
02399       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
02400       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
02401       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
02402       v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
02403 
02404   template <typename T>
02405   operator ParamGenerator<T>() const {
02406     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02407         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02408         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02409         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
02410     return ValuesIn(array);
02411   }
02412 
02413  private:
02414   // No implementation - assignment is unsupported.
02415   void operator=(const ValueArray46& other);
02416 
02417   const T1 v1_;
02418   const T2 v2_;
02419   const T3 v3_;
02420   const T4 v4_;
02421   const T5 v5_;
02422   const T6 v6_;
02423   const T7 v7_;
02424   const T8 v8_;
02425   const T9 v9_;
02426   const T10 v10_;
02427   const T11 v11_;
02428   const T12 v12_;
02429   const T13 v13_;
02430   const T14 v14_;
02431   const T15 v15_;
02432   const T16 v16_;
02433   const T17 v17_;
02434   const T18 v18_;
02435   const T19 v19_;
02436   const T20 v20_;
02437   const T21 v21_;
02438   const T22 v22_;
02439   const T23 v23_;
02440   const T24 v24_;
02441   const T25 v25_;
02442   const T26 v26_;
02443   const T27 v27_;
02444   const T28 v28_;
02445   const T29 v29_;
02446   const T30 v30_;
02447   const T31 v31_;
02448   const T32 v32_;
02449   const T33 v33_;
02450   const T34 v34_;
02451   const T35 v35_;
02452   const T36 v36_;
02453   const T37 v37_;
02454   const T38 v38_;
02455   const T39 v39_;
02456   const T40 v40_;
02457   const T41 v41_;
02458   const T42 v42_;
02459   const T43 v43_;
02460   const T44 v44_;
02461   const T45 v45_;
02462   const T46 v46_;
02463 };
02464 
02465 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02466     typename T6, typename T7, typename T8, typename T9, typename T10,
02467     typename T11, typename T12, typename T13, typename T14, typename T15,
02468     typename T16, typename T17, typename T18, typename T19, typename T20,
02469     typename T21, typename T22, typename T23, typename T24, typename T25,
02470     typename T26, typename T27, typename T28, typename T29, typename T30,
02471     typename T31, typename T32, typename T33, typename T34, typename T35,
02472     typename T36, typename T37, typename T38, typename T39, typename T40,
02473     typename T41, typename T42, typename T43, typename T44, typename T45,
02474     typename T46, typename T47>
02475 class ValueArray47 {
02476  public:
02477   ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02478       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02479       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02480       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02481       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02482       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
02483       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
02484       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
02485       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
02486       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
02487       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
02488       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
02489       v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
02490       v47_(v47) {}
02491 
02492   template <typename T>
02493   operator ParamGenerator<T>() const {
02494     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02495         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02496         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02497         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
02498         v47_};
02499     return ValuesIn(array);
02500   }
02501 
02502  private:
02503   // No implementation - assignment is unsupported.
02504   void operator=(const ValueArray47& other);
02505 
02506   const T1 v1_;
02507   const T2 v2_;
02508   const T3 v3_;
02509   const T4 v4_;
02510   const T5 v5_;
02511   const T6 v6_;
02512   const T7 v7_;
02513   const T8 v8_;
02514   const T9 v9_;
02515   const T10 v10_;
02516   const T11 v11_;
02517   const T12 v12_;
02518   const T13 v13_;
02519   const T14 v14_;
02520   const T15 v15_;
02521   const T16 v16_;
02522   const T17 v17_;
02523   const T18 v18_;
02524   const T19 v19_;
02525   const T20 v20_;
02526   const T21 v21_;
02527   const T22 v22_;
02528   const T23 v23_;
02529   const T24 v24_;
02530   const T25 v25_;
02531   const T26 v26_;
02532   const T27 v27_;
02533   const T28 v28_;
02534   const T29 v29_;
02535   const T30 v30_;
02536   const T31 v31_;
02537   const T32 v32_;
02538   const T33 v33_;
02539   const T34 v34_;
02540   const T35 v35_;
02541   const T36 v36_;
02542   const T37 v37_;
02543   const T38 v38_;
02544   const T39 v39_;
02545   const T40 v40_;
02546   const T41 v41_;
02547   const T42 v42_;
02548   const T43 v43_;
02549   const T44 v44_;
02550   const T45 v45_;
02551   const T46 v46_;
02552   const T47 v47_;
02553 };
02554 
02555 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02556     typename T6, typename T7, typename T8, typename T9, typename T10,
02557     typename T11, typename T12, typename T13, typename T14, typename T15,
02558     typename T16, typename T17, typename T18, typename T19, typename T20,
02559     typename T21, typename T22, typename T23, typename T24, typename T25,
02560     typename T26, typename T27, typename T28, typename T29, typename T30,
02561     typename T31, typename T32, typename T33, typename T34, typename T35,
02562     typename T36, typename T37, typename T38, typename T39, typename T40,
02563     typename T41, typename T42, typename T43, typename T44, typename T45,
02564     typename T46, typename T47, typename T48>
02565 class ValueArray48 {
02566  public:
02567   ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02568       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02569       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02570       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02571       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02572       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
02573       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
02574       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
02575       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
02576       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
02577       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
02578       v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
02579       v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
02580       v46_(v46), v47_(v47), v48_(v48) {}
02581 
02582   template <typename T>
02583   operator ParamGenerator<T>() const {
02584     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02585         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02586         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02587         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
02588         v48_};
02589     return ValuesIn(array);
02590   }
02591 
02592  private:
02593   // No implementation - assignment is unsupported.
02594   void operator=(const ValueArray48& other);
02595 
02596   const T1 v1_;
02597   const T2 v2_;
02598   const T3 v3_;
02599   const T4 v4_;
02600   const T5 v5_;
02601   const T6 v6_;
02602   const T7 v7_;
02603   const T8 v8_;
02604   const T9 v9_;
02605   const T10 v10_;
02606   const T11 v11_;
02607   const T12 v12_;
02608   const T13 v13_;
02609   const T14 v14_;
02610   const T15 v15_;
02611   const T16 v16_;
02612   const T17 v17_;
02613   const T18 v18_;
02614   const T19 v19_;
02615   const T20 v20_;
02616   const T21 v21_;
02617   const T22 v22_;
02618   const T23 v23_;
02619   const T24 v24_;
02620   const T25 v25_;
02621   const T26 v26_;
02622   const T27 v27_;
02623   const T28 v28_;
02624   const T29 v29_;
02625   const T30 v30_;
02626   const T31 v31_;
02627   const T32 v32_;
02628   const T33 v33_;
02629   const T34 v34_;
02630   const T35 v35_;
02631   const T36 v36_;
02632   const T37 v37_;
02633   const T38 v38_;
02634   const T39 v39_;
02635   const T40 v40_;
02636   const T41 v41_;
02637   const T42 v42_;
02638   const T43 v43_;
02639   const T44 v44_;
02640   const T45 v45_;
02641   const T46 v46_;
02642   const T47 v47_;
02643   const T48 v48_;
02644 };
02645 
02646 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02647     typename T6, typename T7, typename T8, typename T9, typename T10,
02648     typename T11, typename T12, typename T13, typename T14, typename T15,
02649     typename T16, typename T17, typename T18, typename T19, typename T20,
02650     typename T21, typename T22, typename T23, typename T24, typename T25,
02651     typename T26, typename T27, typename T28, typename T29, typename T30,
02652     typename T31, typename T32, typename T33, typename T34, typename T35,
02653     typename T36, typename T37, typename T38, typename T39, typename T40,
02654     typename T41, typename T42, typename T43, typename T44, typename T45,
02655     typename T46, typename T47, typename T48, typename T49>
02656 class ValueArray49 {
02657  public:
02658   ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02659       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02660       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02661       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02662       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02663       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
02664       T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
02665       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
02666       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
02667       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
02668       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
02669       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
02670       v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
02671       v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
02672 
02673   template <typename T>
02674   operator ParamGenerator<T>() const {
02675     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02676         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02677         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02678         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
02679         v48_, v49_};
02680     return ValuesIn(array);
02681   }
02682 
02683  private:
02684   // No implementation - assignment is unsupported.
02685   void operator=(const ValueArray49& other);
02686 
02687   const T1 v1_;
02688   const T2 v2_;
02689   const T3 v3_;
02690   const T4 v4_;
02691   const T5 v5_;
02692   const T6 v6_;
02693   const T7 v7_;
02694   const T8 v8_;
02695   const T9 v9_;
02696   const T10 v10_;
02697   const T11 v11_;
02698   const T12 v12_;
02699   const T13 v13_;
02700   const T14 v14_;
02701   const T15 v15_;
02702   const T16 v16_;
02703   const T17 v17_;
02704   const T18 v18_;
02705   const T19 v19_;
02706   const T20 v20_;
02707   const T21 v21_;
02708   const T22 v22_;
02709   const T23 v23_;
02710   const T24 v24_;
02711   const T25 v25_;
02712   const T26 v26_;
02713   const T27 v27_;
02714   const T28 v28_;
02715   const T29 v29_;
02716   const T30 v30_;
02717   const T31 v31_;
02718   const T32 v32_;
02719   const T33 v33_;
02720   const T34 v34_;
02721   const T35 v35_;
02722   const T36 v36_;
02723   const T37 v37_;
02724   const T38 v38_;
02725   const T39 v39_;
02726   const T40 v40_;
02727   const T41 v41_;
02728   const T42 v42_;
02729   const T43 v43_;
02730   const T44 v44_;
02731   const T45 v45_;
02732   const T46 v46_;
02733   const T47 v47_;
02734   const T48 v48_;
02735   const T49 v49_;
02736 };
02737 
02738 template <typename T1, typename T2, typename T3, typename T4, typename T5,
02739     typename T6, typename T7, typename T8, typename T9, typename T10,
02740     typename T11, typename T12, typename T13, typename T14, typename T15,
02741     typename T16, typename T17, typename T18, typename T19, typename T20,
02742     typename T21, typename T22, typename T23, typename T24, typename T25,
02743     typename T26, typename T27, typename T28, typename T29, typename T30,
02744     typename T31, typename T32, typename T33, typename T34, typename T35,
02745     typename T36, typename T37, typename T38, typename T39, typename T40,
02746     typename T41, typename T42, typename T43, typename T44, typename T45,
02747     typename T46, typename T47, typename T48, typename T49, typename T50>
02748 class ValueArray50 {
02749  public:
02750   ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
02751       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
02752       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
02753       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
02754       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
02755       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
02756       T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
02757       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
02758       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
02759       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
02760       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
02761       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
02762       v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
02763       v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
02764 
02765   template <typename T>
02766   operator ParamGenerator<T>() const {
02767     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
02768         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
02769         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
02770         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
02771         v48_, v49_, v50_};
02772     return ValuesIn(array);
02773   }
02774 
02775  private:
02776   // No implementation - assignment is unsupported.
02777   void operator=(const ValueArray50& other);
02778 
02779   const T1 v1_;
02780   const T2 v2_;
02781   const T3 v3_;
02782   const T4 v4_;
02783   const T5 v5_;
02784   const T6 v6_;
02785   const T7 v7_;
02786   const T8 v8_;
02787   const T9 v9_;
02788   const T10 v10_;
02789   const T11 v11_;
02790   const T12 v12_;
02791   const T13 v13_;
02792   const T14 v14_;
02793   const T15 v15_;
02794   const T16 v16_;
02795   const T17 v17_;
02796   const T18 v18_;
02797   const T19 v19_;
02798   const T20 v20_;
02799   const T21 v21_;
02800   const T22 v22_;
02801   const T23 v23_;
02802   const T24 v24_;
02803   const T25 v25_;
02804   const T26 v26_;
02805   const T27 v27_;
02806   const T28 v28_;
02807   const T29 v29_;
02808   const T30 v30_;
02809   const T31 v31_;
02810   const T32 v32_;
02811   const T33 v33_;
02812   const T34 v34_;
02813   const T35 v35_;
02814   const T36 v36_;
02815   const T37 v37_;
02816   const T38 v38_;
02817   const T39 v39_;
02818   const T40 v40_;
02819   const T41 v41_;
02820   const T42 v42_;
02821   const T43 v43_;
02822   const T44 v44_;
02823   const T45 v45_;
02824   const T46 v46_;
02825   const T47 v47_;
02826   const T48 v48_;
02827   const T49 v49_;
02828   const T50 v50_;
02829 };
02830 
02831 # if GTEST_HAS_COMBINE
02832 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
02833 //
02834 // Generates values from the Cartesian product of values produced
02835 // by the argument generators.
02836 //
02837 template <typename T1, typename T2>
02838 class CartesianProductGenerator2
02839     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
02840  public:
02841   typedef ::std::tr1::tuple<T1, T2> ParamType;
02842 
02843   CartesianProductGenerator2(const ParamGenerator<T1>& g1,
02844       const ParamGenerator<T2>& g2)
02845       : g1_(g1), g2_(g2) {}
02846   virtual ~CartesianProductGenerator2() {}
02847 
02848   virtual ParamIteratorInterface<ParamType>* Begin() const {
02849     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
02850   }
02851   virtual ParamIteratorInterface<ParamType>* End() const {
02852     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
02853   }
02854 
02855  private:
02856   class Iterator : public ParamIteratorInterface<ParamType> {
02857    public:
02858     Iterator(const ParamGeneratorInterface<ParamType>* base,
02859       const ParamGenerator<T1>& g1,
02860       const typename ParamGenerator<T1>::iterator& current1,
02861       const ParamGenerator<T2>& g2,
02862       const typename ParamGenerator<T2>::iterator& current2)
02863         : base_(base),
02864           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
02865           begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
02866       ComputeCurrentValue();
02867     }
02868     virtual ~Iterator() {}
02869 
02870     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
02871       return base_;
02872     }
02873     // Advance should not be called on beyond-of-range iterators
02874     // so no component iterators must be beyond end of range, either.
02875     virtual void Advance() {
02876       assert(!AtEnd());
02877       ++current2_;
02878       if (current2_ == end2_) {
02879         current2_ = begin2_;
02880         ++current1_;
02881       }
02882       ComputeCurrentValue();
02883     }
02884     virtual ParamIteratorInterface<ParamType>* Clone() const {
02885       return new Iterator(*this);
02886     }
02887     virtual const ParamType* Current() const { return &current_value_; }
02888     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
02889       // Having the same base generator guarantees that the other
02890       // iterator is of the same type and we can downcast.
02891       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
02892           << "The program attempted to compare iterators "
02893           << "from different generators." << std::endl;
02894       const Iterator* typed_other =
02895           CheckedDowncastToActualType<const Iterator>(&other);
02896       // We must report iterators equal if they both point beyond their
02897       // respective ranges. That can happen in a variety of fashions,
02898       // so we have to consult AtEnd().
02899       return (AtEnd() && typed_other->AtEnd()) ||
02900          (
02901           current1_ == typed_other->current1_ &&
02902           current2_ == typed_other->current2_);
02903     }
02904 
02905    private:
02906     Iterator(const Iterator& other)
02907         : base_(other.base_),
02908         begin1_(other.begin1_),
02909         end1_(other.end1_),
02910         current1_(other.current1_),
02911         begin2_(other.begin2_),
02912         end2_(other.end2_),
02913         current2_(other.current2_) {
02914       ComputeCurrentValue();
02915     }
02916 
02917     void ComputeCurrentValue() {
02918       if (!AtEnd())
02919         current_value_ = ParamType(*current1_, *current2_);
02920     }
02921     bool AtEnd() const {
02922       // We must report iterator past the end of the range when either of the
02923       // component iterators has reached the end of its range.
02924       return
02925           current1_ == end1_ ||
02926           current2_ == end2_;
02927     }
02928 
02929     // No implementation - assignment is unsupported.
02930     void operator=(const Iterator& other);
02931 
02932     const ParamGeneratorInterface<ParamType>* const base_;
02933     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
02934     // current[i]_ is the actual traversing iterator.
02935     const typename ParamGenerator<T1>::iterator begin1_;
02936     const typename ParamGenerator<T1>::iterator end1_;
02937     typename ParamGenerator<T1>::iterator current1_;
02938     const typename ParamGenerator<T2>::iterator begin2_;
02939     const typename ParamGenerator<T2>::iterator end2_;
02940     typename ParamGenerator<T2>::iterator current2_;
02941     ParamType current_value_;
02942   };  // class CartesianProductGenerator2::Iterator
02943 
02944   // No implementation - assignment is unsupported.
02945   void operator=(const CartesianProductGenerator2& other);
02946 
02947   const ParamGenerator<T1> g1_;
02948   const ParamGenerator<T2> g2_;
02949 };  // class CartesianProductGenerator2
02950 
02951 
02952 template <typename T1, typename T2, typename T3>
02953 class CartesianProductGenerator3
02954     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
02955  public:
02956   typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
02957 
02958   CartesianProductGenerator3(const ParamGenerator<T1>& g1,
02959       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
02960       : g1_(g1), g2_(g2), g3_(g3) {}
02961   virtual ~CartesianProductGenerator3() {}
02962 
02963   virtual ParamIteratorInterface<ParamType>* Begin() const {
02964     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
02965         g3_.begin());
02966   }
02967   virtual ParamIteratorInterface<ParamType>* End() const {
02968     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
02969   }
02970 
02971  private:
02972   class Iterator : public ParamIteratorInterface<ParamType> {
02973    public:
02974     Iterator(const ParamGeneratorInterface<ParamType>* base,
02975       const ParamGenerator<T1>& g1,
02976       const typename ParamGenerator<T1>::iterator& current1,
02977       const ParamGenerator<T2>& g2,
02978       const typename ParamGenerator<T2>::iterator& current2,
02979       const ParamGenerator<T3>& g3,
02980       const typename ParamGenerator<T3>::iterator& current3)
02981         : base_(base),
02982           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
02983           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
02984           begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
02985       ComputeCurrentValue();
02986     }
02987     virtual ~Iterator() {}
02988 
02989     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
02990       return base_;
02991     }
02992     // Advance should not be called on beyond-of-range iterators
02993     // so no component iterators must be beyond end of range, either.
02994     virtual void Advance() {
02995       assert(!AtEnd());
02996       ++current3_;
02997       if (current3_ == end3_) {
02998         current3_ = begin3_;
02999         ++current2_;
03000       }
03001       if (current2_ == end2_) {
03002         current2_ = begin2_;
03003         ++current1_;
03004       }
03005       ComputeCurrentValue();
03006     }
03007     virtual ParamIteratorInterface<ParamType>* Clone() const {
03008       return new Iterator(*this);
03009     }
03010     virtual const ParamType* Current() const { return &current_value_; }
03011     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
03012       // Having the same base generator guarantees that the other
03013       // iterator is of the same type and we can downcast.
03014       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
03015           << "The program attempted to compare iterators "
03016           << "from different generators." << std::endl;
03017       const Iterator* typed_other =
03018           CheckedDowncastToActualType<const Iterator>(&other);
03019       // We must report iterators equal if they both point beyond their
03020       // respective ranges. That can happen in a variety of fashions,
03021       // so we have to consult AtEnd().
03022       return (AtEnd() && typed_other->AtEnd()) ||
03023          (
03024           current1_ == typed_other->current1_ &&
03025           current2_ == typed_other->current2_ &&
03026           current3_ == typed_other->current3_);
03027     }
03028 
03029    private:
03030     Iterator(const Iterator& other)
03031         : base_(other.base_),
03032         begin1_(other.begin1_),
03033         end1_(other.end1_),
03034         current1_(other.current1_),
03035         begin2_(other.begin2_),
03036         end2_(other.end2_),
03037         current2_(other.current2_),
03038         begin3_(other.begin3_),
03039         end3_(other.end3_),
03040         current3_(other.current3_) {
03041       ComputeCurrentValue();
03042     }
03043 
03044     void ComputeCurrentValue() {
03045       if (!AtEnd())
03046         current_value_ = ParamType(*current1_, *current2_, *current3_);
03047     }
03048     bool AtEnd() const {
03049       // We must report iterator past the end of the range when either of the
03050       // component iterators has reached the end of its range.
03051       return
03052           current1_ == end1_ ||
03053           current2_ == end2_ ||
03054           current3_ == end3_;
03055     }
03056 
03057     // No implementation - assignment is unsupported.
03058     void operator=(const Iterator& other);
03059 
03060     const ParamGeneratorInterface<ParamType>* const base_;
03061     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
03062     // current[i]_ is the actual traversing iterator.
03063     const typename ParamGenerator<T1>::iterator begin1_;
03064     const typename ParamGenerator<T1>::iterator end1_;
03065     typename ParamGenerator<T1>::iterator current1_;
03066     const typename ParamGenerator<T2>::iterator begin2_;
03067     const typename ParamGenerator<T2>::iterator end2_;
03068     typename ParamGenerator<T2>::iterator current2_;
03069     const typename ParamGenerator<T3>::iterator begin3_;
03070     const typename ParamGenerator<T3>::iterator end3_;
03071     typename ParamGenerator<T3>::iterator current3_;
03072     ParamType current_value_;
03073   };  // class CartesianProductGenerator3::Iterator
03074 
03075   // No implementation - assignment is unsupported.
03076   void operator=(const CartesianProductGenerator3& other);
03077 
03078   const ParamGenerator<T1> g1_;
03079   const ParamGenerator<T2> g2_;
03080   const ParamGenerator<T3> g3_;
03081 };  // class CartesianProductGenerator3
03082 
03083 
03084 template <typename T1, typename T2, typename T3, typename T4>
03085 class CartesianProductGenerator4
03086     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
03087  public:
03088   typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
03089 
03090   CartesianProductGenerator4(const ParamGenerator<T1>& g1,
03091       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
03092       const ParamGenerator<T4>& g4)
03093       : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
03094   virtual ~CartesianProductGenerator4() {}
03095 
03096   virtual ParamIteratorInterface<ParamType>* Begin() const {
03097     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
03098         g3_.begin(), g4_, g4_.begin());
03099   }
03100   virtual ParamIteratorInterface<ParamType>* End() const {
03101     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
03102         g4_, g4_.end());
03103   }
03104 
03105  private:
03106   class Iterator : public ParamIteratorInterface<ParamType> {
03107    public:
03108     Iterator(const ParamGeneratorInterface<ParamType>* base,
03109       const ParamGenerator<T1>& g1,
03110       const typename ParamGenerator<T1>::iterator& current1,
03111       const ParamGenerator<T2>& g2,
03112       const typename ParamGenerator<T2>::iterator& current2,
03113       const ParamGenerator<T3>& g3,
03114       const typename ParamGenerator<T3>::iterator& current3,
03115       const ParamGenerator<T4>& g4,
03116       const typename ParamGenerator<T4>::iterator& current4)
03117         : base_(base),
03118           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
03119           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
03120           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
03121           begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
03122       ComputeCurrentValue();
03123     }
03124     virtual ~Iterator() {}
03125 
03126     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
03127       return base_;
03128     }
03129     // Advance should not be called on beyond-of-range iterators
03130     // so no component iterators must be beyond end of range, either.
03131     virtual void Advance() {
03132       assert(!AtEnd());
03133       ++current4_;
03134       if (current4_ == end4_) {
03135         current4_ = begin4_;
03136         ++current3_;
03137       }
03138       if (current3_ == end3_) {
03139         current3_ = begin3_;
03140         ++current2_;
03141       }
03142       if (current2_ == end2_) {
03143         current2_ = begin2_;
03144         ++current1_;
03145       }
03146       ComputeCurrentValue();
03147     }
03148     virtual ParamIteratorInterface<ParamType>* Clone() const {
03149       return new Iterator(*this);
03150     }
03151     virtual const ParamType* Current() const { return &current_value_; }
03152     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
03153       // Having the same base generator guarantees that the other
03154       // iterator is of the same type and we can downcast.
03155       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
03156           << "The program attempted to compare iterators "
03157           << "from different generators." << std::endl;
03158       const Iterator* typed_other =
03159           CheckedDowncastToActualType<const Iterator>(&other);
03160       // We must report iterators equal if they both point beyond their
03161       // respective ranges. That can happen in a variety of fashions,
03162       // so we have to consult AtEnd().
03163       return (AtEnd() && typed_other->AtEnd()) ||
03164          (
03165           current1_ == typed_other->current1_ &&
03166           current2_ == typed_other->current2_ &&
03167           current3_ == typed_other->current3_ &&
03168           current4_ == typed_other->current4_);
03169     }
03170 
03171    private:
03172     Iterator(const Iterator& other)
03173         : base_(other.base_),
03174         begin1_(other.begin1_),
03175         end1_(other.end1_),
03176         current1_(other.current1_),
03177         begin2_(other.begin2_),
03178         end2_(other.end2_),
03179         current2_(other.current2_),
03180         begin3_(other.begin3_),
03181         end3_(other.end3_),
03182         current3_(other.current3_),
03183         begin4_(other.begin4_),
03184         end4_(other.end4_),
03185         current4_(other.current4_) {
03186       ComputeCurrentValue();
03187     }
03188 
03189     void ComputeCurrentValue() {
03190       if (!AtEnd())
03191         current_value_ = ParamType(*current1_, *current2_, *current3_,
03192             *current4_);
03193     }
03194     bool AtEnd() const {
03195       // We must report iterator past the end of the range when either of the
03196       // component iterators has reached the end of its range.
03197       return
03198           current1_ == end1_ ||
03199           current2_ == end2_ ||
03200           current3_ == end3_ ||
03201           current4_ == end4_;
03202     }
03203 
03204     // No implementation - assignment is unsupported.
03205     void operator=(const Iterator& other);
03206 
03207     const ParamGeneratorInterface<ParamType>* const base_;
03208     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
03209     // current[i]_ is the actual traversing iterator.
03210     const typename ParamGenerator<T1>::iterator begin1_;
03211     const typename ParamGenerator<T1>::iterator end1_;
03212     typename ParamGenerator<T1>::iterator current1_;
03213     const typename ParamGenerator<T2>::iterator begin2_;
03214     const typename ParamGenerator<T2>::iterator end2_;
03215     typename ParamGenerator<T2>::iterator current2_;
03216     const typename ParamGenerator<T3>::iterator begin3_;
03217     const typename ParamGenerator<T3>::iterator end3_;
03218     typename ParamGenerator<T3>::iterator current3_;
03219     const typename ParamGenerator<T4>::iterator begin4_;
03220     const typename ParamGenerator<T4>::iterator end4_;
03221     typename ParamGenerator<T4>::iterator current4_;
03222     ParamType current_value_;
03223   };  // class CartesianProductGenerator4::Iterator
03224 
03225   // No implementation - assignment is unsupported.
03226   void operator=(const CartesianProductGenerator4& other);
03227 
03228   const ParamGenerator<T1> g1_;
03229   const ParamGenerator<T2> g2_;
03230   const ParamGenerator<T3> g3_;
03231   const ParamGenerator<T4> g4_;
03232 };  // class CartesianProductGenerator4
03233 
03234 
03235 template <typename T1, typename T2, typename T3, typename T4, typename T5>
03236 class CartesianProductGenerator5
03237     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
03238  public:
03239   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
03240 
03241   CartesianProductGenerator5(const ParamGenerator<T1>& g1,
03242       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
03243       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
03244       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
03245   virtual ~CartesianProductGenerator5() {}
03246 
03247   virtual ParamIteratorInterface<ParamType>* Begin() const {
03248     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
03249         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
03250   }
03251   virtual ParamIteratorInterface<ParamType>* End() const {
03252     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
03253         g4_, g4_.end(), g5_, g5_.end());
03254   }
03255 
03256  private:
03257   class Iterator : public ParamIteratorInterface<ParamType> {
03258    public:
03259     Iterator(const ParamGeneratorInterface<ParamType>* base,
03260       const ParamGenerator<T1>& g1,
03261       const typename ParamGenerator<T1>::iterator& current1,
03262       const ParamGenerator<T2>& g2,
03263       const typename ParamGenerator<T2>::iterator& current2,
03264       const ParamGenerator<T3>& g3,
03265       const typename ParamGenerator<T3>::iterator& current3,
03266       const ParamGenerator<T4>& g4,
03267       const typename ParamGenerator<T4>::iterator& current4,
03268       const ParamGenerator<T5>& g5,
03269       const typename ParamGenerator<T5>::iterator& current5)
03270         : base_(base),
03271           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
03272           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
03273           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
03274           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
03275           begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
03276       ComputeCurrentValue();
03277     }
03278     virtual ~Iterator() {}
03279 
03280     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
03281       return base_;
03282     }
03283     // Advance should not be called on beyond-of-range iterators
03284     // so no component iterators must be beyond end of range, either.
03285     virtual void Advance() {
03286       assert(!AtEnd());
03287       ++current5_;
03288       if (current5_ == end5_) {
03289         current5_ = begin5_;
03290         ++current4_;
03291       }
03292       if (current4_ == end4_) {
03293         current4_ = begin4_;
03294         ++current3_;
03295       }
03296       if (current3_ == end3_) {
03297         current3_ = begin3_;
03298         ++current2_;
03299       }
03300       if (current2_ == end2_) {
03301         current2_ = begin2_;
03302         ++current1_;
03303       }
03304       ComputeCurrentValue();
03305     }
03306     virtual ParamIteratorInterface<ParamType>* Clone() const {
03307       return new Iterator(*this);
03308     }
03309     virtual const ParamType* Current() const { return &current_value_; }
03310     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
03311       // Having the same base generator guarantees that the other
03312       // iterator is of the same type and we can downcast.
03313       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
03314           << "The program attempted to compare iterators "
03315           << "from different generators." << std::endl;
03316       const Iterator* typed_other =
03317           CheckedDowncastToActualType<const Iterator>(&other);
03318       // We must report iterators equal if they both point beyond their
03319       // respective ranges. That can happen in a variety of fashions,
03320       // so we have to consult AtEnd().
03321       return (AtEnd() && typed_other->AtEnd()) ||
03322          (
03323           current1_ == typed_other->current1_ &&
03324           current2_ == typed_other->current2_ &&
03325           current3_ == typed_other->current3_ &&
03326           current4_ == typed_other->current4_ &&
03327           current5_ == typed_other->current5_);
03328     }
03329 
03330    private:
03331     Iterator(const Iterator& other)
03332         : base_(other.base_),
03333         begin1_(other.begin1_),
03334         end1_(other.end1_),
03335         current1_(other.current1_),
03336         begin2_(other.begin2_),
03337         end2_(other.end2_),
03338         current2_(other.current2_),
03339         begin3_(other.begin3_),
03340         end3_(other.end3_),
03341         current3_(other.current3_),
03342         begin4_(other.begin4_),
03343         end4_(other.end4_),
03344         current4_(other.current4_),
03345         begin5_(other.begin5_),
03346         end5_(other.end5_),
03347         current5_(other.current5_) {
03348       ComputeCurrentValue();
03349     }
03350 
03351     void ComputeCurrentValue() {
03352       if (!AtEnd())
03353         current_value_ = ParamType(*current1_, *current2_, *current3_,
03354             *current4_, *current5_);
03355     }
03356     bool AtEnd() const {
03357       // We must report iterator past the end of the range when either of the
03358       // component iterators has reached the end of its range.
03359       return
03360           current1_ == end1_ ||
03361           current2_ == end2_ ||
03362           current3_ == end3_ ||
03363           current4_ == end4_ ||
03364           current5_ == end5_;
03365     }
03366 
03367     // No implementation - assignment is unsupported.
03368     void operator=(const Iterator& other);
03369 
03370     const ParamGeneratorInterface<ParamType>* const base_;
03371     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
03372     // current[i]_ is the actual traversing iterator.
03373     const typename ParamGenerator<T1>::iterator begin1_;
03374     const typename ParamGenerator<T1>::iterator end1_;
03375     typename ParamGenerator<T1>::iterator current1_;
03376     const typename ParamGenerator<T2>::iterator begin2_;
03377     const typename ParamGenerator<T2>::iterator end2_;
03378     typename ParamGenerator<T2>::iterator current2_;
03379     const typename ParamGenerator<T3>::iterator begin3_;
03380     const typename ParamGenerator<T3>::iterator end3_;
03381     typename ParamGenerator<T3>::iterator current3_;
03382     const typename ParamGenerator<T4>::iterator begin4_;
03383     const typename ParamGenerator<T4>::iterator end4_;
03384     typename ParamGenerator<T4>::iterator current4_;
03385     const typename ParamGenerator<T5>::iterator begin5_;
03386     const typename ParamGenerator<T5>::iterator end5_;
03387     typename ParamGenerator<T5>::iterator current5_;
03388     ParamType current_value_;
03389   };  // class CartesianProductGenerator5::Iterator
03390 
03391   // No implementation - assignment is unsupported.
03392   void operator=(const CartesianProductGenerator5& other);
03393 
03394   const ParamGenerator<T1> g1_;
03395   const ParamGenerator<T2> g2_;
03396   const ParamGenerator<T3> g3_;
03397   const ParamGenerator<T4> g4_;
03398   const ParamGenerator<T5> g5_;
03399 };  // class CartesianProductGenerator5
03400 
03401 
03402 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03403     typename T6>
03404 class CartesianProductGenerator6
03405     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
03406         T6> > {
03407  public:
03408   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
03409 
03410   CartesianProductGenerator6(const ParamGenerator<T1>& g1,
03411       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
03412       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
03413       const ParamGenerator<T6>& g6)
03414       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
03415   virtual ~CartesianProductGenerator6() {}
03416 
03417   virtual ParamIteratorInterface<ParamType>* Begin() const {
03418     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
03419         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
03420   }
03421   virtual ParamIteratorInterface<ParamType>* End() const {
03422     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
03423         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
03424   }
03425 
03426  private:
03427   class Iterator : public ParamIteratorInterface<ParamType> {
03428    public:
03429     Iterator(const ParamGeneratorInterface<ParamType>* base,
03430       const ParamGenerator<T1>& g1,
03431       const typename ParamGenerator<T1>::iterator& current1,
03432       const ParamGenerator<T2>& g2,
03433       const typename ParamGenerator<T2>::iterator& current2,
03434       const ParamGenerator<T3>& g3,
03435       const typename ParamGenerator<T3>::iterator& current3,
03436       const ParamGenerator<T4>& g4,
03437       const typename ParamGenerator<T4>::iterator& current4,
03438       const ParamGenerator<T5>& g5,
03439       const typename ParamGenerator<T5>::iterator& current5,
03440       const ParamGenerator<T6>& g6,
03441       const typename ParamGenerator<T6>::iterator& current6)
03442         : base_(base),
03443           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
03444           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
03445           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
03446           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
03447           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
03448           begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
03449       ComputeCurrentValue();
03450     }
03451     virtual ~Iterator() {}
03452 
03453     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
03454       return base_;
03455     }
03456     // Advance should not be called on beyond-of-range iterators
03457     // so no component iterators must be beyond end of range, either.
03458     virtual void Advance() {
03459       assert(!AtEnd());
03460       ++current6_;
03461       if (current6_ == end6_) {
03462         current6_ = begin6_;
03463         ++current5_;
03464       }
03465       if (current5_ == end5_) {
03466         current5_ = begin5_;
03467         ++current4_;
03468       }
03469       if (current4_ == end4_) {
03470         current4_ = begin4_;
03471         ++current3_;
03472       }
03473       if (current3_ == end3_) {
03474         current3_ = begin3_;
03475         ++current2_;
03476       }
03477       if (current2_ == end2_) {
03478         current2_ = begin2_;
03479         ++current1_;
03480       }
03481       ComputeCurrentValue();
03482     }
03483     virtual ParamIteratorInterface<ParamType>* Clone() const {
03484       return new Iterator(*this);
03485     }
03486     virtual const ParamType* Current() const { return &current_value_; }
03487     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
03488       // Having the same base generator guarantees that the other
03489       // iterator is of the same type and we can downcast.
03490       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
03491           << "The program attempted to compare iterators "
03492           << "from different generators." << std::endl;
03493       const Iterator* typed_other =
03494           CheckedDowncastToActualType<const Iterator>(&other);
03495       // We must report iterators equal if they both point beyond their
03496       // respective ranges. That can happen in a variety of fashions,
03497       // so we have to consult AtEnd().
03498       return (AtEnd() && typed_other->AtEnd()) ||
03499          (
03500           current1_ == typed_other->current1_ &&
03501           current2_ == typed_other->current2_ &&
03502           current3_ == typed_other->current3_ &&
03503           current4_ == typed_other->current4_ &&
03504           current5_ == typed_other->current5_ &&
03505           current6_ == typed_other->current6_);
03506     }
03507 
03508    private:
03509     Iterator(const Iterator& other)
03510         : base_(other.base_),
03511         begin1_(other.begin1_),
03512         end1_(other.end1_),
03513         current1_(other.current1_),
03514         begin2_(other.begin2_),
03515         end2_(other.end2_),
03516         current2_(other.current2_),
03517         begin3_(other.begin3_),
03518         end3_(other.end3_),
03519         current3_(other.current3_),
03520         begin4_(other.begin4_),
03521         end4_(other.end4_),
03522         current4_(other.current4_),
03523         begin5_(other.begin5_),
03524         end5_(other.end5_),
03525         current5_(other.current5_),
03526         begin6_(other.begin6_),
03527         end6_(other.end6_),
03528         current6_(other.current6_) {
03529       ComputeCurrentValue();
03530     }
03531 
03532     void ComputeCurrentValue() {
03533       if (!AtEnd())
03534         current_value_ = ParamType(*current1_, *current2_, *current3_,
03535             *current4_, *current5_, *current6_);
03536     }
03537     bool AtEnd() const {
03538       // We must report iterator past the end of the range when either of the
03539       // component iterators has reached the end of its range.
03540       return
03541           current1_ == end1_ ||
03542           current2_ == end2_ ||
03543           current3_ == end3_ ||
03544           current4_ == end4_ ||
03545           current5_ == end5_ ||
03546           current6_ == end6_;
03547     }
03548 
03549     // No implementation - assignment is unsupported.
03550     void operator=(const Iterator& other);
03551 
03552     const ParamGeneratorInterface<ParamType>* const base_;
03553     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
03554     // current[i]_ is the actual traversing iterator.
03555     const typename ParamGenerator<T1>::iterator begin1_;
03556     const typename ParamGenerator<T1>::iterator end1_;
03557     typename ParamGenerator<T1>::iterator current1_;
03558     const typename ParamGenerator<T2>::iterator begin2_;
03559     const typename ParamGenerator<T2>::iterator end2_;
03560     typename ParamGenerator<T2>::iterator current2_;
03561     const typename ParamGenerator<T3>::iterator begin3_;
03562     const typename ParamGenerator<T3>::iterator end3_;
03563     typename ParamGenerator<T3>::iterator current3_;
03564     const typename ParamGenerator<T4>::iterator begin4_;
03565     const typename ParamGenerator<T4>::iterator end4_;
03566     typename ParamGenerator<T4>::iterator current4_;
03567     const typename ParamGenerator<T5>::iterator begin5_;
03568     const typename ParamGenerator<T5>::iterator end5_;
03569     typename ParamGenerator<T5>::iterator current5_;
03570     const typename ParamGenerator<T6>::iterator begin6_;
03571     const typename ParamGenerator<T6>::iterator end6_;
03572     typename ParamGenerator<T6>::iterator current6_;
03573     ParamType current_value_;
03574   };  // class CartesianProductGenerator6::Iterator
03575 
03576   // No implementation - assignment is unsupported.
03577   void operator=(const CartesianProductGenerator6& other);
03578 
03579   const ParamGenerator<T1> g1_;
03580   const ParamGenerator<T2> g2_;
03581   const ParamGenerator<T3> g3_;
03582   const ParamGenerator<T4> g4_;
03583   const ParamGenerator<T5> g5_;
03584   const ParamGenerator<T6> g6_;
03585 };  // class CartesianProductGenerator6
03586 
03587 
03588 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03589     typename T6, typename T7>
03590 class CartesianProductGenerator7
03591     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
03592         T7> > {
03593  public:
03594   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
03595 
03596   CartesianProductGenerator7(const ParamGenerator<T1>& g1,
03597       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
03598       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
03599       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
03600       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
03601   virtual ~CartesianProductGenerator7() {}
03602 
03603   virtual ParamIteratorInterface<ParamType>* Begin() const {
03604     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
03605         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
03606         g7_.begin());
03607   }
03608   virtual ParamIteratorInterface<ParamType>* End() const {
03609     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
03610         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
03611   }
03612 
03613  private:
03614   class Iterator : public ParamIteratorInterface<ParamType> {
03615    public:
03616     Iterator(const ParamGeneratorInterface<ParamType>* base,
03617       const ParamGenerator<T1>& g1,
03618       const typename ParamGenerator<T1>::iterator& current1,
03619       const ParamGenerator<T2>& g2,
03620       const typename ParamGenerator<T2>::iterator& current2,
03621       const ParamGenerator<T3>& g3,
03622       const typename ParamGenerator<T3>::iterator& current3,
03623       const ParamGenerator<T4>& g4,
03624       const typename ParamGenerator<T4>::iterator& current4,
03625       const ParamGenerator<T5>& g5,
03626       const typename ParamGenerator<T5>::iterator& current5,
03627       const ParamGenerator<T6>& g6,
03628       const typename ParamGenerator<T6>::iterator& current6,
03629       const ParamGenerator<T7>& g7,
03630       const typename ParamGenerator<T7>::iterator& current7)
03631         : base_(base),
03632           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
03633           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
03634           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
03635           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
03636           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
03637           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
03638           begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
03639       ComputeCurrentValue();
03640     }
03641     virtual ~Iterator() {}
03642 
03643     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
03644       return base_;
03645     }
03646     // Advance should not be called on beyond-of-range iterators
03647     // so no component iterators must be beyond end of range, either.
03648     virtual void Advance() {
03649       assert(!AtEnd());
03650       ++current7_;
03651       if (current7_ == end7_) {
03652         current7_ = begin7_;
03653         ++current6_;
03654       }
03655       if (current6_ == end6_) {
03656         current6_ = begin6_;
03657         ++current5_;
03658       }
03659       if (current5_ == end5_) {
03660         current5_ = begin5_;
03661         ++current4_;
03662       }
03663       if (current4_ == end4_) {
03664         current4_ = begin4_;
03665         ++current3_;
03666       }
03667       if (current3_ == end3_) {
03668         current3_ = begin3_;
03669         ++current2_;
03670       }
03671       if (current2_ == end2_) {
03672         current2_ = begin2_;
03673         ++current1_;
03674       }
03675       ComputeCurrentValue();
03676     }
03677     virtual ParamIteratorInterface<ParamType>* Clone() const {
03678       return new Iterator(*this);
03679     }
03680     virtual const ParamType* Current() const { return &current_value_; }
03681     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
03682       // Having the same base generator guarantees that the other
03683       // iterator is of the same type and we can downcast.
03684       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
03685           << "The program attempted to compare iterators "
03686           << "from different generators." << std::endl;
03687       const Iterator* typed_other =
03688           CheckedDowncastToActualType<const Iterator>(&other);
03689       // We must report iterators equal if they both point beyond their
03690       // respective ranges. That can happen in a variety of fashions,
03691       // so we have to consult AtEnd().
03692       return (AtEnd() && typed_other->AtEnd()) ||
03693          (
03694           current1_ == typed_other->current1_ &&
03695           current2_ == typed_other->current2_ &&
03696           current3_ == typed_other->current3_ &&
03697           current4_ == typed_other->current4_ &&
03698           current5_ == typed_other->current5_ &&
03699           current6_ == typed_other->current6_ &&
03700           current7_ == typed_other->current7_);
03701     }
03702 
03703    private:
03704     Iterator(const Iterator& other)
03705         : base_(other.base_),
03706         begin1_(other.begin1_),
03707         end1_(other.end1_),
03708         current1_(other.current1_),
03709         begin2_(other.begin2_),
03710         end2_(other.end2_),
03711         current2_(other.current2_),
03712         begin3_(other.begin3_),
03713         end3_(other.end3_),
03714         current3_(other.current3_),
03715         begin4_(other.begin4_),
03716         end4_(other.end4_),
03717         current4_(other.current4_),
03718         begin5_(other.begin5_),
03719         end5_(other.end5_),
03720         current5_(other.current5_),
03721         begin6_(other.begin6_),
03722         end6_(other.end6_),
03723         current6_(other.current6_),
03724         begin7_(other.begin7_),
03725         end7_(other.end7_),
03726         current7_(other.current7_) {
03727       ComputeCurrentValue();
03728     }
03729 
03730     void ComputeCurrentValue() {
03731       if (!AtEnd())
03732         current_value_ = ParamType(*current1_, *current2_, *current3_,
03733             *current4_, *current5_, *current6_, *current7_);
03734     }
03735     bool AtEnd() const {
03736       // We must report iterator past the end of the range when either of the
03737       // component iterators has reached the end of its range.
03738       return
03739           current1_ == end1_ ||
03740           current2_ == end2_ ||
03741           current3_ == end3_ ||
03742           current4_ == end4_ ||
03743           current5_ == end5_ ||
03744           current6_ == end6_ ||
03745           current7_ == end7_;
03746     }
03747 
03748     // No implementation - assignment is unsupported.
03749     void operator=(const Iterator& other);
03750 
03751     const ParamGeneratorInterface<ParamType>* const base_;
03752     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
03753     // current[i]_ is the actual traversing iterator.
03754     const typename ParamGenerator<T1>::iterator begin1_;
03755     const typename ParamGenerator<T1>::iterator end1_;
03756     typename ParamGenerator<T1>::iterator current1_;
03757     const typename ParamGenerator<T2>::iterator begin2_;
03758     const typename ParamGenerator<T2>::iterator end2_;
03759     typename ParamGenerator<T2>::iterator current2_;
03760     const typename ParamGenerator<T3>::iterator begin3_;
03761     const typename ParamGenerator<T3>::iterator end3_;
03762     typename ParamGenerator<T3>::iterator current3_;
03763     const typename ParamGenerator<T4>::iterator begin4_;
03764     const typename ParamGenerator<T4>::iterator end4_;
03765     typename ParamGenerator<T4>::iterator current4_;
03766     const typename ParamGenerator<T5>::iterator begin5_;
03767     const typename ParamGenerator<T5>::iterator end5_;
03768     typename ParamGenerator<T5>::iterator current5_;
03769     const typename ParamGenerator<T6>::iterator begin6_;
03770     const typename ParamGenerator<T6>::iterator end6_;
03771     typename ParamGenerator<T6>::iterator current6_;
03772     const typename ParamGenerator<T7>::iterator begin7_;
03773     const typename ParamGenerator<T7>::iterator end7_;
03774     typename ParamGenerator<T7>::iterator current7_;
03775     ParamType current_value_;
03776   };  // class CartesianProductGenerator7::Iterator
03777 
03778   // No implementation - assignment is unsupported.
03779   void operator=(const CartesianProductGenerator7& other);
03780 
03781   const ParamGenerator<T1> g1_;
03782   const ParamGenerator<T2> g2_;
03783   const ParamGenerator<T3> g3_;
03784   const ParamGenerator<T4> g4_;
03785   const ParamGenerator<T5> g5_;
03786   const ParamGenerator<T6> g6_;
03787   const ParamGenerator<T7> g7_;
03788 };  // class CartesianProductGenerator7
03789 
03790 
03791 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03792     typename T6, typename T7, typename T8>
03793 class CartesianProductGenerator8
03794     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
03795         T7, T8> > {
03796  public:
03797   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
03798 
03799   CartesianProductGenerator8(const ParamGenerator<T1>& g1,
03800       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
03801       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
03802       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
03803       const ParamGenerator<T8>& g8)
03804       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
03805           g8_(g8) {}
03806   virtual ~CartesianProductGenerator8() {}
03807 
03808   virtual ParamIteratorInterface<ParamType>* Begin() const {
03809     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
03810         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
03811         g7_.begin(), g8_, g8_.begin());
03812   }
03813   virtual ParamIteratorInterface<ParamType>* End() const {
03814     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
03815         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
03816         g8_.end());
03817   }
03818 
03819  private:
03820   class Iterator : public ParamIteratorInterface<ParamType> {
03821    public:
03822     Iterator(const ParamGeneratorInterface<ParamType>* base,
03823       const ParamGenerator<T1>& g1,
03824       const typename ParamGenerator<T1>::iterator& current1,
03825       const ParamGenerator<T2>& g2,
03826       const typename ParamGenerator<T2>::iterator& current2,
03827       const ParamGenerator<T3>& g3,
03828       const typename ParamGenerator<T3>::iterator& current3,
03829       const ParamGenerator<T4>& g4,
03830       const typename ParamGenerator<T4>::iterator& current4,
03831       const ParamGenerator<T5>& g5,
03832       const typename ParamGenerator<T5>::iterator& current5,
03833       const ParamGenerator<T6>& g6,
03834       const typename ParamGenerator<T6>::iterator& current6,
03835       const ParamGenerator<T7>& g7,
03836       const typename ParamGenerator<T7>::iterator& current7,
03837       const ParamGenerator<T8>& g8,
03838       const typename ParamGenerator<T8>::iterator& current8)
03839         : base_(base),
03840           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
03841           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
03842           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
03843           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
03844           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
03845           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
03846           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
03847           begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
03848       ComputeCurrentValue();
03849     }
03850     virtual ~Iterator() {}
03851 
03852     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
03853       return base_;
03854     }
03855     // Advance should not be called on beyond-of-range iterators
03856     // so no component iterators must be beyond end of range, either.
03857     virtual void Advance() {
03858       assert(!AtEnd());
03859       ++current8_;
03860       if (current8_ == end8_) {
03861         current8_ = begin8_;
03862         ++current7_;
03863       }
03864       if (current7_ == end7_) {
03865         current7_ = begin7_;
03866         ++current6_;
03867       }
03868       if (current6_ == end6_) {
03869         current6_ = begin6_;
03870         ++current5_;
03871       }
03872       if (current5_ == end5_) {
03873         current5_ = begin5_;
03874         ++current4_;
03875       }
03876       if (current4_ == end4_) {
03877         current4_ = begin4_;
03878         ++current3_;
03879       }
03880       if (current3_ == end3_) {
03881         current3_ = begin3_;
03882         ++current2_;
03883       }
03884       if (current2_ == end2_) {
03885         current2_ = begin2_;
03886         ++current1_;
03887       }
03888       ComputeCurrentValue();
03889     }
03890     virtual ParamIteratorInterface<ParamType>* Clone() const {
03891       return new Iterator(*this);
03892     }
03893     virtual const ParamType* Current() const { return &current_value_; }
03894     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
03895       // Having the same base generator guarantees that the other
03896       // iterator is of the same type and we can downcast.
03897       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
03898           << "The program attempted to compare iterators "
03899           << "from different generators." << std::endl;
03900       const Iterator* typed_other =
03901           CheckedDowncastToActualType<const Iterator>(&other);
03902       // We must report iterators equal if they both point beyond their
03903       // respective ranges. That can happen in a variety of fashions,
03904       // so we have to consult AtEnd().
03905       return (AtEnd() && typed_other->AtEnd()) ||
03906          (
03907           current1_ == typed_other->current1_ &&
03908           current2_ == typed_other->current2_ &&
03909           current3_ == typed_other->current3_ &&
03910           current4_ == typed_other->current4_ &&
03911           current5_ == typed_other->current5_ &&
03912           current6_ == typed_other->current6_ &&
03913           current7_ == typed_other->current7_ &&
03914           current8_ == typed_other->current8_);
03915     }
03916 
03917    private:
03918     Iterator(const Iterator& other)
03919         : base_(other.base_),
03920         begin1_(other.begin1_),
03921         end1_(other.end1_),
03922         current1_(other.current1_),
03923         begin2_(other.begin2_),
03924         end2_(other.end2_),
03925         current2_(other.current2_),
03926         begin3_(other.begin3_),
03927         end3_(other.end3_),
03928         current3_(other.current3_),
03929         begin4_(other.begin4_),
03930         end4_(other.end4_),
03931         current4_(other.current4_),
03932         begin5_(other.begin5_),
03933         end5_(other.end5_),
03934         current5_(other.current5_),
03935         begin6_(other.begin6_),
03936         end6_(other.end6_),
03937         current6_(other.current6_),
03938         begin7_(other.begin7_),
03939         end7_(other.end7_),
03940         current7_(other.current7_),
03941         begin8_(other.begin8_),
03942         end8_(other.end8_),
03943         current8_(other.current8_) {
03944       ComputeCurrentValue();
03945     }
03946 
03947     void ComputeCurrentValue() {
03948       if (!AtEnd())
03949         current_value_ = ParamType(*current1_, *current2_, *current3_,
03950             *current4_, *current5_, *current6_, *current7_, *current8_);
03951     }
03952     bool AtEnd() const {
03953       // We must report iterator past the end of the range when either of the
03954       // component iterators has reached the end of its range.
03955       return
03956           current1_ == end1_ ||
03957           current2_ == end2_ ||
03958           current3_ == end3_ ||
03959           current4_ == end4_ ||
03960           current5_ == end5_ ||
03961           current6_ == end6_ ||
03962           current7_ == end7_ ||
03963           current8_ == end8_;
03964     }
03965 
03966     // No implementation - assignment is unsupported.
03967     void operator=(const Iterator& other);
03968 
03969     const ParamGeneratorInterface<ParamType>* const base_;
03970     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
03971     // current[i]_ is the actual traversing iterator.
03972     const typename ParamGenerator<T1>::iterator begin1_;
03973     const typename ParamGenerator<T1>::iterator end1_;
03974     typename ParamGenerator<T1>::iterator current1_;
03975     const typename ParamGenerator<T2>::iterator begin2_;
03976     const typename ParamGenerator<T2>::iterator end2_;
03977     typename ParamGenerator<T2>::iterator current2_;
03978     const typename ParamGenerator<T3>::iterator begin3_;
03979     const typename ParamGenerator<T3>::iterator end3_;
03980     typename ParamGenerator<T3>::iterator current3_;
03981     const typename ParamGenerator<T4>::iterator begin4_;
03982     const typename ParamGenerator<T4>::iterator end4_;
03983     typename ParamGenerator<T4>::iterator current4_;
03984     const typename ParamGenerator<T5>::iterator begin5_;
03985     const typename ParamGenerator<T5>::iterator end5_;
03986     typename ParamGenerator<T5>::iterator current5_;
03987     const typename ParamGenerator<T6>::iterator begin6_;
03988     const typename ParamGenerator<T6>::iterator end6_;
03989     typename ParamGenerator<T6>::iterator current6_;
03990     const typename ParamGenerator<T7>::iterator begin7_;
03991     const typename ParamGenerator<T7>::iterator end7_;
03992     typename ParamGenerator<T7>::iterator current7_;
03993     const typename ParamGenerator<T8>::iterator begin8_;
03994     const typename ParamGenerator<T8>::iterator end8_;
03995     typename ParamGenerator<T8>::iterator current8_;
03996     ParamType current_value_;
03997   };  // class CartesianProductGenerator8::Iterator
03998 
03999   // No implementation - assignment is unsupported.
04000   void operator=(const CartesianProductGenerator8& other);
04001 
04002   const ParamGenerator<T1> g1_;
04003   const ParamGenerator<T2> g2_;
04004   const ParamGenerator<T3> g3_;
04005   const ParamGenerator<T4> g4_;
04006   const ParamGenerator<T5> g5_;
04007   const ParamGenerator<T6> g6_;
04008   const ParamGenerator<T7> g7_;
04009   const ParamGenerator<T8> g8_;
04010 };  // class CartesianProductGenerator8
04011 
04012 
04013 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04014     typename T6, typename T7, typename T8, typename T9>
04015 class CartesianProductGenerator9
04016     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
04017         T7, T8, T9> > {
04018  public:
04019   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
04020 
04021   CartesianProductGenerator9(const ParamGenerator<T1>& g1,
04022       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
04023       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
04024       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
04025       const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
04026       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
04027           g9_(g9) {}
04028   virtual ~CartesianProductGenerator9() {}
04029 
04030   virtual ParamIteratorInterface<ParamType>* Begin() const {
04031     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
04032         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
04033         g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
04034   }
04035   virtual ParamIteratorInterface<ParamType>* End() const {
04036     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
04037         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
04038         g8_.end(), g9_, g9_.end());
04039   }
04040 
04041  private:
04042   class Iterator : public ParamIteratorInterface<ParamType> {
04043    public:
04044     Iterator(const ParamGeneratorInterface<ParamType>* base,
04045       const ParamGenerator<T1>& g1,
04046       const typename ParamGenerator<T1>::iterator& current1,
04047       const ParamGenerator<T2>& g2,
04048       const typename ParamGenerator<T2>::iterator& current2,
04049       const ParamGenerator<T3>& g3,
04050       const typename ParamGenerator<T3>::iterator& current3,
04051       const ParamGenerator<T4>& g4,
04052       const typename ParamGenerator<T4>::iterator& current4,
04053       const ParamGenerator<T5>& g5,
04054       const typename ParamGenerator<T5>::iterator& current5,
04055       const ParamGenerator<T6>& g6,
04056       const typename ParamGenerator<T6>::iterator& current6,
04057       const ParamGenerator<T7>& g7,
04058       const typename ParamGenerator<T7>::iterator& current7,
04059       const ParamGenerator<T8>& g8,
04060       const typename ParamGenerator<T8>::iterator& current8,
04061       const ParamGenerator<T9>& g9,
04062       const typename ParamGenerator<T9>::iterator& current9)
04063         : base_(base),
04064           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
04065           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
04066           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
04067           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
04068           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
04069           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
04070           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
04071           begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
04072           begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
04073       ComputeCurrentValue();
04074     }
04075     virtual ~Iterator() {}
04076 
04077     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
04078       return base_;
04079     }
04080     // Advance should not be called on beyond-of-range iterators
04081     // so no component iterators must be beyond end of range, either.
04082     virtual void Advance() {
04083       assert(!AtEnd());
04084       ++current9_;
04085       if (current9_ == end9_) {
04086         current9_ = begin9_;
04087         ++current8_;
04088       }
04089       if (current8_ == end8_) {
04090         current8_ = begin8_;
04091         ++current7_;
04092       }
04093       if (current7_ == end7_) {
04094         current7_ = begin7_;
04095         ++current6_;
04096       }
04097       if (current6_ == end6_) {
04098         current6_ = begin6_;
04099         ++current5_;
04100       }
04101       if (current5_ == end5_) {
04102         current5_ = begin5_;
04103         ++current4_;
04104       }
04105       if (current4_ == end4_) {
04106         current4_ = begin4_;
04107         ++current3_;
04108       }
04109       if (current3_ == end3_) {
04110         current3_ = begin3_;
04111         ++current2_;
04112       }
04113       if (current2_ == end2_) {
04114         current2_ = begin2_;
04115         ++current1_;
04116       }
04117       ComputeCurrentValue();
04118     }
04119     virtual ParamIteratorInterface<ParamType>* Clone() const {
04120       return new Iterator(*this);
04121     }
04122     virtual const ParamType* Current() const { return &current_value_; }
04123     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
04124       // Having the same base generator guarantees that the other
04125       // iterator is of the same type and we can downcast.
04126       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
04127           << "The program attempted to compare iterators "
04128           << "from different generators." << std::endl;
04129       const Iterator* typed_other =
04130           CheckedDowncastToActualType<const Iterator>(&other);
04131       // We must report iterators equal if they both point beyond their
04132       // respective ranges. That can happen in a variety of fashions,
04133       // so we have to consult AtEnd().
04134       return (AtEnd() && typed_other->AtEnd()) ||
04135          (
04136           current1_ == typed_other->current1_ &&
04137           current2_ == typed_other->current2_ &&
04138           current3_ == typed_other->current3_ &&
04139           current4_ == typed_other->current4_ &&
04140           current5_ == typed_other->current5_ &&
04141           current6_ == typed_other->current6_ &&
04142           current7_ == typed_other->current7_ &&
04143           current8_ == typed_other->current8_ &&
04144           current9_ == typed_other->current9_);
04145     }
04146 
04147    private:
04148     Iterator(const Iterator& other)
04149         : base_(other.base_),
04150         begin1_(other.begin1_),
04151         end1_(other.end1_),
04152         current1_(other.current1_),
04153         begin2_(other.begin2_),
04154         end2_(other.end2_),
04155         current2_(other.current2_),
04156         begin3_(other.begin3_),
04157         end3_(other.end3_),
04158         current3_(other.current3_),
04159         begin4_(other.begin4_),
04160         end4_(other.end4_),
04161         current4_(other.current4_),
04162         begin5_(other.begin5_),
04163         end5_(other.end5_),
04164         current5_(other.current5_),
04165         begin6_(other.begin6_),
04166         end6_(other.end6_),
04167         current6_(other.current6_),
04168         begin7_(other.begin7_),
04169         end7_(other.end7_),
04170         current7_(other.current7_),
04171         begin8_(other.begin8_),
04172         end8_(other.end8_),
04173         current8_(other.current8_),
04174         begin9_(other.begin9_),
04175         end9_(other.end9_),
04176         current9_(other.current9_) {
04177       ComputeCurrentValue();
04178     }
04179 
04180     void ComputeCurrentValue() {
04181       if (!AtEnd())
04182         current_value_ = ParamType(*current1_, *current2_, *current3_,
04183             *current4_, *current5_, *current6_, *current7_, *current8_,
04184             *current9_);
04185     }
04186     bool AtEnd() const {
04187       // We must report iterator past the end of the range when either of the
04188       // component iterators has reached the end of its range.
04189       return
04190           current1_ == end1_ ||
04191           current2_ == end2_ ||
04192           current3_ == end3_ ||
04193           current4_ == end4_ ||
04194           current5_ == end5_ ||
04195           current6_ == end6_ ||
04196           current7_ == end7_ ||
04197           current8_ == end8_ ||
04198           current9_ == end9_;
04199     }
04200 
04201     // No implementation - assignment is unsupported.
04202     void operator=(const Iterator& other);
04203 
04204     const ParamGeneratorInterface<ParamType>* const base_;
04205     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
04206     // current[i]_ is the actual traversing iterator.
04207     const typename ParamGenerator<T1>::iterator begin1_;
04208     const typename ParamGenerator<T1>::iterator end1_;
04209     typename ParamGenerator<T1>::iterator current1_;
04210     const typename ParamGenerator<T2>::iterator begin2_;
04211     const typename ParamGenerator<T2>::iterator end2_;
04212     typename ParamGenerator<T2>::iterator current2_;
04213     const typename ParamGenerator<T3>::iterator begin3_;
04214     const typename ParamGenerator<T3>::iterator end3_;
04215     typename ParamGenerator<T3>::iterator current3_;
04216     const typename ParamGenerator<T4>::iterator begin4_;
04217     const typename ParamGenerator<T4>::iterator end4_;
04218     typename ParamGenerator<T4>::iterator current4_;
04219     const typename ParamGenerator<T5>::iterator begin5_;
04220     const typename ParamGenerator<T5>::iterator end5_;
04221     typename ParamGenerator<T5>::iterator current5_;
04222     const typename ParamGenerator<T6>::iterator begin6_;
04223     const typename ParamGenerator<T6>::iterator end6_;
04224     typename ParamGenerator<T6>::iterator current6_;
04225     const typename ParamGenerator<T7>::iterator begin7_;
04226     const typename ParamGenerator<T7>::iterator end7_;
04227     typename ParamGenerator<T7>::iterator current7_;
04228     const typename ParamGenerator<T8>::iterator begin8_;
04229     const typename ParamGenerator<T8>::iterator end8_;
04230     typename ParamGenerator<T8>::iterator current8_;
04231     const typename ParamGenerator<T9>::iterator begin9_;
04232     const typename ParamGenerator<T9>::iterator end9_;
04233     typename ParamGenerator<T9>::iterator current9_;
04234     ParamType current_value_;
04235   };  // class CartesianProductGenerator9::Iterator
04236 
04237   // No implementation - assignment is unsupported.
04238   void operator=(const CartesianProductGenerator9& other);
04239 
04240   const ParamGenerator<T1> g1_;
04241   const ParamGenerator<T2> g2_;
04242   const ParamGenerator<T3> g3_;
04243   const ParamGenerator<T4> g4_;
04244   const ParamGenerator<T5> g5_;
04245   const ParamGenerator<T6> g6_;
04246   const ParamGenerator<T7> g7_;
04247   const ParamGenerator<T8> g8_;
04248   const ParamGenerator<T9> g9_;
04249 };  // class CartesianProductGenerator9
04250 
04251 
04252 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04253     typename T6, typename T7, typename T8, typename T9, typename T10>
04254 class CartesianProductGenerator10
04255     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
04256         T7, T8, T9, T10> > {
04257  public:
04258   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
04259 
04260   CartesianProductGenerator10(const ParamGenerator<T1>& g1,
04261       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
04262       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
04263       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
04264       const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
04265       const ParamGenerator<T10>& g10)
04266       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
04267           g9_(g9), g10_(g10) {}
04268   virtual ~CartesianProductGenerator10() {}
04269 
04270   virtual ParamIteratorInterface<ParamType>* Begin() const {
04271     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
04272         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
04273         g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
04274   }
04275   virtual ParamIteratorInterface<ParamType>* End() const {
04276     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
04277         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
04278         g8_.end(), g9_, g9_.end(), g10_, g10_.end());
04279   }
04280 
04281  private:
04282   class Iterator : public ParamIteratorInterface<ParamType> {
04283    public:
04284     Iterator(const ParamGeneratorInterface<ParamType>* base,
04285       const ParamGenerator<T1>& g1,
04286       const typename ParamGenerator<T1>::iterator& current1,
04287       const ParamGenerator<T2>& g2,
04288       const typename ParamGenerator<T2>::iterator& current2,
04289       const ParamGenerator<T3>& g3,
04290       const typename ParamGenerator<T3>::iterator& current3,
04291       const ParamGenerator<T4>& g4,
04292       const typename ParamGenerator<T4>::iterator& current4,
04293       const ParamGenerator<T5>& g5,
04294       const typename ParamGenerator<T5>::iterator& current5,
04295       const ParamGenerator<T6>& g6,
04296       const typename ParamGenerator<T6>::iterator& current6,
04297       const ParamGenerator<T7>& g7,
04298       const typename ParamGenerator<T7>::iterator& current7,
04299       const ParamGenerator<T8>& g8,
04300       const typename ParamGenerator<T8>::iterator& current8,
04301       const ParamGenerator<T9>& g9,
04302       const typename ParamGenerator<T9>::iterator& current9,
04303       const ParamGenerator<T10>& g10,
04304       const typename ParamGenerator<T10>::iterator& current10)
04305         : base_(base),
04306           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
04307           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
04308           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
04309           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
04310           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
04311           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
04312           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
04313           begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
04314           begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
04315           begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
04316       ComputeCurrentValue();
04317     }
04318     virtual ~Iterator() {}
04319 
04320     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
04321       return base_;
04322     }
04323     // Advance should not be called on beyond-of-range iterators
04324     // so no component iterators must be beyond end of range, either.
04325     virtual void Advance() {
04326       assert(!AtEnd());
04327       ++current10_;
04328       if (current10_ == end10_) {
04329         current10_ = begin10_;
04330         ++current9_;
04331       }
04332       if (current9_ == end9_) {
04333         current9_ = begin9_;
04334         ++current8_;
04335       }
04336       if (current8_ == end8_) {
04337         current8_ = begin8_;
04338         ++current7_;
04339       }
04340       if (current7_ == end7_) {
04341         current7_ = begin7_;
04342         ++current6_;
04343       }
04344       if (current6_ == end6_) {
04345         current6_ = begin6_;
04346         ++current5_;
04347       }
04348       if (current5_ == end5_) {
04349         current5_ = begin5_;
04350         ++current4_;
04351       }
04352       if (current4_ == end4_) {
04353         current4_ = begin4_;
04354         ++current3_;
04355       }
04356       if (current3_ == end3_) {
04357         current3_ = begin3_;
04358         ++current2_;
04359       }
04360       if (current2_ == end2_) {
04361         current2_ = begin2_;
04362         ++current1_;
04363       }
04364       ComputeCurrentValue();
04365     }
04366     virtual ParamIteratorInterface<ParamType>* Clone() const {
04367       return new Iterator(*this);
04368     }
04369     virtual const ParamType* Current() const { return &current_value_; }
04370     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
04371       // Having the same base generator guarantees that the other
04372       // iterator is of the same type and we can downcast.
04373       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
04374           << "The program attempted to compare iterators "
04375           << "from different generators." << std::endl;
04376       const Iterator* typed_other =
04377           CheckedDowncastToActualType<const Iterator>(&other);
04378       // We must report iterators equal if they both point beyond their
04379       // respective ranges. That can happen in a variety of fashions,
04380       // so we have to consult AtEnd().
04381       return (AtEnd() && typed_other->AtEnd()) ||
04382          (
04383           current1_ == typed_other->current1_ &&
04384           current2_ == typed_other->current2_ &&
04385           current3_ == typed_other->current3_ &&
04386           current4_ == typed_other->current4_ &&
04387           current5_ == typed_other->current5_ &&
04388           current6_ == typed_other->current6_ &&
04389           current7_ == typed_other->current7_ &&
04390           current8_ == typed_other->current8_ &&
04391           current9_ == typed_other->current9_ &&
04392           current10_ == typed_other->current10_);
04393     }
04394 
04395    private:
04396     Iterator(const Iterator& other)
04397         : base_(other.base_),
04398         begin1_(other.begin1_),
04399         end1_(other.end1_),
04400         current1_(other.current1_),
04401         begin2_(other.begin2_),
04402         end2_(other.end2_),
04403         current2_(other.current2_),
04404         begin3_(other.begin3_),
04405         end3_(other.end3_),
04406         current3_(other.current3_),
04407         begin4_(other.begin4_),
04408         end4_(other.end4_),
04409         current4_(other.current4_),
04410         begin5_(other.begin5_),
04411         end5_(other.end5_),
04412         current5_(other.current5_),
04413         begin6_(other.begin6_),
04414         end6_(other.end6_),
04415         current6_(other.current6_),
04416         begin7_(other.begin7_),
04417         end7_(other.end7_),
04418         current7_(other.current7_),
04419         begin8_(other.begin8_),
04420         end8_(other.end8_),
04421         current8_(other.current8_),
04422         begin9_(other.begin9_),
04423         end9_(other.end9_),
04424         current9_(other.current9_),
04425         begin10_(other.begin10_),
04426         end10_(other.end10_),
04427         current10_(other.current10_) {
04428       ComputeCurrentValue();
04429     }
04430 
04431     void ComputeCurrentValue() {
04432       if (!AtEnd())
04433         current_value_ = ParamType(*current1_, *current2_, *current3_,
04434             *current4_, *current5_, *current6_, *current7_, *current8_,
04435             *current9_, *current10_);
04436     }
04437     bool AtEnd() const {
04438       // We must report iterator past the end of the range when either of the
04439       // component iterators has reached the end of its range.
04440       return
04441           current1_ == end1_ ||
04442           current2_ == end2_ ||
04443           current3_ == end3_ ||
04444           current4_ == end4_ ||
04445           current5_ == end5_ ||
04446           current6_ == end6_ ||
04447           current7_ == end7_ ||
04448           current8_ == end8_ ||
04449           current9_ == end9_ ||
04450           current10_ == end10_;
04451     }
04452 
04453     // No implementation - assignment is unsupported.
04454     void operator=(const Iterator& other);
04455 
04456     const ParamGeneratorInterface<ParamType>* const base_;
04457     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
04458     // current[i]_ is the actual traversing iterator.
04459     const typename ParamGenerator<T1>::iterator begin1_;
04460     const typename ParamGenerator<T1>::iterator end1_;
04461     typename ParamGenerator<T1>::iterator current1_;
04462     const typename ParamGenerator<T2>::iterator begin2_;
04463     const typename ParamGenerator<T2>::iterator end2_;
04464     typename ParamGenerator<T2>::iterator current2_;
04465     const typename ParamGenerator<T3>::iterator begin3_;
04466     const typename ParamGenerator<T3>::iterator end3_;
04467     typename ParamGenerator<T3>::iterator current3_;
04468     const typename ParamGenerator<T4>::iterator begin4_;
04469     const typename ParamGenerator<T4>::iterator end4_;
04470     typename ParamGenerator<T4>::iterator current4_;
04471     const typename ParamGenerator<T5>::iterator begin5_;
04472     const typename ParamGenerator<T5>::iterator end5_;
04473     typename ParamGenerator<T5>::iterator current5_;
04474     const typename ParamGenerator<T6>::iterator begin6_;
04475     const typename ParamGenerator<T6>::iterator end6_;
04476     typename ParamGenerator<T6>::iterator current6_;
04477     const typename ParamGenerator<T7>::iterator begin7_;
04478     const typename ParamGenerator<T7>::iterator end7_;
04479     typename ParamGenerator<T7>::iterator current7_;
04480     const typename ParamGenerator<T8>::iterator begin8_;
04481     const typename ParamGenerator<T8>::iterator end8_;
04482     typename ParamGenerator<T8>::iterator current8_;
04483     const typename ParamGenerator<T9>::iterator begin9_;
04484     const typename ParamGenerator<T9>::iterator end9_;
04485     typename ParamGenerator<T9>::iterator current9_;
04486     const typename ParamGenerator<T10>::iterator begin10_;
04487     const typename ParamGenerator<T10>::iterator end10_;
04488     typename ParamGenerator<T10>::iterator current10_;
04489     ParamType current_value_;
04490   };  // class CartesianProductGenerator10::Iterator
04491 
04492   // No implementation - assignment is unsupported.
04493   void operator=(const CartesianProductGenerator10& other);
04494 
04495   const ParamGenerator<T1> g1_;
04496   const ParamGenerator<T2> g2_;
04497   const ParamGenerator<T3> g3_;
04498   const ParamGenerator<T4> g4_;
04499   const ParamGenerator<T5> g5_;
04500   const ParamGenerator<T6> g6_;
04501   const ParamGenerator<T7> g7_;
04502   const ParamGenerator<T8> g8_;
04503   const ParamGenerator<T9> g9_;
04504   const ParamGenerator<T10> g10_;
04505 };  // class CartesianProductGenerator10
04506 
04507 
04508 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
04509 //
04510 // Helper classes providing Combine() with polymorphic features. They allow
04511 // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
04512 // convertible to U.
04513 //
04514 template <class Generator1, class Generator2>
04515 class CartesianProductHolder2 {
04516  public:
04517 CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
04518       : g1_(g1), g2_(g2) {}
04519   template <typename T1, typename T2>
04520   operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
04521     return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
04522         new CartesianProductGenerator2<T1, T2>(
04523         static_cast<ParamGenerator<T1> >(g1_),
04524         static_cast<ParamGenerator<T2> >(g2_)));
04525   }
04526 
04527  private:
04528   // No implementation - assignment is unsupported.
04529   void operator=(const CartesianProductHolder2& other);
04530 
04531   const Generator1 g1_;
04532   const Generator2 g2_;
04533 };  // class CartesianProductHolder2
04534 
04535 template <class Generator1, class Generator2, class Generator3>
04536 class CartesianProductHolder3 {
04537  public:
04538 CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
04539     const Generator3& g3)
04540       : g1_(g1), g2_(g2), g3_(g3) {}
04541   template <typename T1, typename T2, typename T3>
04542   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
04543     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
04544         new CartesianProductGenerator3<T1, T2, T3>(
04545         static_cast<ParamGenerator<T1> >(g1_),
04546         static_cast<ParamGenerator<T2> >(g2_),
04547         static_cast<ParamGenerator<T3> >(g3_)));
04548   }
04549 
04550  private:
04551   // No implementation - assignment is unsupported.
04552   void operator=(const CartesianProductHolder3& other);
04553 
04554   const Generator1 g1_;
04555   const Generator2 g2_;
04556   const Generator3 g3_;
04557 };  // class CartesianProductHolder3
04558 
04559 template <class Generator1, class Generator2, class Generator3,
04560     class Generator4>
04561 class CartesianProductHolder4 {
04562  public:
04563 CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
04564     const Generator3& g3, const Generator4& g4)
04565       : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
04566   template <typename T1, typename T2, typename T3, typename T4>
04567   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
04568     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
04569         new CartesianProductGenerator4<T1, T2, T3, T4>(
04570         static_cast<ParamGenerator<T1> >(g1_),
04571         static_cast<ParamGenerator<T2> >(g2_),
04572         static_cast<ParamGenerator<T3> >(g3_),
04573         static_cast<ParamGenerator<T4> >(g4_)));
04574   }
04575 
04576  private:
04577   // No implementation - assignment is unsupported.
04578   void operator=(const CartesianProductHolder4& other);
04579 
04580   const Generator1 g1_;
04581   const Generator2 g2_;
04582   const Generator3 g3_;
04583   const Generator4 g4_;
04584 };  // class CartesianProductHolder4
04585 
04586 template <class Generator1, class Generator2, class Generator3,
04587     class Generator4, class Generator5>
04588 class CartesianProductHolder5 {
04589  public:
04590 CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
04591     const Generator3& g3, const Generator4& g4, const Generator5& g5)
04592       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
04593   template <typename T1, typename T2, typename T3, typename T4, typename T5>
04594   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
04595     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
04596         new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
04597         static_cast<ParamGenerator<T1> >(g1_),
04598         static_cast<ParamGenerator<T2> >(g2_),
04599         static_cast<ParamGenerator<T3> >(g3_),
04600         static_cast<ParamGenerator<T4> >(g4_),
04601         static_cast<ParamGenerator<T5> >(g5_)));
04602   }
04603 
04604  private:
04605   // No implementation - assignment is unsupported.
04606   void operator=(const CartesianProductHolder5& other);
04607 
04608   const Generator1 g1_;
04609   const Generator2 g2_;
04610   const Generator3 g3_;
04611   const Generator4 g4_;
04612   const Generator5 g5_;
04613 };  // class CartesianProductHolder5
04614 
04615 template <class Generator1, class Generator2, class Generator3,
04616     class Generator4, class Generator5, class Generator6>
04617 class CartesianProductHolder6 {
04618  public:
04619 CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
04620     const Generator3& g3, const Generator4& g4, const Generator5& g5,
04621     const Generator6& g6)
04622       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
04623   template <typename T1, typename T2, typename T3, typename T4, typename T5,
04624       typename T6>
04625   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
04626     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
04627         new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
04628         static_cast<ParamGenerator<T1> >(g1_),
04629         static_cast<ParamGenerator<T2> >(g2_),
04630         static_cast<ParamGenerator<T3> >(g3_),
04631         static_cast<ParamGenerator<T4> >(g4_),
04632         static_cast<ParamGenerator<T5> >(g5_),
04633         static_cast<ParamGenerator<T6> >(g6_)));
04634   }
04635 
04636  private:
04637   // No implementation - assignment is unsupported.
04638   void operator=(const CartesianProductHolder6& other);
04639 
04640   const Generator1 g1_;
04641   const Generator2 g2_;
04642   const Generator3 g3_;
04643   const Generator4 g4_;
04644   const Generator5 g5_;
04645   const Generator6 g6_;
04646 };  // class CartesianProductHolder6
04647 
04648 template <class Generator1, class Generator2, class Generator3,
04649     class Generator4, class Generator5, class Generator6, class Generator7>
04650 class CartesianProductHolder7 {
04651  public:
04652 CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
04653     const Generator3& g3, const Generator4& g4, const Generator5& g5,
04654     const Generator6& g6, const Generator7& g7)
04655       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
04656   template <typename T1, typename T2, typename T3, typename T4, typename T5,
04657       typename T6, typename T7>
04658   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
04659       T7> >() const {
04660     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
04661         new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
04662         static_cast<ParamGenerator<T1> >(g1_),
04663         static_cast<ParamGenerator<T2> >(g2_),
04664         static_cast<ParamGenerator<T3> >(g3_),
04665         static_cast<ParamGenerator<T4> >(g4_),
04666         static_cast<ParamGenerator<T5> >(g5_),
04667         static_cast<ParamGenerator<T6> >(g6_),
04668         static_cast<ParamGenerator<T7> >(g7_)));
04669   }
04670 
04671  private:
04672   // No implementation - assignment is unsupported.
04673   void operator=(const CartesianProductHolder7& other);
04674 
04675   const Generator1 g1_;
04676   const Generator2 g2_;
04677   const Generator3 g3_;
04678   const Generator4 g4_;
04679   const Generator5 g5_;
04680   const Generator6 g6_;
04681   const Generator7 g7_;
04682 };  // class CartesianProductHolder7
04683 
04684 template <class Generator1, class Generator2, class Generator3,
04685     class Generator4, class Generator5, class Generator6, class Generator7,
04686     class Generator8>
04687 class CartesianProductHolder8 {
04688  public:
04689 CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
04690     const Generator3& g3, const Generator4& g4, const Generator5& g5,
04691     const Generator6& g6, const Generator7& g7, const Generator8& g8)
04692       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
04693           g8_(g8) {}
04694   template <typename T1, typename T2, typename T3, typename T4, typename T5,
04695       typename T6, typename T7, typename T8>
04696   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
04697       T8> >() const {
04698     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
04699         new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
04700         static_cast<ParamGenerator<T1> >(g1_),
04701         static_cast<ParamGenerator<T2> >(g2_),
04702         static_cast<ParamGenerator<T3> >(g3_),
04703         static_cast<ParamGenerator<T4> >(g4_),
04704         static_cast<ParamGenerator<T5> >(g5_),
04705         static_cast<ParamGenerator<T6> >(g6_),
04706         static_cast<ParamGenerator<T7> >(g7_),
04707         static_cast<ParamGenerator<T8> >(g8_)));
04708   }
04709 
04710  private:
04711   // No implementation - assignment is unsupported.
04712   void operator=(const CartesianProductHolder8& other);
04713 
04714   const Generator1 g1_;
04715   const Generator2 g2_;
04716   const Generator3 g3_;
04717   const Generator4 g4_;
04718   const Generator5 g5_;
04719   const Generator6 g6_;
04720   const Generator7 g7_;
04721   const Generator8 g8_;
04722 };  // class CartesianProductHolder8
04723 
04724 template <class Generator1, class Generator2, class Generator3,
04725     class Generator4, class Generator5, class Generator6, class Generator7,
04726     class Generator8, class Generator9>
04727 class CartesianProductHolder9 {
04728  public:
04729 CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
04730     const Generator3& g3, const Generator4& g4, const Generator5& g5,
04731     const Generator6& g6, const Generator7& g7, const Generator8& g8,
04732     const Generator9& g9)
04733       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
04734           g9_(g9) {}
04735   template <typename T1, typename T2, typename T3, typename T4, typename T5,
04736       typename T6, typename T7, typename T8, typename T9>
04737   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
04738       T9> >() const {
04739     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
04740         T9> >(
04741         new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
04742         static_cast<ParamGenerator<T1> >(g1_),
04743         static_cast<ParamGenerator<T2> >(g2_),
04744         static_cast<ParamGenerator<T3> >(g3_),
04745         static_cast<ParamGenerator<T4> >(g4_),
04746         static_cast<ParamGenerator<T5> >(g5_),
04747         static_cast<ParamGenerator<T6> >(g6_),
04748         static_cast<ParamGenerator<T7> >(g7_),
04749         static_cast<ParamGenerator<T8> >(g8_),
04750         static_cast<ParamGenerator<T9> >(g9_)));
04751   }
04752 
04753  private:
04754   // No implementation - assignment is unsupported.
04755   void operator=(const CartesianProductHolder9& other);
04756 
04757   const Generator1 g1_;
04758   const Generator2 g2_;
04759   const Generator3 g3_;
04760   const Generator4 g4_;
04761   const Generator5 g5_;
04762   const Generator6 g6_;
04763   const Generator7 g7_;
04764   const Generator8 g8_;
04765   const Generator9 g9_;
04766 };  // class CartesianProductHolder9
04767 
04768 template <class Generator1, class Generator2, class Generator3,
04769     class Generator4, class Generator5, class Generator6, class Generator7,
04770     class Generator8, class Generator9, class Generator10>
04771 class CartesianProductHolder10 {
04772  public:
04773 CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
04774     const Generator3& g3, const Generator4& g4, const Generator5& g5,
04775     const Generator6& g6, const Generator7& g7, const Generator8& g8,
04776     const Generator9& g9, const Generator10& g10)
04777       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
04778           g9_(g9), g10_(g10) {}
04779   template <typename T1, typename T2, typename T3, typename T4, typename T5,
04780       typename T6, typename T7, typename T8, typename T9, typename T10>
04781   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
04782       T9, T10> >() const {
04783     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
04784         T9, T10> >(
04785         new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
04786             T10>(
04787         static_cast<ParamGenerator<T1> >(g1_),
04788         static_cast<ParamGenerator<T2> >(g2_),
04789         static_cast<ParamGenerator<T3> >(g3_),
04790         static_cast<ParamGenerator<T4> >(g4_),
04791         static_cast<ParamGenerator<T5> >(g5_),
04792         static_cast<ParamGenerator<T6> >(g6_),
04793         static_cast<ParamGenerator<T7> >(g7_),
04794         static_cast<ParamGenerator<T8> >(g8_),
04795         static_cast<ParamGenerator<T9> >(g9_),
04796         static_cast<ParamGenerator<T10> >(g10_)));
04797   }
04798 
04799  private:
04800   // No implementation - assignment is unsupported.
04801   void operator=(const CartesianProductHolder10& other);
04802 
04803   const Generator1 g1_;
04804   const Generator2 g2_;
04805   const Generator3 g3_;
04806   const Generator4 g4_;
04807   const Generator5 g5_;
04808   const Generator6 g6_;
04809   const Generator7 g7_;
04810   const Generator8 g8_;
04811   const Generator9 g9_;
04812   const Generator10 g10_;
04813 };  // class CartesianProductHolder10
04814 
04815 # endif  // GTEST_HAS_COMBINE
04816 
04817 }  // namespace internal
04818 }  // namespace testing
04819 
04820 #endif  //  GTEST_HAS_PARAM_TEST
04821 
04822 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_


pcl
Author(s): Open Perception
autogenerated on Wed Aug 26 2015 15:24:39