46 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_    47 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_    55 #if GTEST_HAS_PARAM_TEST    61 template <
typename ForwardIterator>
    62 internal::ParamGenerator<
    63   typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
    64 ValuesIn(ForwardIterator begin, ForwardIterator end);
    66 template <
typename T, 
size_t N>
    67 internal::ParamGenerator<T> ValuesIn(
const T (&array)[
N]);
    69 template <
class Container>
    70 internal::ParamGenerator<typename Container::value_type> ValuesIn(
    71     const Container& container);
    76 template <
typename T1>
    79   explicit ValueArray1(T1 v1) : v1_(v1) {}
    82   operator ParamGenerator<T>() 
const { 
return ValuesIn(&v1_, &v1_ + 1); }
    86   void operator=(
const ValueArray1& other);
    91 template <
typename T1, 
typename T2>
    94   ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
    97   operator ParamGenerator<T>() 
const {
    98     const T array[] = {v1_, v2_};
    99     return ValuesIn(array);
   104   void operator=(
const ValueArray2& other);
   110 template <
typename T1, 
typename T2, 
typename T3>
   113   ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
   115   template <
typename T>
   116   operator ParamGenerator<T>() 
const {
   117     const T array[] = {v1_, v2_, v3_};
   118     return ValuesIn(array);
   123   void operator=(
const ValueArray3& other);
   130 template <
typename T1, 
typename T2, 
typename T3, 
typename T4>
   133   ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
   136   template <
typename T>
   137   operator ParamGenerator<T>() 
const {
   138     const T array[] = {v1_, v2_, v3_, v4_};
   139     return ValuesIn(array);
   144   void operator=(
const ValueArray4& other);
   152 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5>
   155   ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
   158   template <
typename T>
   159   operator ParamGenerator<T>() 
const {
   160     const T array[] = {v1_, v2_, v3_, v4_, v5_};
   161     return ValuesIn(array);
   166   void operator=(
const ValueArray5& other);
   175 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   179   ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
   180       v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
   182   template <
typename T>
   183   operator ParamGenerator<T>() 
const {
   184     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
   185     return ValuesIn(array);
   190   void operator=(
const ValueArray6& other);
   200 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   201     typename T6, 
typename T7>
   204   ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
   205       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
   207   template <
typename T>
   208   operator ParamGenerator<T>() 
const {
   209     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
   210     return ValuesIn(array);
   215   void operator=(
const ValueArray7& other);
   226 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   227     typename T6, 
typename T7, 
typename T8>
   230   ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
   231       T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   234   template <
typename T>
   235   operator ParamGenerator<T>() 
const {
   236     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
   237     return ValuesIn(array);
   242   void operator=(
const ValueArray8& other);
   254 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   255     typename T6, 
typename T7, 
typename T8, 
typename T9>
   258   ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
   259       T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   262   template <
typename T>
   263   operator ParamGenerator<T>() 
const {
   264     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
   265     return ValuesIn(array);
   270   void operator=(
const ValueArray9& other);
   283 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   284     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10>
   287   ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   288       T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   289       v8_(v8), v9_(v9), v10_(v10) {}
   291   template <
typename T>
   292   operator ParamGenerator<T>() 
const {
   293     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
   294     return ValuesIn(array);
   299   void operator=(
const ValueArray10& other);
   313 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   314     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   318   ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   319       T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
   320       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
   322   template <
typename T>
   323   operator ParamGenerator<T>() 
const {
   324     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
   325     return ValuesIn(array);
   330   void operator=(
const ValueArray11& other);
   345 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   346     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   347     typename T11, 
typename T12>
   350   ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   351       T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
   352       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
   354   template <
typename T>
   355   operator ParamGenerator<T>() 
const {
   356     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   358     return ValuesIn(array);
   363   void operator=(
const ValueArray12& other);
   379 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   380     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   381     typename T11, 
typename T12, 
typename T13>
   384   ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   385       T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
   386       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
   387       v12_(v12), v13_(v13) {}
   389   template <
typename T>
   390   operator ParamGenerator<T>() 
const {
   391     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   393     return ValuesIn(array);
   398   void operator=(
const ValueArray13& other);
   415 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   416     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   417     typename T11, 
typename T12, 
typename T13, 
typename T14>
   420   ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   421       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
   422       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
   423       v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
   425   template <
typename T>
   426   operator ParamGenerator<T>() 
const {
   427     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   429     return ValuesIn(array);
   434   void operator=(
const ValueArray14& other);
   452 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   453     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   454     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15>
   457   ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   458       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
   459       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
   460       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
   462   template <
typename T>
   463   operator ParamGenerator<T>() 
const {
   464     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   465         v12_, v13_, v14_, v15_};
   466     return ValuesIn(array);
   471   void operator=(
const ValueArray15& other);
   490 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   491     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   492     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   496   ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   497       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
   498       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
   499       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
   502   template <
typename T>
   503   operator ParamGenerator<T>() 
const {
   504     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   505         v12_, v13_, v14_, v15_, v16_};
   506     return ValuesIn(array);
   511   void operator=(
const ValueArray16& other);
   531 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   532     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   533     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   534     typename T16, 
typename T17>
   537   ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   538       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
   539       T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   540       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
   541       v15_(v15), v16_(v16), v17_(v17) {}
   543   template <
typename T>
   544   operator ParamGenerator<T>() 
const {
   545     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   546         v12_, v13_, v14_, v15_, v16_, v17_};
   547     return ValuesIn(array);
   552   void operator=(
const ValueArray17& other);
   573 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   574     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   575     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   576     typename T16, 
typename T17, 
typename T18>
   579   ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   580       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   581       T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   582       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
   583       v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
   585   template <
typename T>
   586   operator ParamGenerator<T>() 
const {
   587     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   588         v12_, v13_, v14_, v15_, v16_, v17_, v18_};
   589     return ValuesIn(array);
   594   void operator=(
const ValueArray18& other);
   616 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   617     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   618     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   619     typename T16, 
typename T17, 
typename T18, 
typename T19>
   622   ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   623       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   624       T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
   625       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
   626       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
   628   template <
typename T>
   629   operator ParamGenerator<T>() 
const {
   630     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   631         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
   632     return ValuesIn(array);
   637   void operator=(
const ValueArray19& other);
   660 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   661     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   662     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   663     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20>
   666   ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   667       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   668       T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
   669       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
   670       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
   671       v19_(v19), v20_(v20) {}
   673   template <
typename T>
   674   operator ParamGenerator<T>() 
const {
   675     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   676         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
   677     return ValuesIn(array);
   682   void operator=(
const ValueArray20& other);
   706 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   707     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   708     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   709     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
   713   ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   714       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   715       T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
   716       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
   717       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
   718       v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
   720   template <
typename T>
   721   operator ParamGenerator<T>() 
const {
   722     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   723         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
   724     return ValuesIn(array);
   729   void operator=(
const ValueArray21& other);
   754 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   755     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   756     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   757     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
   758     typename T21, 
typename T22>
   761   ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   762       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   763       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
   764       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
   765       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
   766       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
   768   template <
typename T>
   769   operator ParamGenerator<T>() 
const {
   770     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   771         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
   772     return ValuesIn(array);
   777   void operator=(
const ValueArray22& other);
   803 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   804     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   805     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   806     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
   807     typename T21, 
typename T22, 
typename T23>
   810   ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   811       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   812       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
   813       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
   814       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
   815       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
   818   template <
typename T>
   819   operator ParamGenerator<T>() 
const {
   820     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   821         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
   823     return ValuesIn(array);
   828   void operator=(
const ValueArray23& other);
   855 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   856     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   857     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   858     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
   859     typename T21, 
typename T22, 
typename T23, 
typename T24>
   862   ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   863       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   864       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
   865       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
   866       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
   867       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
   868       v22_(v22), v23_(v23), v24_(v24) {}
   870   template <
typename T>
   871   operator ParamGenerator<T>() 
const {
   872     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   873         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
   875     return ValuesIn(array);
   880   void operator=(
const ValueArray24& other);
   908 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   909     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   910     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   911     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
   912     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25>
   915   ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   916       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   917       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
   918       T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   919       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
   920       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
   921       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
   923   template <
typename T>
   924   operator ParamGenerator<T>() 
const {
   925     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   926         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
   928     return ValuesIn(array);
   933   void operator=(
const ValueArray25& other);
   962 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
   963     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
   964     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
   965     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
   966     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
   970   ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
   971       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
   972       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
   973       T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
   974       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
   975       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
   976       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
   978   template <
typename T>
   979   operator ParamGenerator<T>() 
const {
   980     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
   981         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
   983     return ValuesIn(array);
   988   void operator=(
const ValueArray26& other);
  1018 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1019     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1020     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1021     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1022     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1023     typename T26, 
typename T27>
  1024 class ValueArray27 {
  1026   ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1027       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1028       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1029       T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
  1030       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
  1031       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
  1032       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
  1033       v26_(v26), v27_(v27) {}
  1035   template <
typename T>
  1036   operator ParamGenerator<T>() 
const {
  1037     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1038         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1039         v24_, v25_, v26_, v27_};
  1040     return ValuesIn(array);
  1045   void operator=(
const ValueArray27& other);
  1076 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1077     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1078     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1079     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1080     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1081     typename T26, 
typename T27, 
typename T28>
  1082 class ValueArray28 {
  1084   ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1085       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1086       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1087       T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
  1088       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
  1089       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
  1090       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
  1091       v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
  1093   template <
typename T>
  1094   operator ParamGenerator<T>() 
const {
  1095     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1096         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1097         v24_, v25_, v26_, v27_, v28_};
  1098     return ValuesIn(array);
  1103   void operator=(
const ValueArray28& other);
  1135 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1136     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1137     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1138     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1139     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1140     typename T26, 
typename T27, 
typename T28, 
typename T29>
  1141 class ValueArray29 {
  1143   ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1144       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1145       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1146       T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
  1147       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
  1148       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
  1149       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
  1150       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
  1152   template <
typename T>
  1153   operator ParamGenerator<T>() 
const {
  1154     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1155         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1156         v24_, v25_, v26_, v27_, v28_, v29_};
  1157     return ValuesIn(array);
  1162   void operator=(
const ValueArray29& other);
  1195 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1196     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1197     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1198     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1199     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1200     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30>
  1201 class ValueArray30 {
  1203   ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1204       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1205       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1206       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
  1207       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
  1208       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
  1209       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
  1210       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
  1211       v29_(v29), v30_(v30) {}
  1213   template <
typename T>
  1214   operator ParamGenerator<T>() 
const {
  1215     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1216         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1217         v24_, v25_, v26_, v27_, v28_, v29_, v30_};
  1218     return ValuesIn(array);
  1223   void operator=(
const ValueArray30& other);
  1257 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1258     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1259     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1260     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1261     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1262     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1264 class ValueArray31 {
  1266   ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1267       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1268       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1269       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
  1270       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
  1271       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
  1272       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
  1273       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
  1274       v29_(v29), v30_(v30), v31_(v31) {}
  1276   template <
typename T>
  1277   operator ParamGenerator<T>() 
const {
  1278     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1279         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1280         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
  1281     return ValuesIn(array);
  1286   void operator=(
const ValueArray31& other);
  1321 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1322     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1323     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1324     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1325     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1326     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1327     typename T31, 
typename T32>
  1328 class ValueArray32 {
  1330   ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1331       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1332       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1333       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
  1334       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
  1335       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
  1336       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
  1337       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
  1338       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
  1340   template <
typename T>
  1341   operator ParamGenerator<T>() 
const {
  1342     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1343         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1344         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
  1345     return ValuesIn(array);
  1350   void operator=(
const ValueArray32& other);
  1386 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1387     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1388     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1389     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1390     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1391     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1392     typename T31, 
typename T32, 
typename T33>
  1393 class ValueArray33 {
  1395   ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1396       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1397       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1398       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
  1399       T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
  1400       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
  1401       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
  1402       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
  1403       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
  1406   template <
typename T>
  1407   operator ParamGenerator<T>() 
const {
  1408     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1409         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1410         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
  1411     return ValuesIn(array);
  1416   void operator=(
const ValueArray33& other);
  1453 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1454     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1455     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1456     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1457     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1458     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1459     typename T31, 
typename T32, 
typename T33, 
typename T34>
  1460 class ValueArray34 {
  1462   ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1463       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1464       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1465       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1466       T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
  1467       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
  1468       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
  1469       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
  1470       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
  1471       v33_(v33), v34_(v34) {}
  1473   template <
typename T>
  1474   operator ParamGenerator<T>() 
const {
  1475     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1476         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1477         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
  1478     return ValuesIn(array);
  1483   void operator=(
const ValueArray34& other);
  1521 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1522     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1523     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1524     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1525     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1526     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1527     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35>
  1528 class ValueArray35 {
  1530   ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1531       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1532       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1533       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1534       T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
  1535       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
  1536       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
  1537       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
  1538       v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
  1539       v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
  1541   template <
typename T>
  1542   operator ParamGenerator<T>() 
const {
  1543     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1544         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1545         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
  1547     return ValuesIn(array);
  1552   void operator=(
const ValueArray35& other);
  1591 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1592     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1593     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1594     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1595     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1596     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1597     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  1599 class ValueArray36 {
  1601   ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1602       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1603       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1604       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1605       T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
  1606       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
  1607       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
  1608       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
  1609       v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
  1610       v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
  1612   template <
typename T>
  1613   operator ParamGenerator<T>() 
const {
  1614     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1615         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1616         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  1618     return ValuesIn(array);
  1623   void operator=(
const ValueArray36& other);
  1663 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1664     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1665     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1666     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1667     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1668     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1669     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  1670     typename T36, 
typename T37>
  1671 class ValueArray37 {
  1673   ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1674       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1675       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1676       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1677       T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
  1678       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
  1679       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
  1680       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
  1681       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
  1682       v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
  1683       v36_(v36), v37_(v37) {}
  1685   template <
typename T>
  1686   operator ParamGenerator<T>() 
const {
  1687     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1688         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1689         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  1691     return ValuesIn(array);
  1696   void operator=(
const ValueArray37& other);
  1737 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1738     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1739     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1740     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1741     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1742     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1743     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  1744     typename T36, 
typename T37, 
typename T38>
  1745 class ValueArray38 {
  1747   ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1748       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1749       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1750       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1751       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
  1752       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
  1753       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
  1754       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
  1755       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
  1756       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
  1757       v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
  1759   template <
typename T>
  1760   operator ParamGenerator<T>() 
const {
  1761     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1762         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1763         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  1765     return ValuesIn(array);
  1770   void operator=(
const ValueArray38& other);
  1812 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1813     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1814     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1815     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1816     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1817     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1818     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  1819     typename T36, 
typename T37, 
typename T38, 
typename T39>
  1820 class ValueArray39 {
  1822   ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1823       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1824       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1825       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1826       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
  1827       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
  1828       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
  1829       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
  1830       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
  1831       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
  1832       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
  1834   template <
typename T>
  1835   operator ParamGenerator<T>() 
const {
  1836     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1837         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1838         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  1839         v36_, v37_, v38_, v39_};
  1840     return ValuesIn(array);
  1845   void operator=(
const ValueArray39& other);
  1888 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1889     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1890     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1891     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1892     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1893     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1894     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  1895     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40>
  1896 class ValueArray40 {
  1898   ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1899       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1900       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1901       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1902       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
  1903       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
  1904       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
  1905       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
  1906       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
  1907       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
  1908       v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
  1911   template <
typename T>
  1912   operator ParamGenerator<T>() 
const {
  1913     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1914         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1915         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  1916         v36_, v37_, v38_, v39_, v40_};
  1917     return ValuesIn(array);
  1922   void operator=(
const ValueArray40& other);
  1966 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  1967     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  1968     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  1969     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  1970     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  1971     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  1972     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  1973     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  1975 class ValueArray41 {
  1977   ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  1978       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  1979       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  1980       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  1981       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
  1982       T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
  1983       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
  1984       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
  1985       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
  1986       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
  1987       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
  1988       v39_(v39), v40_(v40), v41_(v41) {}
  1990   template <
typename T>
  1991   operator ParamGenerator<T>() 
const {
  1992     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  1993         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  1994         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  1995         v36_, v37_, v38_, v39_, v40_, v41_};
  1996     return ValuesIn(array);
  2001   void operator=(
const ValueArray41& other);
  2046 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2047     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2048     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2049     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2050     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2051     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2052     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2053     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2054     typename T41, 
typename T42>
  2055 class ValueArray42 {
  2057   ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2058       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2059       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2060       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2061       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2062       T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
  2063       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
  2064       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
  2065       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
  2066       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
  2067       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
  2068       v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
  2070   template <
typename T>
  2071   operator ParamGenerator<T>() 
const {
  2072     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2073         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2074         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2075         v36_, v37_, v38_, v39_, v40_, v41_, v42_};
  2076     return ValuesIn(array);
  2081   void operator=(
const ValueArray42& other);
  2127 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2128     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2129     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2130     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2131     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2132     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2133     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2134     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2135     typename T41, 
typename T42, 
typename T43>
  2136 class ValueArray43 {
  2138   ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2139       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2140       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2141       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2142       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2143       T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
  2144       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
  2145       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
  2146       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
  2147       v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
  2148       v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
  2149       v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
  2151   template <
typename T>
  2152   operator ParamGenerator<T>() 
const {
  2153     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2154         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2155         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2156         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
  2157     return ValuesIn(array);
  2162   void operator=(
const ValueArray43& other);
  2209 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2210     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2211     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2212     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2213     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2214     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2215     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2216     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2217     typename T41, 
typename T42, 
typename T43, 
typename T44>
  2218 class ValueArray44 {
  2220   ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2221       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2222       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2223       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2224       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2225       T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
  2226       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
  2227       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
  2228       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
  2229       v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
  2230       v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
  2231       v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
  2232       v43_(v43), v44_(v44) {}
  2234   template <
typename T>
  2235   operator ParamGenerator<T>() 
const {
  2236     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2237         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2238         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2239         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
  2240     return ValuesIn(array);
  2245   void operator=(
const ValueArray44& other);
  2293 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2294     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2295     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2296     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2297     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2298     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2299     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2300     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2301     typename T41, 
typename T42, 
typename T43, 
typename T44, 
typename T45>
  2302 class ValueArray45 {
  2304   ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2305       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2306       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2307       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2308       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2309       T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
  2310       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
  2311       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
  2312       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
  2313       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
  2314       v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
  2315       v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
  2316       v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
  2318   template <
typename T>
  2319   operator ParamGenerator<T>() 
const {
  2320     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2321         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2322         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2323         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
  2324     return ValuesIn(array);
  2329   void operator=(
const ValueArray45& other);
  2378 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2379     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2380     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2381     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2382     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2383     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2384     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2385     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2386     typename T41, 
typename T42, 
typename T43, 
typename T44, 
typename T45,
  2388 class ValueArray46 {
  2390   ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2391       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2392       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2393       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2394       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2395       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
  2396       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
  2397       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
  2398       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
  2399       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
  2400       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
  2401       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
  2402       v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
  2404   template <
typename T>
  2405   operator ParamGenerator<T>() 
const {
  2406     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2407         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2408         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2409         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
  2410     return ValuesIn(array);
  2415   void operator=(
const ValueArray46& other);
  2465 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2466     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2467     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2468     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2469     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2470     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2471     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2472     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2473     typename T41, 
typename T42, 
typename T43, 
typename T44, 
typename T45,
  2474     typename T46, 
typename T47>
  2475 class ValueArray47 {
  2477   ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2478       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2479       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2480       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2481       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2482       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
  2483       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
  2484       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
  2485       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
  2486       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
  2487       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
  2488       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
  2489       v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
  2492   template <
typename T>
  2493   operator ParamGenerator<T>() 
const {
  2494     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2495         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2496         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2497         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
  2499     return ValuesIn(array);
  2504   void operator=(
const ValueArray47& other);
  2555 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2556     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2557     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2558     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2559     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2560     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2561     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2562     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2563     typename T41, 
typename T42, 
typename T43, 
typename T44, 
typename T45,
  2564     typename T46, 
typename T47, 
typename T48>
  2565 class ValueArray48 {
  2567   ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2568       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2569       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2570       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2571       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2572       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
  2573       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
  2574       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
  2575       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
  2576       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
  2577       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
  2578       v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
  2579       v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
  2580       v46_(v46), v47_(v47), v48_(v48) {}
  2582   template <
typename T>
  2583   operator ParamGenerator<T>() 
const {
  2584     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2585         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2586         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2587         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
  2589     return ValuesIn(array);
  2594   void operator=(
const ValueArray48& other);
  2646 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2647     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2648     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2649     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2650     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2651     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2652     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2653     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2654     typename T41, 
typename T42, 
typename T43, 
typename T44, 
typename T45,
  2655     typename T46, 
typename T47, 
typename T48, 
typename T49>
  2656 class ValueArray49 {
  2658   ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2659       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2660       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2661       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2662       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2663       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
  2664       T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
  2665       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
  2666       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
  2667       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
  2668       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
  2669       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
  2670       v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
  2671       v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
  2673   template <
typename T>
  2674   operator ParamGenerator<T>() 
const {
  2675     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2676         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2677         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2678         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
  2680     return ValuesIn(array);
  2685   void operator=(
const ValueArray49& other);
  2738 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  2739     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10,
  2740     typename T11, 
typename T12, 
typename T13, 
typename T14, 
typename T15,
  2741     typename T16, 
typename T17, 
typename T18, 
typename T19, 
typename T20,
  2742     typename T21, 
typename T22, 
typename T23, 
typename T24, 
typename T25,
  2743     typename T26, 
typename T27, 
typename T28, 
typename T29, 
typename T30,
  2744     typename T31, 
typename T32, 
typename T33, 
typename T34, 
typename T35,
  2745     typename T36, 
typename T37, 
typename T38, 
typename T39, 
typename T40,
  2746     typename T41, 
typename T42, 
typename T43, 
typename T44, 
typename T45,
  2747     typename T46, 
typename T47, 
typename T48, 
typename T49, 
typename T50>
  2748 class ValueArray50 {
  2750   ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
  2751       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
  2752       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
  2753       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
  2754       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
  2755       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
  2756       T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
  2757       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
  2758       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
  2759       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
  2760       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
  2761       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
  2762       v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
  2763       v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
  2765   template <
typename T>
  2766   operator ParamGenerator<T>() 
const {
  2767     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
  2768         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
  2769         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
  2770         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
  2772     return ValuesIn(array);
  2777   void operator=(
const ValueArray50& other);
  2831 # if GTEST_HAS_COMBINE  2837 template <
typename T1, 
typename T2>
  2838 class CartesianProductGenerator2
  2839     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
  2841   typedef ::std::tr1::tuple<T1, T2> ParamType;
  2843   CartesianProductGenerator2(
const ParamGenerator<T1>& g1,
  2844       const ParamGenerator<T2>& g2)
  2845       : g1_(g1), g2_(g2) {}
  2846   virtual ~CartesianProductGenerator2() {}
  2848   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  2849     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin());
  2851   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  2852     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end());
  2856   class Iterator : 
public ParamIteratorInterface<ParamType> {
  2858     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  2859       const ParamGenerator<T1>& g1,
  2860       const typename ParamGenerator<T1>::iterator& current1,
  2861       const ParamGenerator<T2>& g2,
  2862       const typename ParamGenerator<T2>::iterator& current2)
  2864           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  2865           begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
  2866       ComputeCurrentValue();
  2868     virtual ~Iterator() {}
  2870     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  2875     virtual void Advance() {
  2878       if (current2_ == end2_) {
  2879         current2_ = begin2_;
  2882       ComputeCurrentValue();
  2884     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  2885       return new Iterator(*
this);
  2887     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  2888     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  2892           << 
"The program attempted to compare iterators "  2893           << 
"from different generators." << std::endl;
  2894       const Iterator* typed_other =
  2895           CheckedDowncastToActualType<const Iterator>(&other);
  2899       return (AtEnd() && typed_other->AtEnd()) ||
  2901           current1_ == typed_other->current1_ &&
  2902           current2_ == typed_other->current2_);
  2906     Iterator(
const Iterator& other)
  2907         : base_(other.base_),
  2908         begin1_(other.begin1_),
  2910         current1_(other.current1_),
  2911         begin2_(other.begin2_),
  2913         current2_(other.current2_) {
  2914       ComputeCurrentValue();
  2917     void ComputeCurrentValue() {
  2919         current_value_ = ParamType(*current1_, *current2_);
  2921     bool AtEnd()
 const {
  2925           current1_ == end1_ ||
  2930     void operator=(
const Iterator& other);
  2932     const ParamGeneratorInterface<ParamType>* 
const base_;
  2935     const typename ParamGenerator<T1>::iterator begin1_;
  2936     const typename ParamGenerator<T1>::iterator end1_;
  2937     typename ParamGenerator<T1>::iterator current1_;
  2938     const typename ParamGenerator<T2>::iterator begin2_;
  2939     const typename ParamGenerator<T2>::iterator end2_;
  2940     typename ParamGenerator<T2>::iterator current2_;
  2941     ParamType current_value_;
  2945   void operator=(
const CartesianProductGenerator2& other);
  2947   const ParamGenerator<T1> g1_;
  2948   const ParamGenerator<T2> g2_;
  2952 template <
typename T1, 
typename T2, 
typename T3>
  2953 class CartesianProductGenerator3
  2954     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
  2956   typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
  2958   CartesianProductGenerator3(
const ParamGenerator<T1>& g1,
  2959       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3)
  2960       : g1_(g1), g2_(g2), g3_(g3) {}
  2961   virtual ~CartesianProductGenerator3() {}
  2963   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  2964     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  2967   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  2968     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
  2972   class Iterator : 
public ParamIteratorInterface<ParamType> {
  2974     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  2975       const ParamGenerator<T1>& g1,
  2976       const typename ParamGenerator<T1>::iterator& current1,
  2977       const ParamGenerator<T2>& g2,
  2978       const typename ParamGenerator<T2>::iterator& current2,
  2979       const ParamGenerator<T3>& g3,
  2980       const typename ParamGenerator<T3>::iterator& current3)
  2982           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  2983           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  2984           begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
  2985       ComputeCurrentValue();
  2987     virtual ~Iterator() {}
  2989     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  2994     virtual void Advance() {
  2997       if (current3_ == end3_) {
  2998         current3_ = begin3_;
  3001       if (current2_ == end2_) {
  3002         current2_ = begin2_;
  3005       ComputeCurrentValue();
  3007     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  3008       return new Iterator(*
this);
  3010     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  3011     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  3015           << 
"The program attempted to compare iterators "  3016           << 
"from different generators." << std::endl;
  3017       const Iterator* typed_other =
  3018           CheckedDowncastToActualType<const Iterator>(&other);
  3022       return (AtEnd() && typed_other->AtEnd()) ||
  3024           current1_ == typed_other->current1_ &&
  3025           current2_ == typed_other->current2_ &&
  3026           current3_ == typed_other->current3_);
  3030     Iterator(
const Iterator& other)
  3031         : base_(other.base_),
  3032         begin1_(other.begin1_),
  3034         current1_(other.current1_),
  3035         begin2_(other.begin2_),
  3037         current2_(other.current2_),
  3038         begin3_(other.begin3_),
  3040         current3_(other.current3_) {
  3041       ComputeCurrentValue();
  3044     void ComputeCurrentValue() {
  3046         current_value_ = ParamType(*current1_, *current2_, *current3_);
  3048     bool AtEnd()
 const {
  3052           current1_ == end1_ ||
  3053           current2_ == end2_ ||
  3058     void operator=(
const Iterator& other);
  3060     const ParamGeneratorInterface<ParamType>* 
const base_;
  3063     const typename ParamGenerator<T1>::iterator begin1_;
  3064     const typename ParamGenerator<T1>::iterator end1_;
  3065     typename ParamGenerator<T1>::iterator current1_;
  3066     const typename ParamGenerator<T2>::iterator begin2_;
  3067     const typename ParamGenerator<T2>::iterator end2_;
  3068     typename ParamGenerator<T2>::iterator current2_;
  3069     const typename ParamGenerator<T3>::iterator begin3_;
  3070     const typename ParamGenerator<T3>::iterator end3_;
  3071     typename ParamGenerator<T3>::iterator current3_;
  3072     ParamType current_value_;
  3076   void operator=(
const CartesianProductGenerator3& other);
  3078   const ParamGenerator<T1> g1_;
  3079   const ParamGenerator<T2> g2_;
  3080   const ParamGenerator<T3> g3_;
  3084 template <
typename T1, 
typename T2, 
typename T3, 
typename T4>
  3085 class CartesianProductGenerator4
  3086     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
  3088   typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
  3090   CartesianProductGenerator4(
const ParamGenerator<T1>& g1,
  3091       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  3092       const ParamGenerator<T4>& g4)
  3093       : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
  3094   virtual ~CartesianProductGenerator4() {}
  3096   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  3097     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  3098         g3_.begin(), g4_, g4_.begin());
  3100   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  3101     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  3106   class Iterator : 
public ParamIteratorInterface<ParamType> {
  3108     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  3109       const ParamGenerator<T1>& g1,
  3110       const typename ParamGenerator<T1>::iterator& current1,
  3111       const ParamGenerator<T2>& g2,
  3112       const typename ParamGenerator<T2>::iterator& current2,
  3113       const ParamGenerator<T3>& g3,
  3114       const typename ParamGenerator<T3>::iterator& current3,
  3115       const ParamGenerator<T4>& g4,
  3116       const typename ParamGenerator<T4>::iterator& current4)
  3118           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  3119           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  3120           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  3121           begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
  3122       ComputeCurrentValue();
  3124     virtual ~Iterator() {}
  3126     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  3131     virtual void Advance() {
  3134       if (current4_ == end4_) {
  3135         current4_ = begin4_;
  3138       if (current3_ == end3_) {
  3139         current3_ = begin3_;
  3142       if (current2_ == end2_) {
  3143         current2_ = begin2_;
  3146       ComputeCurrentValue();
  3148     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  3149       return new Iterator(*
this);
  3151     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  3152     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  3156           << 
"The program attempted to compare iterators "  3157           << 
"from different generators." << std::endl;
  3158       const Iterator* typed_other =
  3159           CheckedDowncastToActualType<const Iterator>(&other);
  3163       return (AtEnd() && typed_other->AtEnd()) ||
  3165           current1_ == typed_other->current1_ &&
  3166           current2_ == typed_other->current2_ &&
  3167           current3_ == typed_other->current3_ &&
  3168           current4_ == typed_other->current4_);
  3172     Iterator(
const Iterator& other)
  3173         : base_(other.base_),
  3174         begin1_(other.begin1_),
  3176         current1_(other.current1_),
  3177         begin2_(other.begin2_),
  3179         current2_(other.current2_),
  3180         begin3_(other.begin3_),
  3182         current3_(other.current3_),
  3183         begin4_(other.begin4_),
  3185         current4_(other.current4_) {
  3186       ComputeCurrentValue();
  3189     void ComputeCurrentValue() {
  3191         current_value_ = ParamType(*current1_, *current2_, *current3_,
  3194     bool AtEnd()
 const {
  3198           current1_ == end1_ ||
  3199           current2_ == end2_ ||
  3200           current3_ == end3_ ||
  3205     void operator=(
const Iterator& other);
  3207     const ParamGeneratorInterface<ParamType>* 
const base_;
  3210     const typename ParamGenerator<T1>::iterator begin1_;
  3211     const typename ParamGenerator<T1>::iterator end1_;
  3212     typename ParamGenerator<T1>::iterator current1_;
  3213     const typename ParamGenerator<T2>::iterator begin2_;
  3214     const typename ParamGenerator<T2>::iterator end2_;
  3215     typename ParamGenerator<T2>::iterator current2_;
  3216     const typename ParamGenerator<T3>::iterator begin3_;
  3217     const typename ParamGenerator<T3>::iterator end3_;
  3218     typename ParamGenerator<T3>::iterator current3_;
  3219     const typename ParamGenerator<T4>::iterator begin4_;
  3220     const typename ParamGenerator<T4>::iterator end4_;
  3221     typename ParamGenerator<T4>::iterator current4_;
  3222     ParamType current_value_;
  3226   void operator=(
const CartesianProductGenerator4& other);
  3228   const ParamGenerator<T1> g1_;
  3229   const ParamGenerator<T2> g2_;
  3230   const ParamGenerator<T3> g3_;
  3231   const ParamGenerator<T4> g4_;
  3235 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5>
  3236 class CartesianProductGenerator5
  3237     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
  3239   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
  3241   CartesianProductGenerator5(
const ParamGenerator<T1>& g1,
  3242       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  3243       const ParamGenerator<T4>& g4, 
const ParamGenerator<T5>& g5)
  3244       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
  3245   virtual ~CartesianProductGenerator5() {}
  3247   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  3248     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  3249         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
  3251   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  3252     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  3253         g4_, g4_.end(), g5_, g5_.end());
  3257   class Iterator : 
public ParamIteratorInterface<ParamType> {
  3259     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  3260       const ParamGenerator<T1>& g1,
  3261       const typename ParamGenerator<T1>::iterator& current1,
  3262       const ParamGenerator<T2>& g2,
  3263       const typename ParamGenerator<T2>::iterator& current2,
  3264       const ParamGenerator<T3>& g3,
  3265       const typename ParamGenerator<T3>::iterator& current3,
  3266       const ParamGenerator<T4>& g4,
  3267       const typename ParamGenerator<T4>::iterator& current4,
  3268       const ParamGenerator<T5>& g5,
  3269       const typename ParamGenerator<T5>::iterator& current5)
  3271           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  3272           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  3273           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  3274           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
  3275           begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
  3276       ComputeCurrentValue();
  3278     virtual ~Iterator() {}
  3280     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  3285     virtual void Advance() {
  3288       if (current5_ == end5_) {
  3289         current5_ = begin5_;
  3292       if (current4_ == end4_) {
  3293         current4_ = begin4_;
  3296       if (current3_ == end3_) {
  3297         current3_ = begin3_;
  3300       if (current2_ == end2_) {
  3301         current2_ = begin2_;
  3304       ComputeCurrentValue();
  3306     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  3307       return new Iterator(*
this);
  3309     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  3310     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  3314           << 
"The program attempted to compare iterators "  3315           << 
"from different generators." << std::endl;
  3316       const Iterator* typed_other =
  3317           CheckedDowncastToActualType<const Iterator>(&other);
  3321       return (AtEnd() && typed_other->AtEnd()) ||
  3323           current1_ == typed_other->current1_ &&
  3324           current2_ == typed_other->current2_ &&
  3325           current3_ == typed_other->current3_ &&
  3326           current4_ == typed_other->current4_ &&
  3327           current5_ == typed_other->current5_);
  3331     Iterator(
const Iterator& other)
  3332         : base_(other.base_),
  3333         begin1_(other.begin1_),
  3335         current1_(other.current1_),
  3336         begin2_(other.begin2_),
  3338         current2_(other.current2_),
  3339         begin3_(other.begin3_),
  3341         current3_(other.current3_),
  3342         begin4_(other.begin4_),
  3344         current4_(other.current4_),
  3345         begin5_(other.begin5_),
  3347         current5_(other.current5_) {
  3348       ComputeCurrentValue();
  3351     void ComputeCurrentValue() {
  3353         current_value_ = ParamType(*current1_, *current2_, *current3_,
  3354             *current4_, *current5_);
  3356     bool AtEnd()
 const {
  3360           current1_ == end1_ ||
  3361           current2_ == end2_ ||
  3362           current3_ == end3_ ||
  3363           current4_ == end4_ ||
  3368     void operator=(
const Iterator& other);
  3370     const ParamGeneratorInterface<ParamType>* 
const base_;
  3373     const typename ParamGenerator<T1>::iterator begin1_;
  3374     const typename ParamGenerator<T1>::iterator end1_;
  3375     typename ParamGenerator<T1>::iterator current1_;
  3376     const typename ParamGenerator<T2>::iterator begin2_;
  3377     const typename ParamGenerator<T2>::iterator end2_;
  3378     typename ParamGenerator<T2>::iterator current2_;
  3379     const typename ParamGenerator<T3>::iterator begin3_;
  3380     const typename ParamGenerator<T3>::iterator end3_;
  3381     typename ParamGenerator<T3>::iterator current3_;
  3382     const typename ParamGenerator<T4>::iterator begin4_;
  3383     const typename ParamGenerator<T4>::iterator end4_;
  3384     typename ParamGenerator<T4>::iterator current4_;
  3385     const typename ParamGenerator<T5>::iterator begin5_;
  3386     const typename ParamGenerator<T5>::iterator end5_;
  3387     typename ParamGenerator<T5>::iterator current5_;
  3388     ParamType current_value_;
  3392   void operator=(
const CartesianProductGenerator5& other);
  3394   const ParamGenerator<T1> g1_;
  3395   const ParamGenerator<T2> g2_;
  3396   const ParamGenerator<T3> g3_;
  3397   const ParamGenerator<T4> g4_;
  3398   const ParamGenerator<T5> g5_;
  3402 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  3404 class CartesianProductGenerator6
  3405     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
  3408   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
  3410   CartesianProductGenerator6(
const ParamGenerator<T1>& g1,
  3411       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  3412       const ParamGenerator<T4>& g4, 
const ParamGenerator<T5>& g5,
  3413       const ParamGenerator<T6>& g6)
  3414       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
  3415   virtual ~CartesianProductGenerator6() {}
  3417   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  3418     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  3419         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
  3421   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  3422     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  3423         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
  3427   class Iterator : 
public ParamIteratorInterface<ParamType> {
  3429     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  3430       const ParamGenerator<T1>& g1,
  3431       const typename ParamGenerator<T1>::iterator& current1,
  3432       const ParamGenerator<T2>& g2,
  3433       const typename ParamGenerator<T2>::iterator& current2,
  3434       const ParamGenerator<T3>& g3,
  3435       const typename ParamGenerator<T3>::iterator& current3,
  3436       const ParamGenerator<T4>& g4,
  3437       const typename ParamGenerator<T4>::iterator& current4,
  3438       const ParamGenerator<T5>& g5,
  3439       const typename ParamGenerator<T5>::iterator& current5,
  3440       const ParamGenerator<T6>& g6,
  3441       const typename ParamGenerator<T6>::iterator& current6)
  3443           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  3444           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  3445           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  3446           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
  3447           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
  3448           begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
  3449       ComputeCurrentValue();
  3451     virtual ~Iterator() {}
  3453     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  3458     virtual void Advance() {
  3461       if (current6_ == end6_) {
  3462         current6_ = begin6_;
  3465       if (current5_ == end5_) {
  3466         current5_ = begin5_;
  3469       if (current4_ == end4_) {
  3470         current4_ = begin4_;
  3473       if (current3_ == end3_) {
  3474         current3_ = begin3_;
  3477       if (current2_ == end2_) {
  3478         current2_ = begin2_;
  3481       ComputeCurrentValue();
  3483     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  3484       return new Iterator(*
this);
  3486     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  3487     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  3491           << 
"The program attempted to compare iterators "  3492           << 
"from different generators." << std::endl;
  3493       const Iterator* typed_other =
  3494           CheckedDowncastToActualType<const Iterator>(&other);
  3498       return (AtEnd() && typed_other->AtEnd()) ||
  3500           current1_ == typed_other->current1_ &&
  3501           current2_ == typed_other->current2_ &&
  3502           current3_ == typed_other->current3_ &&
  3503           current4_ == typed_other->current4_ &&
  3504           current5_ == typed_other->current5_ &&
  3505           current6_ == typed_other->current6_);
  3509     Iterator(
const Iterator& other)
  3510         : base_(other.base_),
  3511         begin1_(other.begin1_),
  3513         current1_(other.current1_),
  3514         begin2_(other.begin2_),
  3516         current2_(other.current2_),
  3517         begin3_(other.begin3_),
  3519         current3_(other.current3_),
  3520         begin4_(other.begin4_),
  3522         current4_(other.current4_),
  3523         begin5_(other.begin5_),
  3525         current5_(other.current5_),
  3526         begin6_(other.begin6_),
  3528         current6_(other.current6_) {
  3529       ComputeCurrentValue();
  3532     void ComputeCurrentValue() {
  3534         current_value_ = ParamType(*current1_, *current2_, *current3_,
  3535             *current4_, *current5_, *current6_);
  3537     bool AtEnd()
 const {
  3541           current1_ == end1_ ||
  3542           current2_ == end2_ ||
  3543           current3_ == end3_ ||
  3544           current4_ == end4_ ||
  3545           current5_ == end5_ ||
  3550     void operator=(
const Iterator& other);
  3552     const ParamGeneratorInterface<ParamType>* 
const base_;
  3555     const typename ParamGenerator<T1>::iterator begin1_;
  3556     const typename ParamGenerator<T1>::iterator end1_;
  3557     typename ParamGenerator<T1>::iterator current1_;
  3558     const typename ParamGenerator<T2>::iterator begin2_;
  3559     const typename ParamGenerator<T2>::iterator end2_;
  3560     typename ParamGenerator<T2>::iterator current2_;
  3561     const typename ParamGenerator<T3>::iterator begin3_;
  3562     const typename ParamGenerator<T3>::iterator end3_;
  3563     typename ParamGenerator<T3>::iterator current3_;
  3564     const typename ParamGenerator<T4>::iterator begin4_;
  3565     const typename ParamGenerator<T4>::iterator end4_;
  3566     typename ParamGenerator<T4>::iterator current4_;
  3567     const typename ParamGenerator<T5>::iterator begin5_;
  3568     const typename ParamGenerator<T5>::iterator end5_;
  3569     typename ParamGenerator<T5>::iterator current5_;
  3570     const typename ParamGenerator<T6>::iterator begin6_;
  3571     const typename ParamGenerator<T6>::iterator end6_;
  3572     typename ParamGenerator<T6>::iterator current6_;
  3573     ParamType current_value_;
  3577   void operator=(
const CartesianProductGenerator6& other);
  3579   const ParamGenerator<T1> g1_;
  3580   const ParamGenerator<T2> g2_;
  3581   const ParamGenerator<T3> g3_;
  3582   const ParamGenerator<T4> g4_;
  3583   const ParamGenerator<T5> g5_;
  3584   const ParamGenerator<T6> g6_;
  3588 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  3589     typename T6, 
typename T7>
  3590 class CartesianProductGenerator7
  3591     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
  3594   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
  3596   CartesianProductGenerator7(
const ParamGenerator<T1>& g1,
  3597       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  3598       const ParamGenerator<T4>& g4, 
const ParamGenerator<T5>& g5,
  3599       const ParamGenerator<T6>& g6, 
const ParamGenerator<T7>& g7)
  3600       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
  3601   virtual ~CartesianProductGenerator7() {}
  3603   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  3604     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  3605         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
  3608   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  3609     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  3610         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
  3614   class Iterator : 
public ParamIteratorInterface<ParamType> {
  3616     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  3617       const ParamGenerator<T1>& g1,
  3618       const typename ParamGenerator<T1>::iterator& current1,
  3619       const ParamGenerator<T2>& g2,
  3620       const typename ParamGenerator<T2>::iterator& current2,
  3621       const ParamGenerator<T3>& g3,
  3622       const typename ParamGenerator<T3>::iterator& current3,
  3623       const ParamGenerator<T4>& g4,
  3624       const typename ParamGenerator<T4>::iterator& current4,
  3625       const ParamGenerator<T5>& g5,
  3626       const typename ParamGenerator<T5>::iterator& current5,
  3627       const ParamGenerator<T6>& g6,
  3628       const typename ParamGenerator<T6>::iterator& current6,
  3629       const ParamGenerator<T7>& g7,
  3630       const typename ParamGenerator<T7>::iterator& current7)
  3632           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  3633           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  3634           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  3635           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
  3636           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
  3637           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
  3638           begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
  3639       ComputeCurrentValue();
  3641     virtual ~Iterator() {}
  3643     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  3648     virtual void Advance() {
  3651       if (current7_ == end7_) {
  3652         current7_ = begin7_;
  3655       if (current6_ == end6_) {
  3656         current6_ = begin6_;
  3659       if (current5_ == end5_) {
  3660         current5_ = begin5_;
  3663       if (current4_ == end4_) {
  3664         current4_ = begin4_;
  3667       if (current3_ == end3_) {
  3668         current3_ = begin3_;
  3671       if (current2_ == end2_) {
  3672         current2_ = begin2_;
  3675       ComputeCurrentValue();
  3677     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  3678       return new Iterator(*
this);
  3680     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  3681     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  3685           << 
"The program attempted to compare iterators "  3686           << 
"from different generators." << std::endl;
  3687       const Iterator* typed_other =
  3688           CheckedDowncastToActualType<const Iterator>(&other);
  3692       return (AtEnd() && typed_other->AtEnd()) ||
  3694           current1_ == typed_other->current1_ &&
  3695           current2_ == typed_other->current2_ &&
  3696           current3_ == typed_other->current3_ &&
  3697           current4_ == typed_other->current4_ &&
  3698           current5_ == typed_other->current5_ &&
  3699           current6_ == typed_other->current6_ &&
  3700           current7_ == typed_other->current7_);
  3704     Iterator(
const Iterator& other)
  3705         : base_(other.base_),
  3706         begin1_(other.begin1_),
  3708         current1_(other.current1_),
  3709         begin2_(other.begin2_),
  3711         current2_(other.current2_),
  3712         begin3_(other.begin3_),
  3714         current3_(other.current3_),
  3715         begin4_(other.begin4_),
  3717         current4_(other.current4_),
  3718         begin5_(other.begin5_),
  3720         current5_(other.current5_),
  3721         begin6_(other.begin6_),
  3723         current6_(other.current6_),
  3724         begin7_(other.begin7_),
  3726         current7_(other.current7_) {
  3727       ComputeCurrentValue();
  3730     void ComputeCurrentValue() {
  3732         current_value_ = ParamType(*current1_, *current2_, *current3_,
  3733             *current4_, *current5_, *current6_, *current7_);
  3735     bool AtEnd()
 const {
  3739           current1_ == end1_ ||
  3740           current2_ == end2_ ||
  3741           current3_ == end3_ ||
  3742           current4_ == end4_ ||
  3743           current5_ == end5_ ||
  3744           current6_ == end6_ ||
  3749     void operator=(
const Iterator& other);
  3751     const ParamGeneratorInterface<ParamType>* 
const base_;
  3754     const typename ParamGenerator<T1>::iterator begin1_;
  3755     const typename ParamGenerator<T1>::iterator end1_;
  3756     typename ParamGenerator<T1>::iterator current1_;
  3757     const typename ParamGenerator<T2>::iterator begin2_;
  3758     const typename ParamGenerator<T2>::iterator end2_;
  3759     typename ParamGenerator<T2>::iterator current2_;
  3760     const typename ParamGenerator<T3>::iterator begin3_;
  3761     const typename ParamGenerator<T3>::iterator end3_;
  3762     typename ParamGenerator<T3>::iterator current3_;
  3763     const typename ParamGenerator<T4>::iterator begin4_;
  3764     const typename ParamGenerator<T4>::iterator end4_;
  3765     typename ParamGenerator<T4>::iterator current4_;
  3766     const typename ParamGenerator<T5>::iterator begin5_;
  3767     const typename ParamGenerator<T5>::iterator end5_;
  3768     typename ParamGenerator<T5>::iterator current5_;
  3769     const typename ParamGenerator<T6>::iterator begin6_;
  3770     const typename ParamGenerator<T6>::iterator end6_;
  3771     typename ParamGenerator<T6>::iterator current6_;
  3772     const typename ParamGenerator<T7>::iterator begin7_;
  3773     const typename ParamGenerator<T7>::iterator end7_;
  3774     typename ParamGenerator<T7>::iterator current7_;
  3775     ParamType current_value_;
  3779   void operator=(
const CartesianProductGenerator7& other);
  3781   const ParamGenerator<T1> g1_;
  3782   const ParamGenerator<T2> g2_;
  3783   const ParamGenerator<T3> g3_;
  3784   const ParamGenerator<T4> g4_;
  3785   const ParamGenerator<T5> g5_;
  3786   const ParamGenerator<T6> g6_;
  3787   const ParamGenerator<T7> g7_;
  3791 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  3792     typename T6, 
typename T7, 
typename T8>
  3793 class CartesianProductGenerator8
  3794     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
  3797   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
  3799   CartesianProductGenerator8(
const ParamGenerator<T1>& g1,
  3800       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  3801       const ParamGenerator<T4>& g4, 
const ParamGenerator<T5>& g5,
  3802       const ParamGenerator<T6>& g6, 
const ParamGenerator<T7>& g7,
  3803       const ParamGenerator<T8>& g8)
  3804       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
  3806   virtual ~CartesianProductGenerator8() {}
  3808   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  3809     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  3810         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
  3811         g7_.begin(), g8_, g8_.begin());
  3813   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  3814     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  3815         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
  3820   class Iterator : 
public ParamIteratorInterface<ParamType> {
  3822     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  3823       const ParamGenerator<T1>& g1,
  3824       const typename ParamGenerator<T1>::iterator& current1,
  3825       const ParamGenerator<T2>& g2,
  3826       const typename ParamGenerator<T2>::iterator& current2,
  3827       const ParamGenerator<T3>& g3,
  3828       const typename ParamGenerator<T3>::iterator& current3,
  3829       const ParamGenerator<T4>& g4,
  3830       const typename ParamGenerator<T4>::iterator& current4,
  3831       const ParamGenerator<T5>& g5,
  3832       const typename ParamGenerator<T5>::iterator& current5,
  3833       const ParamGenerator<T6>& g6,
  3834       const typename ParamGenerator<T6>::iterator& current6,
  3835       const ParamGenerator<T7>& g7,
  3836       const typename ParamGenerator<T7>::iterator& current7,
  3837       const ParamGenerator<T8>& g8,
  3838       const typename ParamGenerator<T8>::iterator& current8)
  3840           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  3841           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  3842           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  3843           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
  3844           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
  3845           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
  3846           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
  3847           begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
  3848       ComputeCurrentValue();
  3850     virtual ~Iterator() {}
  3852     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  3857     virtual void Advance() {
  3860       if (current8_ == end8_) {
  3861         current8_ = begin8_;
  3864       if (current7_ == end7_) {
  3865         current7_ = begin7_;
  3868       if (current6_ == end6_) {
  3869         current6_ = begin6_;
  3872       if (current5_ == end5_) {
  3873         current5_ = begin5_;
  3876       if (current4_ == end4_) {
  3877         current4_ = begin4_;
  3880       if (current3_ == end3_) {
  3881         current3_ = begin3_;
  3884       if (current2_ == end2_) {
  3885         current2_ = begin2_;
  3888       ComputeCurrentValue();
  3890     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  3891       return new Iterator(*
this);
  3893     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  3894     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  3898           << 
"The program attempted to compare iterators "  3899           << 
"from different generators." << std::endl;
  3900       const Iterator* typed_other =
  3901           CheckedDowncastToActualType<const Iterator>(&other);
  3905       return (AtEnd() && typed_other->AtEnd()) ||
  3907           current1_ == typed_other->current1_ &&
  3908           current2_ == typed_other->current2_ &&
  3909           current3_ == typed_other->current3_ &&
  3910           current4_ == typed_other->current4_ &&
  3911           current5_ == typed_other->current5_ &&
  3912           current6_ == typed_other->current6_ &&
  3913           current7_ == typed_other->current7_ &&
  3914           current8_ == typed_other->current8_);
  3918     Iterator(
const Iterator& other)
  3919         : base_(other.base_),
  3920         begin1_(other.begin1_),
  3922         current1_(other.current1_),
  3923         begin2_(other.begin2_),
  3925         current2_(other.current2_),
  3926         begin3_(other.begin3_),
  3928         current3_(other.current3_),
  3929         begin4_(other.begin4_),
  3931         current4_(other.current4_),
  3932         begin5_(other.begin5_),
  3934         current5_(other.current5_),
  3935         begin6_(other.begin6_),
  3937         current6_(other.current6_),
  3938         begin7_(other.begin7_),
  3940         current7_(other.current7_),
  3941         begin8_(other.begin8_),
  3943         current8_(other.current8_) {
  3944       ComputeCurrentValue();
  3947     void ComputeCurrentValue() {
  3949         current_value_ = ParamType(*current1_, *current2_, *current3_,
  3950             *current4_, *current5_, *current6_, *current7_, *current8_);
  3952     bool AtEnd()
 const {
  3956           current1_ == end1_ ||
  3957           current2_ == end2_ ||
  3958           current3_ == end3_ ||
  3959           current4_ == end4_ ||
  3960           current5_ == end5_ ||
  3961           current6_ == end6_ ||
  3962           current7_ == end7_ ||
  3967     void operator=(
const Iterator& other);
  3969     const ParamGeneratorInterface<ParamType>* 
const base_;
  3972     const typename ParamGenerator<T1>::iterator begin1_;
  3973     const typename ParamGenerator<T1>::iterator end1_;
  3974     typename ParamGenerator<T1>::iterator current1_;
  3975     const typename ParamGenerator<T2>::iterator begin2_;
  3976     const typename ParamGenerator<T2>::iterator end2_;
  3977     typename ParamGenerator<T2>::iterator current2_;
  3978     const typename ParamGenerator<T3>::iterator begin3_;
  3979     const typename ParamGenerator<T3>::iterator end3_;
  3980     typename ParamGenerator<T3>::iterator current3_;
  3981     const typename ParamGenerator<T4>::iterator begin4_;
  3982     const typename ParamGenerator<T4>::iterator end4_;
  3983     typename ParamGenerator<T4>::iterator current4_;
  3984     const typename ParamGenerator<T5>::iterator begin5_;
  3985     const typename ParamGenerator<T5>::iterator end5_;
  3986     typename ParamGenerator<T5>::iterator current5_;
  3987     const typename ParamGenerator<T6>::iterator begin6_;
  3988     const typename ParamGenerator<T6>::iterator end6_;
  3989     typename ParamGenerator<T6>::iterator current6_;
  3990     const typename ParamGenerator<T7>::iterator begin7_;
  3991     const typename ParamGenerator<T7>::iterator end7_;
  3992     typename ParamGenerator<T7>::iterator current7_;
  3993     const typename ParamGenerator<T8>::iterator begin8_;
  3994     const typename ParamGenerator<T8>::iterator end8_;
  3995     typename ParamGenerator<T8>::iterator current8_;
  3996     ParamType current_value_;
  4000   void operator=(
const CartesianProductGenerator8& other);
  4002   const ParamGenerator<T1> g1_;
  4003   const ParamGenerator<T2> g2_;
  4004   const ParamGenerator<T3> g3_;
  4005   const ParamGenerator<T4> g4_;
  4006   const ParamGenerator<T5> g5_;
  4007   const ParamGenerator<T6> g6_;
  4008   const ParamGenerator<T7> g7_;
  4009   const ParamGenerator<T8> g8_;
  4013 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4014     typename T6, 
typename T7, 
typename T8, 
typename T9>
  4015 class CartesianProductGenerator9
  4016     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
  4019   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
  4021   CartesianProductGenerator9(
const ParamGenerator<T1>& g1,
  4022       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  4023       const ParamGenerator<T4>& g4, 
const ParamGenerator<T5>& g5,
  4024       const ParamGenerator<T6>& g6, 
const ParamGenerator<T7>& g7,
  4025       const ParamGenerator<T8>& g8, 
const ParamGenerator<T9>& g9)
  4026       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
  4028   virtual ~CartesianProductGenerator9() {}
  4030   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  4031     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  4032         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
  4033         g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
  4035   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  4036     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  4037         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
  4038         g8_.end(), g9_, g9_.end());
  4042   class Iterator : 
public ParamIteratorInterface<ParamType> {
  4044     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  4045       const ParamGenerator<T1>& g1,
  4046       const typename ParamGenerator<T1>::iterator& current1,
  4047       const ParamGenerator<T2>& g2,
  4048       const typename ParamGenerator<T2>::iterator& current2,
  4049       const ParamGenerator<T3>& g3,
  4050       const typename ParamGenerator<T3>::iterator& current3,
  4051       const ParamGenerator<T4>& g4,
  4052       const typename ParamGenerator<T4>::iterator& current4,
  4053       const ParamGenerator<T5>& g5,
  4054       const typename ParamGenerator<T5>::iterator& current5,
  4055       const ParamGenerator<T6>& g6,
  4056       const typename ParamGenerator<T6>::iterator& current6,
  4057       const ParamGenerator<T7>& g7,
  4058       const typename ParamGenerator<T7>::iterator& current7,
  4059       const ParamGenerator<T8>& g8,
  4060       const typename ParamGenerator<T8>::iterator& current8,
  4061       const ParamGenerator<T9>& g9,
  4062       const typename ParamGenerator<T9>::iterator& current9)
  4064           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  4065           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  4066           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  4067           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
  4068           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
  4069           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
  4070           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
  4071           begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
  4072           begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
  4073       ComputeCurrentValue();
  4075     virtual ~Iterator() {}
  4077     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  4082     virtual void Advance() {
  4085       if (current9_ == end9_) {
  4086         current9_ = begin9_;
  4089       if (current8_ == end8_) {
  4090         current8_ = begin8_;
  4093       if (current7_ == end7_) {
  4094         current7_ = begin7_;
  4097       if (current6_ == end6_) {
  4098         current6_ = begin6_;
  4101       if (current5_ == end5_) {
  4102         current5_ = begin5_;
  4105       if (current4_ == end4_) {
  4106         current4_ = begin4_;
  4109       if (current3_ == end3_) {
  4110         current3_ = begin3_;
  4113       if (current2_ == end2_) {
  4114         current2_ = begin2_;
  4117       ComputeCurrentValue();
  4119     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  4120       return new Iterator(*
this);
  4122     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  4123     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  4127           << 
"The program attempted to compare iterators "  4128           << 
"from different generators." << std::endl;
  4129       const Iterator* typed_other =
  4130           CheckedDowncastToActualType<const Iterator>(&other);
  4134       return (AtEnd() && typed_other->AtEnd()) ||
  4136           current1_ == typed_other->current1_ &&
  4137           current2_ == typed_other->current2_ &&
  4138           current3_ == typed_other->current3_ &&
  4139           current4_ == typed_other->current4_ &&
  4140           current5_ == typed_other->current5_ &&
  4141           current6_ == typed_other->current6_ &&
  4142           current7_ == typed_other->current7_ &&
  4143           current8_ == typed_other->current8_ &&
  4144           current9_ == typed_other->current9_);
  4148     Iterator(
const Iterator& other)
  4149         : base_(other.base_),
  4150         begin1_(other.begin1_),
  4152         current1_(other.current1_),
  4153         begin2_(other.begin2_),
  4155         current2_(other.current2_),
  4156         begin3_(other.begin3_),
  4158         current3_(other.current3_),
  4159         begin4_(other.begin4_),
  4161         current4_(other.current4_),
  4162         begin5_(other.begin5_),
  4164         current5_(other.current5_),
  4165         begin6_(other.begin6_),
  4167         current6_(other.current6_),
  4168         begin7_(other.begin7_),
  4170         current7_(other.current7_),
  4171         begin8_(other.begin8_),
  4173         current8_(other.current8_),
  4174         begin9_(other.begin9_),
  4176         current9_(other.current9_) {
  4177       ComputeCurrentValue();
  4180     void ComputeCurrentValue() {
  4182         current_value_ = ParamType(*current1_, *current2_, *current3_,
  4183             *current4_, *current5_, *current6_, *current7_, *current8_,
  4186     bool AtEnd()
 const {
  4190           current1_ == end1_ ||
  4191           current2_ == end2_ ||
  4192           current3_ == end3_ ||
  4193           current4_ == end4_ ||
  4194           current5_ == end5_ ||
  4195           current6_ == end6_ ||
  4196           current7_ == end7_ ||
  4197           current8_ == end8_ ||
  4202     void operator=(
const Iterator& other);
  4204     const ParamGeneratorInterface<ParamType>* 
const base_;
  4207     const typename ParamGenerator<T1>::iterator begin1_;
  4208     const typename ParamGenerator<T1>::iterator end1_;
  4209     typename ParamGenerator<T1>::iterator current1_;
  4210     const typename ParamGenerator<T2>::iterator begin2_;
  4211     const typename ParamGenerator<T2>::iterator end2_;
  4212     typename ParamGenerator<T2>::iterator current2_;
  4213     const typename ParamGenerator<T3>::iterator begin3_;
  4214     const typename ParamGenerator<T3>::iterator end3_;
  4215     typename ParamGenerator<T3>::iterator current3_;
  4216     const typename ParamGenerator<T4>::iterator begin4_;
  4217     const typename ParamGenerator<T4>::iterator end4_;
  4218     typename ParamGenerator<T4>::iterator current4_;
  4219     const typename ParamGenerator<T5>::iterator begin5_;
  4220     const typename ParamGenerator<T5>::iterator end5_;
  4221     typename ParamGenerator<T5>::iterator current5_;
  4222     const typename ParamGenerator<T6>::iterator begin6_;
  4223     const typename ParamGenerator<T6>::iterator end6_;
  4224     typename ParamGenerator<T6>::iterator current6_;
  4225     const typename ParamGenerator<T7>::iterator begin7_;
  4226     const typename ParamGenerator<T7>::iterator end7_;
  4227     typename ParamGenerator<T7>::iterator current7_;
  4228     const typename ParamGenerator<T8>::iterator begin8_;
  4229     const typename ParamGenerator<T8>::iterator end8_;
  4230     typename ParamGenerator<T8>::iterator current8_;
  4231     const typename ParamGenerator<T9>::iterator begin9_;
  4232     const typename ParamGenerator<T9>::iterator end9_;
  4233     typename ParamGenerator<T9>::iterator current9_;
  4234     ParamType current_value_;
  4238   void operator=(
const CartesianProductGenerator9& other);
  4240   const ParamGenerator<T1> g1_;
  4241   const ParamGenerator<T2> g2_;
  4242   const ParamGenerator<T3> g3_;
  4243   const ParamGenerator<T4> g4_;
  4244   const ParamGenerator<T5> g5_;
  4245   const ParamGenerator<T6> g6_;
  4246   const ParamGenerator<T7> g7_;
  4247   const ParamGenerator<T8> g8_;
  4248   const ParamGenerator<T9> g9_;
  4252 template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4253     typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10>
  4254 class CartesianProductGenerator10
  4255     : 
public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
  4256         T7, T8, T9, T10> > {
  4258   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
  4260   CartesianProductGenerator10(
const ParamGenerator<T1>& g1,
  4261       const ParamGenerator<T2>& g2, 
const ParamGenerator<T3>& g3,
  4262       const ParamGenerator<T4>& g4, 
const ParamGenerator<T5>& g5,
  4263       const ParamGenerator<T6>& g6, 
const ParamGenerator<T7>& g7,
  4264       const ParamGenerator<T8>& g8, 
const ParamGenerator<T9>& g9,
  4265       const ParamGenerator<T10>& g10)
  4266       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
  4267           g9_(g9), g10_(g10) {}
  4268   virtual ~CartesianProductGenerator10() {}
  4270   virtual ParamIteratorInterface<ParamType>* Begin()
 const {
  4271     return new Iterator(
this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
  4272         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
  4273         g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
  4275   virtual ParamIteratorInterface<ParamType>* 
End()
 const {
  4276     return new Iterator(
this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
  4277         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
  4278         g8_.end(), g9_, g9_.end(), g10_, g10_.end());
  4282   class Iterator : 
public ParamIteratorInterface<ParamType> {
  4284     Iterator(
const ParamGeneratorInterface<ParamType>* base,
  4285       const ParamGenerator<T1>& g1,
  4286       const typename ParamGenerator<T1>::iterator& current1,
  4287       const ParamGenerator<T2>& g2,
  4288       const typename ParamGenerator<T2>::iterator& current2,
  4289       const ParamGenerator<T3>& g3,
  4290       const typename ParamGenerator<T3>::iterator& current3,
  4291       const ParamGenerator<T4>& g4,
  4292       const typename ParamGenerator<T4>::iterator& current4,
  4293       const ParamGenerator<T5>& g5,
  4294       const typename ParamGenerator<T5>::iterator& current5,
  4295       const ParamGenerator<T6>& g6,
  4296       const typename ParamGenerator<T6>::iterator& current6,
  4297       const ParamGenerator<T7>& g7,
  4298       const typename ParamGenerator<T7>::iterator& current7,
  4299       const ParamGenerator<T8>& g8,
  4300       const typename ParamGenerator<T8>::iterator& current8,
  4301       const ParamGenerator<T9>& g9,
  4302       const typename ParamGenerator<T9>::iterator& current9,
  4303       const ParamGenerator<T10>& g10,
  4304       const typename ParamGenerator<T10>::iterator& current10)
  4306           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
  4307           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
  4308           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
  4309           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
  4310           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
  4311           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
  4312           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
  4313           begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
  4314           begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
  4315           begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
  4316       ComputeCurrentValue();
  4318     virtual ~Iterator() {}
  4320     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const {
  4325     virtual void Advance() {
  4328       if (current10_ == end10_) {
  4329         current10_ = begin10_;
  4332       if (current9_ == end9_) {
  4333         current9_ = begin9_;
  4336       if (current8_ == end8_) {
  4337         current8_ = begin8_;
  4340       if (current7_ == end7_) {
  4341         current7_ = begin7_;
  4344       if (current6_ == end6_) {
  4345         current6_ = begin6_;
  4348       if (current5_ == end5_) {
  4349         current5_ = begin5_;
  4352       if (current4_ == end4_) {
  4353         current4_ = begin4_;
  4356       if (current3_ == end3_) {
  4357         current3_ = begin3_;
  4360       if (current2_ == end2_) {
  4361         current2_ = begin2_;
  4364       ComputeCurrentValue();
  4366     virtual ParamIteratorInterface<ParamType>* Clone()
 const {
  4367       return new Iterator(*
this);
  4369     virtual const ParamType* Current()
 const { 
return ¤t_value_; }
  4370     virtual bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const {
  4374           << 
"The program attempted to compare iterators "  4375           << 
"from different generators." << std::endl;
  4376       const Iterator* typed_other =
  4377           CheckedDowncastToActualType<const Iterator>(&other);
  4381       return (AtEnd() && typed_other->AtEnd()) ||
  4383           current1_ == typed_other->current1_ &&
  4384           current2_ == typed_other->current2_ &&
  4385           current3_ == typed_other->current3_ &&
  4386           current4_ == typed_other->current4_ &&
  4387           current5_ == typed_other->current5_ &&
  4388           current6_ == typed_other->current6_ &&
  4389           current7_ == typed_other->current7_ &&
  4390           current8_ == typed_other->current8_ &&
  4391           current9_ == typed_other->current9_ &&
  4392           current10_ == typed_other->current10_);
  4396     Iterator(
const Iterator& other)
  4397         : base_(other.base_),
  4398         begin1_(other.begin1_),
  4400         current1_(other.current1_),
  4401         begin2_(other.begin2_),
  4403         current2_(other.current2_),
  4404         begin3_(other.begin3_),
  4406         current3_(other.current3_),
  4407         begin4_(other.begin4_),
  4409         current4_(other.current4_),
  4410         begin5_(other.begin5_),
  4412         current5_(other.current5_),
  4413         begin6_(other.begin6_),
  4415         current6_(other.current6_),
  4416         begin7_(other.begin7_),
  4418         current7_(other.current7_),
  4419         begin8_(other.begin8_),
  4421         current8_(other.current8_),
  4422         begin9_(other.begin9_),
  4424         current9_(other.current9_),
  4425         begin10_(other.begin10_),
  4426         end10_(other.end10_),
  4427         current10_(other.current10_) {
  4428       ComputeCurrentValue();
  4431     void ComputeCurrentValue() {
  4433         current_value_ = ParamType(*current1_, *current2_, *current3_,
  4434             *current4_, *current5_, *current6_, *current7_, *current8_,
  4435             *current9_, *current10_);
  4437     bool AtEnd()
 const {
  4441           current1_ == end1_ ||
  4442           current2_ == end2_ ||
  4443           current3_ == end3_ ||
  4444           current4_ == end4_ ||
  4445           current5_ == end5_ ||
  4446           current6_ == end6_ ||
  4447           current7_ == end7_ ||
  4448           current8_ == end8_ ||
  4449           current9_ == end9_ ||
  4450           current10_ == end10_;
  4454     void operator=(
const Iterator& other);
  4456     const ParamGeneratorInterface<ParamType>* 
const base_;
  4459     const typename ParamGenerator<T1>::iterator begin1_;
  4460     const typename ParamGenerator<T1>::iterator end1_;
  4461     typename ParamGenerator<T1>::iterator current1_;
  4462     const typename ParamGenerator<T2>::iterator begin2_;
  4463     const typename ParamGenerator<T2>::iterator end2_;
  4464     typename ParamGenerator<T2>::iterator current2_;
  4465     const typename ParamGenerator<T3>::iterator begin3_;
  4466     const typename ParamGenerator<T3>::iterator end3_;
  4467     typename ParamGenerator<T3>::iterator current3_;
  4468     const typename ParamGenerator<T4>::iterator begin4_;
  4469     const typename ParamGenerator<T4>::iterator end4_;
  4470     typename ParamGenerator<T4>::iterator current4_;
  4471     const typename ParamGenerator<T5>::iterator begin5_;
  4472     const typename ParamGenerator<T5>::iterator end5_;
  4473     typename ParamGenerator<T5>::iterator current5_;
  4474     const typename ParamGenerator<T6>::iterator begin6_;
  4475     const typename ParamGenerator<T6>::iterator end6_;
  4476     typename ParamGenerator<T6>::iterator current6_;
  4477     const typename ParamGenerator<T7>::iterator begin7_;
  4478     const typename ParamGenerator<T7>::iterator end7_;
  4479     typename ParamGenerator<T7>::iterator current7_;
  4480     const typename ParamGenerator<T8>::iterator begin8_;
  4481     const typename ParamGenerator<T8>::iterator end8_;
  4482     typename ParamGenerator<T8>::iterator current8_;
  4483     const typename ParamGenerator<T9>::iterator begin9_;
  4484     const typename ParamGenerator<T9>::iterator end9_;
  4485     typename ParamGenerator<T9>::iterator current9_;
  4486     const typename ParamGenerator<T10>::iterator begin10_;
  4487     const typename ParamGenerator<T10>::iterator end10_;
  4488     typename ParamGenerator<T10>::iterator current10_;
  4489     ParamType current_value_;
  4493   void operator=(
const CartesianProductGenerator10& other);
  4495   const ParamGenerator<T1> g1_;
  4496   const ParamGenerator<T2> g2_;
  4497   const ParamGenerator<T3> g3_;
  4498   const ParamGenerator<T4> g4_;
  4499   const ParamGenerator<T5> g5_;
  4500   const ParamGenerator<T6> g6_;
  4501   const ParamGenerator<T7> g7_;
  4502   const ParamGenerator<T8> g8_;
  4503   const ParamGenerator<T9> g9_;
  4504   const ParamGenerator<T10> g10_;
  4514 template <
class Generator1, 
class Generator2>
  4515 class CartesianProductHolder2 {
  4517 CartesianProductHolder2(
const Generator1& g1, 
const Generator2& g2)
  4518       : g1_(g1), g2_(g2) {}
  4519   template <
typename T1, 
typename T2>
  4520   operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() 
const {
  4521     return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
  4522         new CartesianProductGenerator2<T1, T2>(
  4523         static_cast<ParamGenerator<T1> 
>(g1_),
  4524         static_cast<ParamGenerator<T2> 
>(g2_)));
  4529   void operator=(
const CartesianProductHolder2& other);
  4531   const Generator1 g1_;
  4532   const Generator2 g2_;
  4535 template <
class Generator1, 
class Generator2, 
class Generator3>
  4536 class CartesianProductHolder3 {
  4538 CartesianProductHolder3(
const Generator1& g1, 
const Generator2& g2,
  4539     const Generator3& g3)
  4540       : g1_(g1), g2_(g2), g3_(g3) {}
  4541   template <
typename T1, 
typename T2, 
typename T3>
  4542   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() 
const {
  4543     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
  4544         new CartesianProductGenerator3<T1, T2, T3>(
  4545         static_cast<ParamGenerator<T1> 
>(g1_),
  4546         static_cast<ParamGenerator<T2> 
>(g2_),
  4547         static_cast<ParamGenerator<T3> 
>(g3_)));
  4552   void operator=(
const CartesianProductHolder3& other);
  4554   const Generator1 g1_;
  4555   const Generator2 g2_;
  4556   const Generator3 g3_;
  4559 template <
class Generator1, 
class Generator2, 
class Generator3,
  4561 class CartesianProductHolder4 {
  4563 CartesianProductHolder4(
const Generator1& g1, 
const Generator2& g2,
  4564     const Generator3& g3, 
const Generator4& g4)
  4565       : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
  4566   template <
typename T1, 
typename T2, 
typename T3, 
typename T4>
  4567   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() 
const {
  4568     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
  4569         new CartesianProductGenerator4<T1, T2, T3, T4>(
  4570         static_cast<ParamGenerator<T1> 
>(g1_),
  4571         static_cast<ParamGenerator<T2> 
>(g2_),
  4572         static_cast<ParamGenerator<T3> 
>(g3_),
  4573         static_cast<ParamGenerator<T4> 
>(g4_)));
  4578   void operator=(
const CartesianProductHolder4& other);
  4580   const Generator1 g1_;
  4581   const Generator2 g2_;
  4582   const Generator3 g3_;
  4583   const Generator4 g4_;
  4586 template <
class Generator1, 
class Generator2, 
class Generator3,
  4587     class Generator4, 
class Generator5>
  4588 class CartesianProductHolder5 {
  4590 CartesianProductHolder5(
const Generator1& g1, 
const Generator2& g2,
  4591     const Generator3& g3, 
const Generator4& g4, 
const Generator5& g5)
  4592       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
  4593   template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5>
  4594   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() 
const {
  4595     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
  4596         new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
  4597         static_cast<ParamGenerator<T1> 
>(g1_),
  4598         static_cast<ParamGenerator<T2> 
>(g2_),
  4599         static_cast<ParamGenerator<T3> 
>(g3_),
  4600         static_cast<ParamGenerator<T4> 
>(g4_),
  4601         static_cast<ParamGenerator<T5> 
>(g5_)));
  4606   void operator=(
const CartesianProductHolder5& other);
  4608   const Generator1 g1_;
  4609   const Generator2 g2_;
  4610   const Generator3 g3_;
  4611   const Generator4 g4_;
  4612   const Generator5 g5_;
  4615 template <
class Generator1, 
class Generator2, 
class Generator3,
  4616     class Generator4, 
class Generator5, 
class Generator6>
  4617 class CartesianProductHolder6 {
  4619 CartesianProductHolder6(
const Generator1& g1, 
const Generator2& g2,
  4620     const Generator3& g3, 
const Generator4& g4, 
const Generator5& g5,
  4621     const Generator6& g6)
  4622       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
  4623   template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4625   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() 
const {
  4626     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
  4627         new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
  4628         static_cast<ParamGenerator<T1> 
>(g1_),
  4629         static_cast<ParamGenerator<T2> 
>(g2_),
  4630         static_cast<ParamGenerator<T3> 
>(g3_),
  4631         static_cast<ParamGenerator<T4> 
>(g4_),
  4632         static_cast<ParamGenerator<T5> 
>(g5_),
  4633         static_cast<ParamGenerator<T6> 
>(g6_)));
  4638   void operator=(
const CartesianProductHolder6& other);
  4640   const Generator1 g1_;
  4641   const Generator2 g2_;
  4642   const Generator3 g3_;
  4643   const Generator4 g4_;
  4644   const Generator5 g5_;
  4645   const Generator6 g6_;
  4648 template <
class Generator1, 
class Generator2, 
class Generator3,
  4649     class Generator4, 
class Generator5, 
class Generator6, 
class Generator7>
  4650 class CartesianProductHolder7 {
  4652 CartesianProductHolder7(
const Generator1& g1, 
const Generator2& g2,
  4653     const Generator3& g3, 
const Generator4& g4, 
const Generator5& g5,
  4654     const Generator6& g6, 
const Generator7& g7)
  4655       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
  4656   template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4657       typename T6, 
typename T7>
  4660     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
  4661         new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
  4662         static_cast<ParamGenerator<T1> 
>(g1_),
  4663         static_cast<ParamGenerator<T2> 
>(g2_),
  4664         static_cast<ParamGenerator<T3> 
>(g3_),
  4665         static_cast<ParamGenerator<T4> 
>(g4_),
  4666         static_cast<ParamGenerator<T5> 
>(g5_),
  4667         static_cast<ParamGenerator<T6> 
>(g6_),
  4668         static_cast<ParamGenerator<T7> 
>(g7_)));
  4673   void operator=(
const CartesianProductHolder7& other);
  4675   const Generator1 g1_;
  4676   const Generator2 g2_;
  4677   const Generator3 g3_;
  4678   const Generator4 g4_;
  4679   const Generator5 g5_;
  4680   const Generator6 g6_;
  4681   const Generator7 g7_;
  4684 template <
class Generator1, 
class Generator2, 
class Generator3,
  4685     class Generator4, 
class Generator5, 
class Generator6, 
class Generator7,
  4687 class CartesianProductHolder8 {
  4689 CartesianProductHolder8(
const Generator1& g1, 
const Generator2& g2,
  4690     const Generator3& g3, 
const Generator4& g4, 
const Generator5& g5,
  4691     const Generator6& g6, 
const Generator7& g7, 
const Generator8& g8)
  4692       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
  4694   template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4695       typename T6, 
typename T7, 
typename T8>
  4698     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
  4699         new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
  4700         static_cast<ParamGenerator<T1> 
>(g1_),
  4701         static_cast<ParamGenerator<T2> 
>(g2_),
  4702         static_cast<ParamGenerator<T3> 
>(g3_),
  4703         static_cast<ParamGenerator<T4> 
>(g4_),
  4704         static_cast<ParamGenerator<T5> 
>(g5_),
  4705         static_cast<ParamGenerator<T6> 
>(g6_),
  4706         static_cast<ParamGenerator<T7> 
>(g7_),
  4707         static_cast<ParamGenerator<T8> 
>(g8_)));
  4712   void operator=(
const CartesianProductHolder8& other);
  4714   const Generator1 g1_;
  4715   const Generator2 g2_;
  4716   const Generator3 g3_;
  4717   const Generator4 g4_;
  4718   const Generator5 g5_;
  4719   const Generator6 g6_;
  4720   const Generator7 g7_;
  4721   const Generator8 g8_;
  4724 template <
class Generator1, 
class Generator2, 
class Generator3,
  4725     class Generator4, 
class Generator5, 
class Generator6, 
class Generator7,
  4726     class Generator8, 
class Generator9>
  4727 class CartesianProductHolder9 {
  4729 CartesianProductHolder9(
const Generator1& g1, 
const Generator2& g2,
  4730     const Generator3& g3, 
const Generator4& g4, 
const Generator5& g5,
  4731     const Generator6& g6, 
const Generator7& g7, 
const Generator8& g8,
  4732     const Generator9& g9)
  4733       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
  4735   template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4736       typename T6, 
typename T7, 
typename T8, 
typename T9>
  4741         new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
  4742         static_cast<ParamGenerator<T1> 
>(g1_),
  4743         static_cast<ParamGenerator<T2> 
>(g2_),
  4744         static_cast<ParamGenerator<T3> 
>(g3_),
  4745         static_cast<ParamGenerator<T4> 
>(g4_),
  4746         static_cast<ParamGenerator<T5> 
>(g5_),
  4747         static_cast<ParamGenerator<T6> 
>(g6_),
  4748         static_cast<ParamGenerator<T7> 
>(g7_),
  4749         static_cast<ParamGenerator<T8> 
>(g8_),
  4750         static_cast<ParamGenerator<T9> 
>(g9_)));
  4755   void operator=(
const CartesianProductHolder9& other);
  4757   const Generator1 g1_;
  4758   const Generator2 g2_;
  4759   const Generator3 g3_;
  4760   const Generator4 g4_;
  4761   const Generator5 g5_;
  4762   const Generator6 g6_;
  4763   const Generator7 g7_;
  4764   const Generator8 g8_;
  4765   const Generator9 g9_;
  4768 template <
class Generator1, 
class Generator2, 
class Generator3,
  4769     class Generator4, 
class Generator5, 
class Generator6, 
class Generator7,
  4770     class Generator8, 
class Generator9, 
class Generator10>
  4771 class CartesianProductHolder10 {
  4773 CartesianProductHolder10(
const Generator1& g1, 
const Generator2& g2,
  4774     const Generator3& g3, 
const Generator4& g4, 
const Generator5& g5,
  4775     const Generator6& g6, 
const Generator7& g7, 
const Generator8& g8,
  4776     const Generator9& g9, 
const Generator10& g10)
  4777       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
  4778           g9_(g9), g10_(g10) {}
  4779   template <
typename T1, 
typename T2, 
typename T3, 
typename T4, 
typename T5,
  4780       typename T6, 
typename T7, 
typename T8, 
typename T9, 
typename T10>
  4782       T9, T10> >() 
const {
  4785         new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
  4787         static_cast<ParamGenerator<T1> 
>(g1_),
  4788         static_cast<ParamGenerator<T2> 
>(g2_),
  4789         static_cast<ParamGenerator<T3> 
>(g3_),
  4790         static_cast<ParamGenerator<T4> 
>(g4_),
  4791         static_cast<ParamGenerator<T5> 
>(g5_),
  4792         static_cast<ParamGenerator<T6> 
>(g6_),
  4793         static_cast<ParamGenerator<T7> 
>(g7_),
  4794         static_cast<ParamGenerator<T8> 
>(g8_),
  4795         static_cast<ParamGenerator<T9> 
>(g9_),
  4796         static_cast<ParamGenerator<T10> 
>(g10_)));
  4801   void operator=(
const CartesianProductHolder10& other);
  4803   const Generator1 g1_;
  4804   const Generator2 g2_;
  4805   const Generator3 g3_;
  4806   const Generator4 g4_;
  4807   const Generator5 g5_;
  4808   const Generator6 g6_;
  4809   const Generator7 g7_;
  4810   const Generator8 g8_;
  4811   const Generator9 g9_;
  4812   const Generator10 g10_;
  4815 # endif  // GTEST_HAS_COMBINE  4820 #endif  //  GTEST_HAS_PARAM_TEST  4822 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ Definition: gmock-actions.h:49
 
Definition: InputPrereqs.h:71
 
Definition: InputPrereqs.h:107
 
Definition: gtest-tuple.h:109
 
#define GTEST_CHECK_(condition)
Definition: gtest-port.h:944
 
Definition: InputPrereqs.h:183
 
Definition: InputPrereqs.h:78