forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			4573 lines
		
	
	
		
			156 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			4573 lines
		
	
	
		
			156 KiB
		
	
	
	
		
			C++
		
	
	
	
| // This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
 | |
| 
 | |
| // Copyright 2008 Google Inc.
 | |
| // All Rights Reserved.
 | |
| //
 | |
| // Redistribution and use in source and binary forms, with or without
 | |
| // modification, are permitted provided that the following conditions are
 | |
| // met:
 | |
| //
 | |
| //     * Redistributions of source code must retain the above copyright
 | |
| // notice, this list of conditions and the following disclaimer.
 | |
| //     * Redistributions in binary form must reproduce the above
 | |
| // copyright notice, this list of conditions and the following disclaimer
 | |
| // in the documentation and/or other materials provided with the
 | |
| // distribution.
 | |
| //     * Neither the name of Google Inc. nor the names of its
 | |
| // contributors may be used to endorse or promote products derived from
 | |
| // this software without specific prior written permission.
 | |
| //
 | |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| //
 | |
| // Author: vladl@google.com (Vlad Losev)
 | |
| 
 | |
| // Type and function utilities for implementing parameterized tests.
 | |
| // This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
 | |
| //
 | |
| // Currently Google Test supports at most 50 arguments in Values,
 | |
| // and at most 10 arguments in Combine. Please contact
 | |
| // googletestframework@googlegroups.com if you need more.
 | |
| // Please note that the number of arguments to Combine is limited
 | |
| // by the maximum arity of the implementation of tr1::tuple which is
 | |
| // currently set at 10.
 | |
| 
 | |
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
 | |
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
 | |
| 
 | |
| #include <gtest/internal/gtest-port.h>
 | |
| 
 | |
| #ifdef GTEST_HAS_PARAM_TEST
 | |
| 
 | |
| #include <gtest/internal/gtest-param-util.h>
 | |
| 
 | |
| namespace testing {
 | |
| namespace internal {
 | |
| 
 | |
| // Used in the Values() function to provide polymorphic capabilities.
 | |
| template <typename T1>
 | |
| class ValueArray1 {
 | |
|  public:
 | |
|   explicit ValueArray1(T1 v1) : v1_(v1) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2>
 | |
| class ValueArray2 {
 | |
|  public:
 | |
|   ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3>
 | |
| class ValueArray3 {
 | |
|  public:
 | |
|   ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4>
 | |
| class ValueArray4 {
 | |
|  public:
 | |
|   ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5>
 | |
| class ValueArray5 {
 | |
|  public:
 | |
|   ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4), v5_(v5) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6>
 | |
| class ValueArray6 {
 | |
|  public:
 | |
|   ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
 | |
|       v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7>
 | |
| class ValueArray7 {
 | |
|  public:
 | |
|   ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
 | |
|       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8>
 | |
| class ValueArray8 {
 | |
|  public:
 | |
|   ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
 | |
|       T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9>
 | |
| class ValueArray9 {
 | |
|  public:
 | |
|   ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
 | |
|       T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10>
 | |
| class ValueArray10 {
 | |
|  public:
 | |
|   ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11>
 | |
| class ValueArray11 {
 | |
|  public:
 | |
|   ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
 | |
|       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12>
 | |
| class ValueArray12 {
 | |
|  public:
 | |
|   ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
 | |
|       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13>
 | |
| class ValueArray13 {
 | |
|  public:
 | |
|   ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
 | |
|       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
 | |
|       v12_(v12), v13_(v13) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14>
 | |
| class ValueArray14 {
 | |
|  public:
 | |
|   ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15>
 | |
| class ValueArray15 {
 | |
|  public:
 | |
|   ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
 | |
|       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16>
 | |
| class ValueArray16 {
 | |
|  public:
 | |
|   ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
 | |
|       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
 | |
|       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
 | |
|       v16_(v16) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17>
 | |
| class ValueArray17 {
 | |
|  public:
 | |
|   ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
 | |
|       T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18>
 | |
| class ValueArray18 {
 | |
|  public:
 | |
|   ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19>
 | |
| class ValueArray19 {
 | |
|  public:
 | |
|   ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
 | |
|       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
 | |
|       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20>
 | |
| class ValueArray20 {
 | |
|  public:
 | |
|   ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
 | |
|       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
 | |
|       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
 | |
|       v19_(v19), v20_(v20) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21>
 | |
| class ValueArray21 {
 | |
|  public:
 | |
|   ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
 | |
|       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
 | |
|       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
 | |
|       v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22>
 | |
| class ValueArray22 {
 | |
|  public:
 | |
|   ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23>
 | |
| class ValueArray23 {
 | |
|  public:
 | |
|   ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
 | |
|       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
 | |
|         v23_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24>
 | |
| class ValueArray24 {
 | |
|  public:
 | |
|   ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
 | |
|       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
 | |
|       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
 | |
|       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
 | |
|       v22_(v22), v23_(v23), v24_(v24) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25>
 | |
| class ValueArray25 {
 | |
|  public:
 | |
|   ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
 | |
|       T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26>
 | |
| class ValueArray26 {
 | |
|  public:
 | |
|   ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27>
 | |
| class ValueArray27 {
 | |
|  public:
 | |
|   ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
 | |
|       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
 | |
|       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
 | |
|       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
 | |
|       v26_(v26), v27_(v27) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28>
 | |
| class ValueArray28 {
 | |
|  public:
 | |
|   ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
 | |
|       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
 | |
|       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
 | |
|       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
 | |
|       v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29>
 | |
| class ValueArray29 {
 | |
|  public:
 | |
|   ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
 | |
|       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
 | |
|       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
 | |
|       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
 | |
|       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30>
 | |
| class ValueArray30 {
 | |
|  public:
 | |
|   ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
 | |
|       v29_(v29), v30_(v30) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31>
 | |
| class ValueArray31 {
 | |
|  public:
 | |
|   ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
 | |
|       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
 | |
|       v29_(v29), v30_(v30), v31_(v31) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32>
 | |
| class ValueArray32 {
 | |
|  public:
 | |
|   ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
 | |
|       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
 | |
|       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
 | |
|       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
 | |
|       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
 | |
|       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33>
 | |
| class ValueArray33 {
 | |
|  public:
 | |
|   ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
 | |
|       T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
 | |
|       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
 | |
|       v33_(v33) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34>
 | |
| class ValueArray34 {
 | |
|  public:
 | |
|   ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
 | |
|       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
 | |
|       v33_(v33), v34_(v34) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35>
 | |
| class ValueArray35 {
 | |
|  public:
 | |
|   ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
 | |
|       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
 | |
|       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
 | |
|       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
 | |
|       v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
 | |
|       v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
 | |
|         v35_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36>
 | |
| class ValueArray36 {
 | |
|  public:
 | |
|   ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
 | |
|       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
 | |
|       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
 | |
|       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
 | |
|       v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
 | |
|       v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37>
 | |
| class ValueArray37 {
 | |
|  public:
 | |
|   ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
 | |
|       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
 | |
|       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
 | |
|       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
 | |
|       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
 | |
|       v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
 | |
|       v36_(v36), v37_(v37) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38>
 | |
| class ValueArray38 {
 | |
|  public:
 | |
|   ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
 | |
|       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
 | |
|       v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39>
 | |
| class ValueArray39 {
 | |
|  public:
 | |
|   ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
 | |
|       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
 | |
|       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
 | |
|       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40>
 | |
| class ValueArray40 {
 | |
|  public:
 | |
|   ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
 | |
|       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
 | |
|       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
 | |
|       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
 | |
|       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
 | |
|       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
 | |
|       v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
 | |
|       v40_(v40) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41>
 | |
| class ValueArray41 {
 | |
|  public:
 | |
|   ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
 | |
|       T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
 | |
|       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
 | |
|       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
 | |
|       v39_(v39), v40_(v40), v41_(v41) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42>
 | |
| class ValueArray42 {
 | |
|  public:
 | |
|   ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
 | |
|       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
 | |
|       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
 | |
|       v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43>
 | |
| class ValueArray43 {
 | |
|  public:
 | |
|   ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
 | |
|       v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
 | |
|       v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
 | |
|       v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
 | |
|       v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
 | |
|       v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
 | |
|       v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44>
 | |
| class ValueArray44 {
 | |
|  public:
 | |
|   ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
 | |
|       v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
 | |
|       v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
 | |
|       v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
 | |
|       v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
 | |
|       v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
 | |
|       v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
 | |
|       v43_(v43), v44_(v44) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44, typename T45>
 | |
| class ValueArray45 {
 | |
|  public:
 | |
|   ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
 | |
|       v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
 | |
|       v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
 | |
|       v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
 | |
|       v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
 | |
|       v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
 | |
|       v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
 | |
|       v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
|   const T45 v45_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44, typename T45,
 | |
|     typename T46>
 | |
| class ValueArray46 {
 | |
|  public:
 | |
|   ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
 | |
|       v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
 | |
|       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
 | |
|       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
 | |
|       v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
|   const T45 v45_;
 | |
|   const T46 v46_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44, typename T45,
 | |
|     typename T46, typename T47>
 | |
| class ValueArray47 {
 | |
|  public:
 | |
|   ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
 | |
|       v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
 | |
|       v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
 | |
|       v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
 | |
|       v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
 | |
|       v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
 | |
|       v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
 | |
|       v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
 | |
|       v47_(v47) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
 | |
|         v47_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
|   const T45 v45_;
 | |
|   const T46 v46_;
 | |
|   const T47 v47_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44, typename T45,
 | |
|     typename T46, typename T47, typename T48>
 | |
| class ValueArray48 {
 | |
|  public:
 | |
|   ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
 | |
|       v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
 | |
|       v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
 | |
|       v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
 | |
|       v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
 | |
|       v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
 | |
|       v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
 | |
|       v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
 | |
|       v46_(v46), v47_(v47), v48_(v48) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
 | |
|         v48_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
|   const T45 v45_;
 | |
|   const T46 v46_;
 | |
|   const T47 v47_;
 | |
|   const T48 v48_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44, typename T45,
 | |
|     typename T46, typename T47, typename T48, typename T49>
 | |
| class ValueArray49 {
 | |
|  public:
 | |
|   ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
 | |
|       T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
 | |
|       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
 | |
|       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
 | |
|       v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
 | |
|       v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
 | |
|         v48_, v49_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
|   const T45 v45_;
 | |
|   const T46 v46_;
 | |
|   const T47 v47_;
 | |
|   const T48 v48_;
 | |
|   const T49 v49_;
 | |
| };
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10,
 | |
|     typename T11, typename T12, typename T13, typename T14, typename T15,
 | |
|     typename T16, typename T17, typename T18, typename T19, typename T20,
 | |
|     typename T21, typename T22, typename T23, typename T24, typename T25,
 | |
|     typename T26, typename T27, typename T28, typename T29, typename T30,
 | |
|     typename T31, typename T32, typename T33, typename T34, typename T35,
 | |
|     typename T36, typename T37, typename T38, typename T39, typename T40,
 | |
|     typename T41, typename T42, typename T43, typename T44, typename T45,
 | |
|     typename T46, typename T47, typename T48, typename T49, typename T50>
 | |
| class ValueArray50 {
 | |
|  public:
 | |
|   ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
 | |
|       T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
 | |
|       T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
 | |
|       T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
 | |
|       T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
 | |
|       T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
 | |
|       T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
 | |
|       v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
 | |
|       v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
 | |
|       v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
 | |
|       v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
 | |
|       v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
 | |
|       v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
 | |
|       v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
 | |
| 
 | |
|   template <typename T>
 | |
|   operator ParamGenerator<T>() const {
 | |
|     const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
 | |
|         v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
 | |
|         v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
 | |
|         v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
 | |
|         v48_, v49_, v50_};
 | |
|     return ValuesIn(array);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const T1 v1_;
 | |
|   const T2 v2_;
 | |
|   const T3 v3_;
 | |
|   const T4 v4_;
 | |
|   const T5 v5_;
 | |
|   const T6 v6_;
 | |
|   const T7 v7_;
 | |
|   const T8 v8_;
 | |
|   const T9 v9_;
 | |
|   const T10 v10_;
 | |
|   const T11 v11_;
 | |
|   const T12 v12_;
 | |
|   const T13 v13_;
 | |
|   const T14 v14_;
 | |
|   const T15 v15_;
 | |
|   const T16 v16_;
 | |
|   const T17 v17_;
 | |
|   const T18 v18_;
 | |
|   const T19 v19_;
 | |
|   const T20 v20_;
 | |
|   const T21 v21_;
 | |
|   const T22 v22_;
 | |
|   const T23 v23_;
 | |
|   const T24 v24_;
 | |
|   const T25 v25_;
 | |
|   const T26 v26_;
 | |
|   const T27 v27_;
 | |
|   const T28 v28_;
 | |
|   const T29 v29_;
 | |
|   const T30 v30_;
 | |
|   const T31 v31_;
 | |
|   const T32 v32_;
 | |
|   const T33 v33_;
 | |
|   const T34 v34_;
 | |
|   const T35 v35_;
 | |
|   const T36 v36_;
 | |
|   const T37 v37_;
 | |
|   const T38 v38_;
 | |
|   const T39 v39_;
 | |
|   const T40 v40_;
 | |
|   const T41 v41_;
 | |
|   const T42 v42_;
 | |
|   const T43 v43_;
 | |
|   const T44 v44_;
 | |
|   const T45 v45_;
 | |
|   const T46 v46_;
 | |
|   const T47 v47_;
 | |
|   const T48 v48_;
 | |
|   const T49 v49_;
 | |
|   const T50 v50_;
 | |
| };
 | |
| 
 | |
| #ifdef GTEST_HAS_COMBINE
 | |
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | |
| //
 | |
| // Generates values from the Cartesian product of values produced
 | |
| // by the argument generators.
 | |
| //
 | |
| template <typename T1, typename T2>
 | |
| class CartesianProductGenerator2
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator2(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2)
 | |
|       : g1_(g1), g2_(g2) {}
 | |
|   virtual ~CartesianProductGenerator2() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current2_;
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3>
 | |
| class CartesianProductGenerator3
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator3(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
 | |
|       : g1_(g1), g2_(g2), g3_(g3) {}
 | |
|   virtual ~CartesianProductGenerator3() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current3_;
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4>
 | |
| class CartesianProductGenerator4
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator4(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
 | |
|   virtual ~CartesianProductGenerator4() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current4_;
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5>
 | |
| class CartesianProductGenerator5
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator5(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
 | |
|   virtual ~CartesianProductGenerator5() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end(), g5_, g5_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4,
 | |
|       const ParamGenerator<T5>& g5,
 | |
|       const typename ParamGenerator<T5>::iterator& current5)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
 | |
|           begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current5_;
 | |
|       if (current5_ == end5_) {
 | |
|         current5_ = begin5_;
 | |
|         ++current4_;
 | |
|       }
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_ &&
 | |
|           current5_ == typed_other->current5_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_),
 | |
|         begin5_(other.begin5_),
 | |
|         end5_(other.end5_),
 | |
|         current5_(other.current5_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_, *current5_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_ ||
 | |
|           current5_ == end5_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     const typename ParamGenerator<T5>::iterator begin5_;
 | |
|     const typename ParamGenerator<T5>::iterator end5_;
 | |
|     typename ParamGenerator<T5>::iterator current5_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
|   const ParamGenerator<T5> g5_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6>
 | |
| class CartesianProductGenerator6
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
 | |
|         T6> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator6(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
 | |
|       const ParamGenerator<T6>& g6)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
 | |
|   virtual ~CartesianProductGenerator6() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4,
 | |
|       const ParamGenerator<T5>& g5,
 | |
|       const typename ParamGenerator<T5>::iterator& current5,
 | |
|       const ParamGenerator<T6>& g6,
 | |
|       const typename ParamGenerator<T6>::iterator& current6)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
 | |
|           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
 | |
|           begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current6_;
 | |
|       if (current6_ == end6_) {
 | |
|         current6_ = begin6_;
 | |
|         ++current5_;
 | |
|       }
 | |
|       if (current5_ == end5_) {
 | |
|         current5_ = begin5_;
 | |
|         ++current4_;
 | |
|       }
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_ &&
 | |
|           current5_ == typed_other->current5_ &&
 | |
|           current6_ == typed_other->current6_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_),
 | |
|         begin5_(other.begin5_),
 | |
|         end5_(other.end5_),
 | |
|         current5_(other.current5_),
 | |
|         begin6_(other.begin6_),
 | |
|         end6_(other.end6_),
 | |
|         current6_(other.current6_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_, *current5_, *current6_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_ ||
 | |
|           current5_ == end5_ ||
 | |
|           current6_ == end6_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     const typename ParamGenerator<T5>::iterator begin5_;
 | |
|     const typename ParamGenerator<T5>::iterator end5_;
 | |
|     typename ParamGenerator<T5>::iterator current5_;
 | |
|     const typename ParamGenerator<T6>::iterator begin6_;
 | |
|     const typename ParamGenerator<T6>::iterator end6_;
 | |
|     typename ParamGenerator<T6>::iterator current6_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
|   const ParamGenerator<T5> g5_;
 | |
|   const ParamGenerator<T6> g6_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7>
 | |
| class CartesianProductGenerator7
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
 | |
|         T7> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator7(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
 | |
|       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
 | |
|   virtual ~CartesianProductGenerator7() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
 | |
|         g7_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4,
 | |
|       const ParamGenerator<T5>& g5,
 | |
|       const typename ParamGenerator<T5>::iterator& current5,
 | |
|       const ParamGenerator<T6>& g6,
 | |
|       const typename ParamGenerator<T6>::iterator& current6,
 | |
|       const ParamGenerator<T7>& g7,
 | |
|       const typename ParamGenerator<T7>::iterator& current7)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
 | |
|           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
 | |
|           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
 | |
|           begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current7_;
 | |
|       if (current7_ == end7_) {
 | |
|         current7_ = begin7_;
 | |
|         ++current6_;
 | |
|       }
 | |
|       if (current6_ == end6_) {
 | |
|         current6_ = begin6_;
 | |
|         ++current5_;
 | |
|       }
 | |
|       if (current5_ == end5_) {
 | |
|         current5_ = begin5_;
 | |
|         ++current4_;
 | |
|       }
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_ &&
 | |
|           current5_ == typed_other->current5_ &&
 | |
|           current6_ == typed_other->current6_ &&
 | |
|           current7_ == typed_other->current7_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_),
 | |
|         begin5_(other.begin5_),
 | |
|         end5_(other.end5_),
 | |
|         current5_(other.current5_),
 | |
|         begin6_(other.begin6_),
 | |
|         end6_(other.end6_),
 | |
|         current6_(other.current6_),
 | |
|         begin7_(other.begin7_),
 | |
|         end7_(other.end7_),
 | |
|         current7_(other.current7_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_, *current5_, *current6_, *current7_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_ ||
 | |
|           current5_ == end5_ ||
 | |
|           current6_ == end6_ ||
 | |
|           current7_ == end7_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     const typename ParamGenerator<T5>::iterator begin5_;
 | |
|     const typename ParamGenerator<T5>::iterator end5_;
 | |
|     typename ParamGenerator<T5>::iterator current5_;
 | |
|     const typename ParamGenerator<T6>::iterator begin6_;
 | |
|     const typename ParamGenerator<T6>::iterator end6_;
 | |
|     typename ParamGenerator<T6>::iterator current6_;
 | |
|     const typename ParamGenerator<T7>::iterator begin7_;
 | |
|     const typename ParamGenerator<T7>::iterator end7_;
 | |
|     typename ParamGenerator<T7>::iterator current7_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
|   const ParamGenerator<T5> g5_;
 | |
|   const ParamGenerator<T6> g6_;
 | |
|   const ParamGenerator<T7> g7_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8>
 | |
| class CartesianProductGenerator8
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
 | |
|         T7, T8> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator8(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
 | |
|       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
 | |
|       const ParamGenerator<T8>& g8)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
 | |
|           g8_(g8) {}
 | |
|   virtual ~CartesianProductGenerator8() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
 | |
|         g7_.begin(), g8_, g8_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
 | |
|         g8_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4,
 | |
|       const ParamGenerator<T5>& g5,
 | |
|       const typename ParamGenerator<T5>::iterator& current5,
 | |
|       const ParamGenerator<T6>& g6,
 | |
|       const typename ParamGenerator<T6>::iterator& current6,
 | |
|       const ParamGenerator<T7>& g7,
 | |
|       const typename ParamGenerator<T7>::iterator& current7,
 | |
|       const ParamGenerator<T8>& g8,
 | |
|       const typename ParamGenerator<T8>::iterator& current8)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
 | |
|           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
 | |
|           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
 | |
|           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
 | |
|           begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current8_;
 | |
|       if (current8_ == end8_) {
 | |
|         current8_ = begin8_;
 | |
|         ++current7_;
 | |
|       }
 | |
|       if (current7_ == end7_) {
 | |
|         current7_ = begin7_;
 | |
|         ++current6_;
 | |
|       }
 | |
|       if (current6_ == end6_) {
 | |
|         current6_ = begin6_;
 | |
|         ++current5_;
 | |
|       }
 | |
|       if (current5_ == end5_) {
 | |
|         current5_ = begin5_;
 | |
|         ++current4_;
 | |
|       }
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_ &&
 | |
|           current5_ == typed_other->current5_ &&
 | |
|           current6_ == typed_other->current6_ &&
 | |
|           current7_ == typed_other->current7_ &&
 | |
|           current8_ == typed_other->current8_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_),
 | |
|         begin5_(other.begin5_),
 | |
|         end5_(other.end5_),
 | |
|         current5_(other.current5_),
 | |
|         begin6_(other.begin6_),
 | |
|         end6_(other.end6_),
 | |
|         current6_(other.current6_),
 | |
|         begin7_(other.begin7_),
 | |
|         end7_(other.end7_),
 | |
|         current7_(other.current7_),
 | |
|         begin8_(other.begin8_),
 | |
|         end8_(other.end8_),
 | |
|         current8_(other.current8_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_, *current5_, *current6_, *current7_, *current8_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_ ||
 | |
|           current5_ == end5_ ||
 | |
|           current6_ == end6_ ||
 | |
|           current7_ == end7_ ||
 | |
|           current8_ == end8_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     const typename ParamGenerator<T5>::iterator begin5_;
 | |
|     const typename ParamGenerator<T5>::iterator end5_;
 | |
|     typename ParamGenerator<T5>::iterator current5_;
 | |
|     const typename ParamGenerator<T6>::iterator begin6_;
 | |
|     const typename ParamGenerator<T6>::iterator end6_;
 | |
|     typename ParamGenerator<T6>::iterator current6_;
 | |
|     const typename ParamGenerator<T7>::iterator begin7_;
 | |
|     const typename ParamGenerator<T7>::iterator end7_;
 | |
|     typename ParamGenerator<T7>::iterator current7_;
 | |
|     const typename ParamGenerator<T8>::iterator begin8_;
 | |
|     const typename ParamGenerator<T8>::iterator end8_;
 | |
|     typename ParamGenerator<T8>::iterator current8_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
|   const ParamGenerator<T5> g5_;
 | |
|   const ParamGenerator<T6> g6_;
 | |
|   const ParamGenerator<T7> g7_;
 | |
|   const ParamGenerator<T8> g8_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9>
 | |
| class CartesianProductGenerator9
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
 | |
|         T7, T8, T9> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator9(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
 | |
|       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
 | |
|       const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
 | |
|           g9_(g9) {}
 | |
|   virtual ~CartesianProductGenerator9() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
 | |
|         g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
 | |
|         g8_.end(), g9_, g9_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4,
 | |
|       const ParamGenerator<T5>& g5,
 | |
|       const typename ParamGenerator<T5>::iterator& current5,
 | |
|       const ParamGenerator<T6>& g6,
 | |
|       const typename ParamGenerator<T6>::iterator& current6,
 | |
|       const ParamGenerator<T7>& g7,
 | |
|       const typename ParamGenerator<T7>::iterator& current7,
 | |
|       const ParamGenerator<T8>& g8,
 | |
|       const typename ParamGenerator<T8>::iterator& current8,
 | |
|       const ParamGenerator<T9>& g9,
 | |
|       const typename ParamGenerator<T9>::iterator& current9)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
 | |
|           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
 | |
|           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
 | |
|           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
 | |
|           begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
 | |
|           begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current9_;
 | |
|       if (current9_ == end9_) {
 | |
|         current9_ = begin9_;
 | |
|         ++current8_;
 | |
|       }
 | |
|       if (current8_ == end8_) {
 | |
|         current8_ = begin8_;
 | |
|         ++current7_;
 | |
|       }
 | |
|       if (current7_ == end7_) {
 | |
|         current7_ = begin7_;
 | |
|         ++current6_;
 | |
|       }
 | |
|       if (current6_ == end6_) {
 | |
|         current6_ = begin6_;
 | |
|         ++current5_;
 | |
|       }
 | |
|       if (current5_ == end5_) {
 | |
|         current5_ = begin5_;
 | |
|         ++current4_;
 | |
|       }
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_ &&
 | |
|           current5_ == typed_other->current5_ &&
 | |
|           current6_ == typed_other->current6_ &&
 | |
|           current7_ == typed_other->current7_ &&
 | |
|           current8_ == typed_other->current8_ &&
 | |
|           current9_ == typed_other->current9_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_),
 | |
|         begin5_(other.begin5_),
 | |
|         end5_(other.end5_),
 | |
|         current5_(other.current5_),
 | |
|         begin6_(other.begin6_),
 | |
|         end6_(other.end6_),
 | |
|         current6_(other.current6_),
 | |
|         begin7_(other.begin7_),
 | |
|         end7_(other.end7_),
 | |
|         current7_(other.current7_),
 | |
|         begin8_(other.begin8_),
 | |
|         end8_(other.end8_),
 | |
|         current8_(other.current8_),
 | |
|         begin9_(other.begin9_),
 | |
|         end9_(other.end9_),
 | |
|         current9_(other.current9_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_, *current5_, *current6_, *current7_, *current8_,
 | |
|             *current9_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_ ||
 | |
|           current5_ == end5_ ||
 | |
|           current6_ == end6_ ||
 | |
|           current7_ == end7_ ||
 | |
|           current8_ == end8_ ||
 | |
|           current9_ == end9_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     const typename ParamGenerator<T5>::iterator begin5_;
 | |
|     const typename ParamGenerator<T5>::iterator end5_;
 | |
|     typename ParamGenerator<T5>::iterator current5_;
 | |
|     const typename ParamGenerator<T6>::iterator begin6_;
 | |
|     const typename ParamGenerator<T6>::iterator end6_;
 | |
|     typename ParamGenerator<T6>::iterator current6_;
 | |
|     const typename ParamGenerator<T7>::iterator begin7_;
 | |
|     const typename ParamGenerator<T7>::iterator end7_;
 | |
|     typename ParamGenerator<T7>::iterator current7_;
 | |
|     const typename ParamGenerator<T8>::iterator begin8_;
 | |
|     const typename ParamGenerator<T8>::iterator end8_;
 | |
|     typename ParamGenerator<T8>::iterator current8_;
 | |
|     const typename ParamGenerator<T9>::iterator begin9_;
 | |
|     const typename ParamGenerator<T9>::iterator end9_;
 | |
|     typename ParamGenerator<T9>::iterator current9_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
|   const ParamGenerator<T5> g5_;
 | |
|   const ParamGenerator<T6> g6_;
 | |
|   const ParamGenerator<T7> g7_;
 | |
|   const ParamGenerator<T8> g8_;
 | |
|   const ParamGenerator<T9> g9_;
 | |
| };
 | |
| 
 | |
| 
 | |
| template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|     typename T6, typename T7, typename T8, typename T9, typename T10>
 | |
| class CartesianProductGenerator10
 | |
|     : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
 | |
|         T7, T8, T9, T10> > {
 | |
|  public:
 | |
|   typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
 | |
| 
 | |
|   CartesianProductGenerator10(const ParamGenerator<T1>& g1,
 | |
|       const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
 | |
|       const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
 | |
|       const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
 | |
|       const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
 | |
|       const ParamGenerator<T10>& g10)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
 | |
|           g9_(g9), g10_(g10) {}
 | |
|   virtual ~CartesianProductGenerator10() {}
 | |
| 
 | |
|   virtual ParamIteratorInterface<ParamType>* Begin() const {
 | |
|     return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
 | |
|         g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
 | |
|         g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
 | |
|   }
 | |
|   virtual ParamIteratorInterface<ParamType>* End() const {
 | |
|     return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
 | |
|         g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
 | |
|         g8_.end(), g9_, g9_.end(), g10_, g10_.end());
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   class Iterator : public ParamIteratorInterface<ParamType> {
 | |
|    public:
 | |
|     Iterator(const ParamGeneratorInterface<ParamType>* base,
 | |
|       const ParamGenerator<T1>& g1,
 | |
|       const typename ParamGenerator<T1>::iterator& current1,
 | |
|       const ParamGenerator<T2>& g2,
 | |
|       const typename ParamGenerator<T2>::iterator& current2,
 | |
|       const ParamGenerator<T3>& g3,
 | |
|       const typename ParamGenerator<T3>::iterator& current3,
 | |
|       const ParamGenerator<T4>& g4,
 | |
|       const typename ParamGenerator<T4>::iterator& current4,
 | |
|       const ParamGenerator<T5>& g5,
 | |
|       const typename ParamGenerator<T5>::iterator& current5,
 | |
|       const ParamGenerator<T6>& g6,
 | |
|       const typename ParamGenerator<T6>::iterator& current6,
 | |
|       const ParamGenerator<T7>& g7,
 | |
|       const typename ParamGenerator<T7>::iterator& current7,
 | |
|       const ParamGenerator<T8>& g8,
 | |
|       const typename ParamGenerator<T8>::iterator& current8,
 | |
|       const ParamGenerator<T9>& g9,
 | |
|       const typename ParamGenerator<T9>::iterator& current9,
 | |
|       const ParamGenerator<T10>& g10,
 | |
|       const typename ParamGenerator<T10>::iterator& current10)
 | |
|         : base_(base),
 | |
|           begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
 | |
|           begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
 | |
|           begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
 | |
|           begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
 | |
|           begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
 | |
|           begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
 | |
|           begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
 | |
|           begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
 | |
|           begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
 | |
|           begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ~Iterator() {}
 | |
| 
 | |
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | |
|       return base_;
 | |
|     }
 | |
|     // Advance should not be called on beyond-of-range iterators
 | |
|     // so no component iterators must be beyond end of range, either.
 | |
|     virtual void Advance() {
 | |
|       assert(!AtEnd());
 | |
|       ++current10_;
 | |
|       if (current10_ == end10_) {
 | |
|         current10_ = begin10_;
 | |
|         ++current9_;
 | |
|       }
 | |
|       if (current9_ == end9_) {
 | |
|         current9_ = begin9_;
 | |
|         ++current8_;
 | |
|       }
 | |
|       if (current8_ == end8_) {
 | |
|         current8_ = begin8_;
 | |
|         ++current7_;
 | |
|       }
 | |
|       if (current7_ == end7_) {
 | |
|         current7_ = begin7_;
 | |
|         ++current6_;
 | |
|       }
 | |
|       if (current6_ == end6_) {
 | |
|         current6_ = begin6_;
 | |
|         ++current5_;
 | |
|       }
 | |
|       if (current5_ == end5_) {
 | |
|         current5_ = begin5_;
 | |
|         ++current4_;
 | |
|       }
 | |
|       if (current4_ == end4_) {
 | |
|         current4_ = begin4_;
 | |
|         ++current3_;
 | |
|       }
 | |
|       if (current3_ == end3_) {
 | |
|         current3_ = begin3_;
 | |
|         ++current2_;
 | |
|       }
 | |
|       if (current2_ == end2_) {
 | |
|         current2_ = begin2_;
 | |
|         ++current1_;
 | |
|       }
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
|     virtual ParamIteratorInterface<ParamType>* Clone() const {
 | |
|       return new Iterator(*this);
 | |
|     }
 | |
|     virtual const ParamType* Current() const { return ¤t_value_; }
 | |
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | |
|       // Having the same base generator guarantees that the other
 | |
|       // iterator is of the same type and we can downcast.
 | |
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | |
|           << "The program attempted to compare iterators "
 | |
|           << "from different generators." << std::endl;
 | |
|       const Iterator* typed_other =
 | |
|           CheckedDowncastToActualType<const Iterator>(&other);
 | |
|       // We must report iterators equal if they both point beyond their
 | |
|       // respective ranges. That can happen in a variety of fashions,
 | |
|       // so we have to consult AtEnd().
 | |
|       return (AtEnd() && typed_other->AtEnd()) ||
 | |
|          (
 | |
|           current1_ == typed_other->current1_ &&
 | |
|           current2_ == typed_other->current2_ &&
 | |
|           current3_ == typed_other->current3_ &&
 | |
|           current4_ == typed_other->current4_ &&
 | |
|           current5_ == typed_other->current5_ &&
 | |
|           current6_ == typed_other->current6_ &&
 | |
|           current7_ == typed_other->current7_ &&
 | |
|           current8_ == typed_other->current8_ &&
 | |
|           current9_ == typed_other->current9_ &&
 | |
|           current10_ == typed_other->current10_);
 | |
|     }
 | |
| 
 | |
|    private:
 | |
|     Iterator(const Iterator& other)
 | |
|         : base_(other.base_),
 | |
|         begin1_(other.begin1_),
 | |
|         end1_(other.end1_),
 | |
|         current1_(other.current1_),
 | |
|         begin2_(other.begin2_),
 | |
|         end2_(other.end2_),
 | |
|         current2_(other.current2_),
 | |
|         begin3_(other.begin3_),
 | |
|         end3_(other.end3_),
 | |
|         current3_(other.current3_),
 | |
|         begin4_(other.begin4_),
 | |
|         end4_(other.end4_),
 | |
|         current4_(other.current4_),
 | |
|         begin5_(other.begin5_),
 | |
|         end5_(other.end5_),
 | |
|         current5_(other.current5_),
 | |
|         begin6_(other.begin6_),
 | |
|         end6_(other.end6_),
 | |
|         current6_(other.current6_),
 | |
|         begin7_(other.begin7_),
 | |
|         end7_(other.end7_),
 | |
|         current7_(other.current7_),
 | |
|         begin8_(other.begin8_),
 | |
|         end8_(other.end8_),
 | |
|         current8_(other.current8_),
 | |
|         begin9_(other.begin9_),
 | |
|         end9_(other.end9_),
 | |
|         current9_(other.current9_),
 | |
|         begin10_(other.begin10_),
 | |
|         end10_(other.end10_),
 | |
|         current10_(other.current10_) {
 | |
|       ComputeCurrentValue();
 | |
|     }
 | |
| 
 | |
|     void ComputeCurrentValue() {
 | |
|       if (!AtEnd())
 | |
|         current_value_ = ParamType(*current1_, *current2_, *current3_,
 | |
|             *current4_, *current5_, *current6_, *current7_, *current8_,
 | |
|             *current9_, *current10_);
 | |
|     }
 | |
|     bool AtEnd() const {
 | |
|       // We must report iterator past the end of the range when either of the
 | |
|       // component iterators has reached the end of its range.
 | |
|       return
 | |
|           current1_ == end1_ ||
 | |
|           current2_ == end2_ ||
 | |
|           current3_ == end3_ ||
 | |
|           current4_ == end4_ ||
 | |
|           current5_ == end5_ ||
 | |
|           current6_ == end6_ ||
 | |
|           current7_ == end7_ ||
 | |
|           current8_ == end8_ ||
 | |
|           current9_ == end9_ ||
 | |
|           current10_ == end10_;
 | |
|     }
 | |
| 
 | |
|     const ParamGeneratorInterface<ParamType>* const base_;
 | |
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | |
|     // current[i]_ is the actual traversing iterator.
 | |
|     const typename ParamGenerator<T1>::iterator begin1_;
 | |
|     const typename ParamGenerator<T1>::iterator end1_;
 | |
|     typename ParamGenerator<T1>::iterator current1_;
 | |
|     const typename ParamGenerator<T2>::iterator begin2_;
 | |
|     const typename ParamGenerator<T2>::iterator end2_;
 | |
|     typename ParamGenerator<T2>::iterator current2_;
 | |
|     const typename ParamGenerator<T3>::iterator begin3_;
 | |
|     const typename ParamGenerator<T3>::iterator end3_;
 | |
|     typename ParamGenerator<T3>::iterator current3_;
 | |
|     const typename ParamGenerator<T4>::iterator begin4_;
 | |
|     const typename ParamGenerator<T4>::iterator end4_;
 | |
|     typename ParamGenerator<T4>::iterator current4_;
 | |
|     const typename ParamGenerator<T5>::iterator begin5_;
 | |
|     const typename ParamGenerator<T5>::iterator end5_;
 | |
|     typename ParamGenerator<T5>::iterator current5_;
 | |
|     const typename ParamGenerator<T6>::iterator begin6_;
 | |
|     const typename ParamGenerator<T6>::iterator end6_;
 | |
|     typename ParamGenerator<T6>::iterator current6_;
 | |
|     const typename ParamGenerator<T7>::iterator begin7_;
 | |
|     const typename ParamGenerator<T7>::iterator end7_;
 | |
|     typename ParamGenerator<T7>::iterator current7_;
 | |
|     const typename ParamGenerator<T8>::iterator begin8_;
 | |
|     const typename ParamGenerator<T8>::iterator end8_;
 | |
|     typename ParamGenerator<T8>::iterator current8_;
 | |
|     const typename ParamGenerator<T9>::iterator begin9_;
 | |
|     const typename ParamGenerator<T9>::iterator end9_;
 | |
|     typename ParamGenerator<T9>::iterator current9_;
 | |
|     const typename ParamGenerator<T10>::iterator begin10_;
 | |
|     const typename ParamGenerator<T10>::iterator end10_;
 | |
|     typename ParamGenerator<T10>::iterator current10_;
 | |
|     ParamType current_value_;
 | |
|   };
 | |
| 
 | |
|   const ParamGenerator<T1> g1_;
 | |
|   const ParamGenerator<T2> g2_;
 | |
|   const ParamGenerator<T3> g3_;
 | |
|   const ParamGenerator<T4> g4_;
 | |
|   const ParamGenerator<T5> g5_;
 | |
|   const ParamGenerator<T6> g6_;
 | |
|   const ParamGenerator<T7> g7_;
 | |
|   const ParamGenerator<T8> g8_;
 | |
|   const ParamGenerator<T9> g9_;
 | |
|   const ParamGenerator<T10> g10_;
 | |
| };
 | |
| 
 | |
| 
 | |
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | |
| //
 | |
| // Helper classes providing Combine() with polymorphic features. They allow
 | |
| // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
 | |
| // convertible to U.
 | |
| //
 | |
| template <class Generator1, class Generator2>
 | |
| class CartesianProductHolder2 {
 | |
|  public:
 | |
| CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
 | |
|       : g1_(g1), g2_(g2) {}
 | |
|   template <typename T1, typename T2>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
 | |
|         new CartesianProductGenerator2<T1, T2>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3>
 | |
| class CartesianProductHolder3 {
 | |
|  public:
 | |
| CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3)
 | |
|       : g1_(g1), g2_(g2), g3_(g3) {}
 | |
|   template <typename T1, typename T2, typename T3>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
 | |
|         new CartesianProductGenerator3<T1, T2, T3>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4>
 | |
| class CartesianProductHolder4 {
 | |
|  public:
 | |
| CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
 | |
|         new CartesianProductGenerator4<T1, T2, T3, T4>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4, class Generator5>
 | |
| class CartesianProductHolder5 {
 | |
|  public:
 | |
| CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4, const Generator5& g5)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4, typename T5>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
 | |
|         new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_),
 | |
|         static_cast<ParamGenerator<T5> >(g5_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
|   const Generator5 g5_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4, class Generator5, class Generator6>
 | |
| class CartesianProductHolder6 {
 | |
|  public:
 | |
| CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4, const Generator5& g5,
 | |
|     const Generator6& g6)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|       typename T6>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
 | |
|         new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_),
 | |
|         static_cast<ParamGenerator<T5> >(g5_),
 | |
|         static_cast<ParamGenerator<T6> >(g6_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
|   const Generator5 g5_;
 | |
|   const Generator6 g6_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4, class Generator5, class Generator6, class Generator7>
 | |
| class CartesianProductHolder7 {
 | |
|  public:
 | |
| CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4, const Generator5& g5,
 | |
|     const Generator6& g6, const Generator7& g7)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|       typename T6, typename T7>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
 | |
|       T7> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
 | |
|         new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_),
 | |
|         static_cast<ParamGenerator<T5> >(g5_),
 | |
|         static_cast<ParamGenerator<T6> >(g6_),
 | |
|         static_cast<ParamGenerator<T7> >(g7_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
|   const Generator5 g5_;
 | |
|   const Generator6 g6_;
 | |
|   const Generator7 g7_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4, class Generator5, class Generator6, class Generator7,
 | |
|     class Generator8>
 | |
| class CartesianProductHolder8 {
 | |
|  public:
 | |
| CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4, const Generator5& g5,
 | |
|     const Generator6& g6, const Generator7& g7, const Generator8& g8)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
 | |
|           g8_(g8) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|       typename T6, typename T7, typename T8>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
 | |
|       T8> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
 | |
|         new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_),
 | |
|         static_cast<ParamGenerator<T5> >(g5_),
 | |
|         static_cast<ParamGenerator<T6> >(g6_),
 | |
|         static_cast<ParamGenerator<T7> >(g7_),
 | |
|         static_cast<ParamGenerator<T8> >(g8_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
|   const Generator5 g5_;
 | |
|   const Generator6 g6_;
 | |
|   const Generator7 g7_;
 | |
|   const Generator8 g8_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4, class Generator5, class Generator6, class Generator7,
 | |
|     class Generator8, class Generator9>
 | |
| class CartesianProductHolder9 {
 | |
|  public:
 | |
| CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4, const Generator5& g5,
 | |
|     const Generator6& g6, const Generator7& g7, const Generator8& g8,
 | |
|     const Generator9& g9)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
 | |
|           g9_(g9) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|       typename T6, typename T7, typename T8, typename T9>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
 | |
|       T9> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
 | |
|         T9> >(
 | |
|         new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_),
 | |
|         static_cast<ParamGenerator<T5> >(g5_),
 | |
|         static_cast<ParamGenerator<T6> >(g6_),
 | |
|         static_cast<ParamGenerator<T7> >(g7_),
 | |
|         static_cast<ParamGenerator<T8> >(g8_),
 | |
|         static_cast<ParamGenerator<T9> >(g9_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
|   const Generator5 g5_;
 | |
|   const Generator6 g6_;
 | |
|   const Generator7 g7_;
 | |
|   const Generator8 g8_;
 | |
|   const Generator9 g9_;
 | |
| };
 | |
| 
 | |
| template <class Generator1, class Generator2, class Generator3,
 | |
|     class Generator4, class Generator5, class Generator6, class Generator7,
 | |
|     class Generator8, class Generator9, class Generator10>
 | |
| class CartesianProductHolder10 {
 | |
|  public:
 | |
| CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
 | |
|     const Generator3& g3, const Generator4& g4, const Generator5& g5,
 | |
|     const Generator6& g6, const Generator7& g7, const Generator8& g8,
 | |
|     const Generator9& g9, const Generator10& g10)
 | |
|       : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
 | |
|           g9_(g9), g10_(g10) {}
 | |
|   template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | |
|       typename T6, typename T7, typename T8, typename T9, typename T10>
 | |
|   operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
 | |
|       T9, T10> >() const {
 | |
|     return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
 | |
|         T9, T10> >(
 | |
|         new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
 | |
|             T10>(
 | |
|         static_cast<ParamGenerator<T1> >(g1_),
 | |
|         static_cast<ParamGenerator<T2> >(g2_),
 | |
|         static_cast<ParamGenerator<T3> >(g3_),
 | |
|         static_cast<ParamGenerator<T4> >(g4_),
 | |
|         static_cast<ParamGenerator<T5> >(g5_),
 | |
|         static_cast<ParamGenerator<T6> >(g6_),
 | |
|         static_cast<ParamGenerator<T7> >(g7_),
 | |
|         static_cast<ParamGenerator<T8> >(g8_),
 | |
|         static_cast<ParamGenerator<T9> >(g9_),
 | |
|         static_cast<ParamGenerator<T10> >(g10_)));
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   const Generator1 g1_;
 | |
|   const Generator2 g2_;
 | |
|   const Generator3 g3_;
 | |
|   const Generator4 g4_;
 | |
|   const Generator5 g5_;
 | |
|   const Generator6 g6_;
 | |
|   const Generator7 g7_;
 | |
|   const Generator8 g8_;
 | |
|   const Generator9 g9_;
 | |
|   const Generator10 g10_;
 | |
| };
 | |
| 
 | |
| #endif  // GTEST_HAS_COMBINE
 | |
| 
 | |
| }  // namespace internal
 | |
| }  // namespace testing
 | |
| 
 | |
| #endif  //  GTEST_HAS_PARAM_TEST
 | |
| 
 | |
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
 |