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