119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file was GENERATED by command:
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//     pump.py gtest-param-util-generated.h.pump
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// DO NOT EDIT BY HAND!!!
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Copyright 2008 Google Inc.
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// All Rights Reserved.
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Redistribution and use in source and binary forms, with or without
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// modification, are permitted provided that the following conditions are
10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// met:
11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Redistributions of source code must retain the above copyright
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// notice, this list of conditions and the following disclaimer.
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Redistributions in binary form must reproduce the above
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// copyright notice, this list of conditions and the following disclaimer
16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// in the documentation and/or other materials provided with the
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// distribution.
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Neither the name of Google Inc. nor the names of its
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// contributors may be used to endorse or promote products derived from
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// this software without specific prior written permission.
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Author: vladl@google.com (Vlad Losev)
35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Type and function utilities for implementing parameterized tests.
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Currently Google Test supports at most 50 arguments in Values,
40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// and at most 10 arguments in Combine. Please contact
41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// googletestframework@googlegroups.com if you need more.
42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Please note that the number of arguments to Combine is limited
43894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// by the maximum arity of the implementation of tr1::tuple which is
44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// currently set at 10.
45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// scripts/fuse_gtest.py depends on gtest's own header being #included
50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// *unconditionally*.  Therefore these #includes cannot be moved
51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// inside #if GTEST_HAS_PARAM_TEST.
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "gtest/internal/gtest-param-util.h"
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "gtest/internal/gtest-port.h"
54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#if GTEST_HAS_PARAM_TEST
56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace testing {
58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Forward declarations of ValuesIn(), which is implemented in
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// include/gtest/gtest-param-test.h.
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename ForwardIterator>
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanValuesIn(ForwardIterator begin, ForwardIterator end);
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T, size_t N>
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Container>
70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninternal::ParamGenerator<typename Container::value_type> ValuesIn(
71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Container& container);
72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace internal {
74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Used in the Values() function to provide polymorphic capabilities.
76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1>
77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray1 {
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit ValueArray1(T1 v1) : v1_(v1) {}
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray1& other);
87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2>
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray2 {
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_};
99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray2& other);
105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3>
111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray3 {
112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_};
118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray3& other);
124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4>
131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray4 {
132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4) {}
135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_};
139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray4& other);
145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray5 {
154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4), v5_(v5) {}
157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_};
161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray5& other);
167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6>
177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray6 {
178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray6& other);
191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7>
202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray7 {
203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray7& other);
216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8>
228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray8 {
229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8) {}
233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray8& other);
243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9>
256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray9 {
257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9) {}
261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray9& other);
271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10>
285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray10 {
286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10) {}
290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray10& other);
300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11>
316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray11 {
317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray11& other);
331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12>
348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray12 {
349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_};
358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray12& other);
364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13>
382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray13 {
383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12_(v12), v13_(v13) {}
388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_};
393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray13& other);
399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14>
418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray14 {
419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_};
429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray14& other);
435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15>
455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray15 {
456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_};
466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray15& other);
472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16>
494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray16 {
495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16_(v16) {}
501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_};
506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray16& other);
512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17>
535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray17 {
536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17) {}
542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_};
547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray17& other);
553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18>
577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray18 {
578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_};
589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray18& other);
595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19>
620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray19 {
621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray19& other);
638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20>
664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray20 {
665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v19_(v19), v20_(v20) {}
672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray20& other);
683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21>
711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray21 {
712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray21& other);
730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22>
759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray22 {
760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray22& other);
778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23>
808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray23 {
809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23) {}
817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v23_};
823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray23& other);
829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
831894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24>
860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray24 {
861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
868894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v22_(v22), v23_(v23), v24_(v24) {}
869894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
870894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
871894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
872894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
873894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_};
875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
877894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray24& other);
881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
898894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
899894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25>
913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray25 {
914894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
915894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
919894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_};
928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray25& other);
934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
951894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
952894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
956894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26>
968894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray26 {
969894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
970894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
971894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
972894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
973894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
974894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
975894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
976894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
977894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
978894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
979894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
980894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
981894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
982894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_};
983894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
984894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
985894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
986894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
987894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
988894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray26& other);
989894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
990894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
991894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
992894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
993894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
994894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
995894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
996894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
997894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
998894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
999894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1000894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1001894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1002894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1003894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1004894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1005894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1006894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1007894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1008894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1009894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1010894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1011894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1012894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1013894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1014894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1015894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1016894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1017894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1018894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1019894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1020894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1021894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1022894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1023894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27>
1024894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray27 {
1025894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1026894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1027894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1028894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1029894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1030894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1031894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1032894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1033894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v26_(v26), v27_(v27) {}
1034894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1035894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1036894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1037894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1038894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1039894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_};
1040894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1041894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1042894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1043894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1044894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1045894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray27& other);
1046894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1047894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1048894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1049894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1050894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1051894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1052894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1053894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1054894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1055894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1056894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1057894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1058894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1059894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1060894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1061894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1062894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1063894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1064894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1065894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1066894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1067894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1068894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1069894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1070894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1071894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1072894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1073894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1074894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1075894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1076894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1077894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1078894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1079894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1080894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1081894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28>
1082894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray28 {
1083894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1084894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1085894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1086894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1087894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1088894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1089894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1090894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1091894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
1092894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1093894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1094894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1095894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1096894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1097894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_};
1098894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1099894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray28& other);
1104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29>
1141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray29 {
1142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
1151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_};
1157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray29& other);
1163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30>
1201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray30 {
1202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
1207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29_(v29), v30_(v30) {}
1212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_};
1218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray30& other);
1224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31>
1264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray31 {
1265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
1270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29_(v29), v30_(v30), v31_(v31) {}
1275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
1281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray31& other);
1287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32>
1328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray32 {
1329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
1334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
1339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
1345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray32& other);
1351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33>
1393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray33 {
1394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33_(v33) {}
1405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
1411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray33& other);
1417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34>
1460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray34 {
1461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33_(v33), v34_(v34) {}
1472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
1478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray34& other);
1484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35>
1528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray35 {
1529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
1539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
1540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
1546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v35_};
1547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray35& other);
1553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
1589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36>
1599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray36 {
1600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
1610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
1611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_};
1618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray36& other);
1624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
1660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
1661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37>
1671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray37 {
1672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
1682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
1683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v36_(v36), v37_(v37) {}
1684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_};
1691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray37& other);
1697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
1733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
1734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
1735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38>
1745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray38 {
1746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
1752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
1758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_};
1765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray38& other);
1771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
1807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
1808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
1809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
1810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39>
1820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray39 {
1821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
1827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1831894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
1833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_};
1840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray39& other);
1846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1868894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1869894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1870894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1871894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1872894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1873894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1877894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
1882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
1883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
1884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
1885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
1886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40>
1896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray40 {
1897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1898894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1899894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
1903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
1908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
1909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v40_(v40) {}
1910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1914894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1915894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_};
1917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1919894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
1921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
1922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray40& other);
1923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
1925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
1926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
1927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
1928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
1929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
1930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
1931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
1932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
1933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
1934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
1935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
1936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
1937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
1938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
1939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
1940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
1941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
1942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
1943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
1944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
1945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
1946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
1947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
1948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
1949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
1950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
1951894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
1952894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
1953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
1954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
1955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
1956894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
1957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
1958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
1959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
1960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
1961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
1962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
1963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
1964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
1965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
1968894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
1969894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
1970894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
1971894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
1972894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
1973894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
1974894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41>
1975894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray41 {
1976894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
1977894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1978894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1979894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1980894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1981894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
1982894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1983894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1984894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1985894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1986894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1987894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
1988894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v39_(v39), v40_(v40), v41_(v41) {}
1989894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1990894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
1991894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
1992894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1993894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1994894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1995894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_};
1996894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
1997894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
1998894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
1999894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2000894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2001894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray41& other);
2002894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2003894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2004894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2005894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2006894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2007894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2008894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2009894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2010894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2011894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2012894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2013894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2014894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2015894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2016894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2017894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2018894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2019894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2020894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2021894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2022894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2023894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2024894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2025894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2026894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2027894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2028894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2029894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2030894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2031894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2032894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2033894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2034894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2035894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2036894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2037894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2038894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2039894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2040894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2041894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2042894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2043894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2044894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2045894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2046894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2047894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2048894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2049894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2050894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2051894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2052894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2053894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2054894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42>
2055894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray42 {
2056894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2057894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2058894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2059894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2060894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2061894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2062894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2063894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2064894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2065894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2066894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2067894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2068894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
2069894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2070894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2071894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2072894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2073894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2074894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2075894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_};
2076894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2077894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2078894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2079894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2080894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2081894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray42& other);
2082894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2083894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2084894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2085894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2086894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2087894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2088894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2089894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2090894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2091894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2092894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2093894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2094894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2095894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2096894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2097894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2098894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2099894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43>
2136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray43 {
2137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
2144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
2145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
2146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
2147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
2148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
2149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
2150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
2157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray43& other);
2163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44>
2218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray44 {
2219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
2226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
2227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
2228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
2229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
2230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
2231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
2232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v43_(v43), v44_(v44) {}
2233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
2240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray44& other);
2246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45>
2302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray45 {
2303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
2310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
2311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
2312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
2313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
2314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
2315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
2316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
2317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
2324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray45& other);
2330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T45 v45_;
2376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
2387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46>
2388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray46 {
2389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
2396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
2403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
2410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray46& other);
2416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T45 v45_;
2462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T46 v46_;
2463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
2474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47>
2475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray47 {
2476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
2483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
2490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v47_(v47) {}
2491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
2498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v47_};
2499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray47& other);
2505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T45 v45_;
2551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T46 v46_;
2552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T47 v47_;
2553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
2564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47, typename T48>
2565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray48 {
2566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
2573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
2580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v46_(v46), v47_(v47), v48_(v48) {}
2581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v48_};
2589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray48& other);
2595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T45 v45_;
2641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T46 v46_;
2642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T47 v47_;
2643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T48 v48_;
2644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
2655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47, typename T48, typename T49>
2656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray49 {
2657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
2664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
2672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v48_, v49_};
2680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray49& other);
2686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T45 v45_;
2732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T46 v46_;
2733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T47 v47_;
2734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T48 v48_;
2735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T49 v49_;
2736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10,
2740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T11, typename T12, typename T13, typename T14, typename T15,
2741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T16, typename T17, typename T18, typename T19, typename T20,
2742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T21, typename T22, typename T23, typename T24, typename T25,
2743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T26, typename T27, typename T28, typename T29, typename T30,
2744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T31, typename T32, typename T33, typename T34, typename T35,
2745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T36, typename T37, typename T38, typename T39, typename T40,
2746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T41, typename T42, typename T43, typename T44, typename T45,
2747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T46, typename T47, typename T48, typename T49, typename T50>
2748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass ValueArray50 {
2749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
2756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
2764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T>
2766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator<T>() const {
2767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        v48_, v49_, v50_};
2772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ValuesIn(array);
2773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const ValueArray50& other);
2778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T1 v1_;
2780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T2 v2_;
2781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T3 v3_;
2782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T4 v4_;
2783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T5 v5_;
2784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T6 v6_;
2785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T7 v7_;
2786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T8 v8_;
2787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T9 v9_;
2788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T10 v10_;
2789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T11 v11_;
2790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T12 v12_;
2791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T13 v13_;
2792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T14 v14_;
2793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T15 v15_;
2794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T16 v16_;
2795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T17 v17_;
2796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T18 v18_;
2797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T19 v19_;
2798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T20 v20_;
2799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T21 v21_;
2800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T22 v22_;
2801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T23 v23_;
2802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T24 v24_;
2803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T25 v25_;
2804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T26 v26_;
2805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T27 v27_;
2806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T28 v28_;
2807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T29 v29_;
2808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T30 v30_;
2809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T31 v31_;
2810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T32 v32_;
2811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T33 v33_;
2812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T34 v34_;
2813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T35 v35_;
2814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T36 v36_;
2815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T37 v37_;
2816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T38 v38_;
2817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T39 v39_;
2818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T40 v40_;
2819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T41 v41_;
2820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T42 v42_;
2821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T43 v43_;
2822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T44 v44_;
2823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T45 v45_;
2824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T46 v46_;
2825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T47 v47_;
2826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T48 v48_;
2827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T49 v49_;
2828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const T50 v50_;
2829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
2830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
283119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# if GTEST_HAS_COMBINE
2832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
2834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Generates values from the Cartesian product of values produced
2835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// by the argument generators.
2836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
2837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2>
2838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator2
2839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
2840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2> ParamType;
2842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
2844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2)
2845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2) {}
2846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator2() {}
2847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
2849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
2850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
2852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
2853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
2857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
2858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
2859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
2860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
2861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
2862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2)
2863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
2864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
2865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
2866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
2867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2868894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
2869894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2870894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
2871894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
2872894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2873894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
2874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
2875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
2876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
2877894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current2_;
2878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
2879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
2880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
2881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
2882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
2883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
2885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
2886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
2888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
2889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
2890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
2891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
2892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
2893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
2894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
2895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
2896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
2897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
2898894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
2899894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
2900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
2901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
2902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_);
2903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
2906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
2907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
2908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
2909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
2910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
2911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
2912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
2913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_) {
2914894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
2915894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
2918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
2919894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_);
2920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
2922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
2923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
2924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
2925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
2926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_;
2927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
2930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
2931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
2933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
2934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
2935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
2936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
2937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
2938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
2939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
2940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
2941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
2942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator2::Iterator
2943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
2945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator2& other);
2946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
2948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
2949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator2
2950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2951894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2952894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3>
2953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator3
2954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
2955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
2956894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
2957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
2959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
2960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3) {}
2961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator3() {}
2962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
2964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
2965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin());
2966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
2968894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
2969894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
2970894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2971894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
2972894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
2973894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
2974894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
2975894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
2976894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
2977894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
2978894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
2979894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
2980894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3)
2981894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
2982894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
2983894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
2984894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
2985894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
2986894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2987894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
2988894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2989894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
2990894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
2991894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
2992894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
2993894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
2994894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
2995894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
2996894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current3_;
2997894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
2998894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
2999894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
3000894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3001894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
3002894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
3003894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
3004894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3005894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3006894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3007894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
3008894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
3009894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3010894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
3011894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3012894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
3013894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
3014894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3015894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
3016894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
3017894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
3018894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
3019894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
3020894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
3021894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
3022894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
3023894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
3024894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
3025894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
3026894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_);
3027894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3028894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3029894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
3030894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
3031894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
3032894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
3033894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
3034894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
3035894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
3036894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
3037894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
3038894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
3039894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
3040894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_) {
3041894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3042894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3043894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3044894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
3045894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
3046894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_);
3047894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3048894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
3049894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
3050894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
3051894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
3052894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
3053894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
3054894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_;
3055894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3056894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3057894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
3058894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
3059894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3060894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
3061894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3062894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
3063894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
3064894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
3065894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
3066894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
3067894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
3068894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
3069894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
3070894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
3071894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
3072894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
3073894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator3::Iterator
3074894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3075894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
3076894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator3& other);
3077894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3078894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
3079894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
3080894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
3081894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator3
3082894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3083894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3084894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4>
3085894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator4
3086894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
3087894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
3088894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
3089894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3090894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
3091894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3092894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4)
3093894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
3094894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator4() {}
3095894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3096894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
3097894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3098894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin());
3099894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
3101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end());
3103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
3106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
3107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
3108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
3109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
3110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
3111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
3112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
3113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
3114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
3115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
3116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4)
3117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
3118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
3122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
3125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
3128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
3130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
3131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
3132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
3133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current4_;
3134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
3135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
3136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
3137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
3139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
3140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
3141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
3143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
3144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
3145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
3149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
3150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
3152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
3154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
3155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
3157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
3158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
3159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
3160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
3161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
3162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
3163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
3164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
3165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
3166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
3167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
3168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_);
3169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
3172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
3173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
3174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
3175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
3176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
3177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
3178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
3179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
3180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
3181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
3182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
3183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
3184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
3185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_) {
3186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
3190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
3191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
3192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_);
3193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
3195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
3196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
3197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
3198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
3199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
3200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
3201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_;
3202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
3205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
3206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
3208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
3210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
3211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
3212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
3213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
3214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
3215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
3216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
3217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
3218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
3219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
3220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
3221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
3222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
3223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator4::Iterator
3224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
3226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator4& other);
3227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
3229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
3230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
3231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
3232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator4
3233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator5
3237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
3238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
3239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
3240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
3242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
3244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
3245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator5() {}
3246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
3248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
3250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
3252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end(), g5_, g5_.end());
3254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
3257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
3258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
3259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
3260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
3261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
3262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
3263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
3264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
3265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
3266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
3267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4,
3268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T5>& g5,
3269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T5>::iterator& current5)
3270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
3271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
3276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
3279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
3282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
3284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
3285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
3286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
3287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current5_;
3288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current5_ == end5_) {
3289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_ = begin5_;
3290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current4_;
3291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
3293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
3294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
3295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
3297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
3298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
3299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
3301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
3302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
3303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
3307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
3308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
3310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
3312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
3313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
3315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
3316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
3317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
3318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
3319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
3320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
3321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
3322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
3323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
3324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
3325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
3326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_ &&
3327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == typed_other->current5_);
3328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
3331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
3332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
3333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
3334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
3335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
3336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
3337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
3338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
3339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
3340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
3341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
3342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
3343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
3344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_),
3345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin5_(other.begin5_),
3346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end5_(other.end5_),
3347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_(other.current5_) {
3348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
3352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
3353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
3354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_, *current5_);
3355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
3357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
3358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
3359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
3360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
3361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
3362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
3363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_ ||
3364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == end5_;
3365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
3368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
3369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
3371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
3373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
3374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
3375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
3376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
3377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
3378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
3379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
3380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
3381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
3382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
3383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
3384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
3385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator begin5_;
3386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator end5_;
3387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T5>::iterator current5_;
3388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
3389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator5::Iterator
3390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
3392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator5& other);
3393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
3395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
3396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
3397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
3398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T5> g5_;
3399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator5
3400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6>
3404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator6
3405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
3406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T6> > {
3407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
3408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
3409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
3411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6)
3414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
3415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator6() {}
3416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
3418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
3420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
3422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
3424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
3427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
3428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
3429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
3430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
3431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
3432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
3433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
3434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
3435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
3436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
3437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4,
3438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T5>& g5,
3439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T5>::iterator& current5,
3440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6,
3441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T6>::iterator& current6)
3442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
3443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
3449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
3452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
3455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
3457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
3458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
3459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
3460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current6_;
3461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current6_ == end6_) {
3462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_ = begin6_;
3463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current5_;
3464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current5_ == end5_) {
3466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_ = begin5_;
3467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current4_;
3468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
3470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
3471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
3472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
3474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
3475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
3476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
3478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
3479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
3480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
3484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
3485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
3487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
3489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
3490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
3492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
3493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
3494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
3495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
3496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
3497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
3498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
3499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
3500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
3501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
3502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
3503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_ &&
3504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == typed_other->current5_ &&
3505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == typed_other->current6_);
3506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
3509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
3510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
3511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
3512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
3513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
3514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
3515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
3516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
3517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
3518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
3519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
3520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
3521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
3522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_),
3523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin5_(other.begin5_),
3524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end5_(other.end5_),
3525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_(other.current5_),
3526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin6_(other.begin6_),
3527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end6_(other.end6_),
3528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_(other.current6_) {
3529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
3533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
3534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
3535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_, *current5_, *current6_);
3536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
3538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
3539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
3540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
3541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
3542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
3543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
3544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_ ||
3545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == end5_ ||
3546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == end6_;
3547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
3550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
3551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
3553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
3555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
3556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
3557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
3558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
3559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
3560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
3561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
3562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
3563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
3564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
3565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
3566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
3567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator begin5_;
3568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator end5_;
3569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T5>::iterator current5_;
3570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator begin6_;
3571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator end6_;
3572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T6>::iterator current6_;
3573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
3574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator6::Iterator
3575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
3577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator6& other);
3578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
3580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
3581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
3582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
3583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T5> g5_;
3584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T6> g6_;
3585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator6
3586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7>
3590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator7
3591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T7> > {
3593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
3594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
3595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
3597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
3600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
3601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator7() {}
3602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
3604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g7_.begin());
3607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
3609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
3611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
3614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
3615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
3616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
3617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
3618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
3619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
3620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
3621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
3622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
3623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
3624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4,
3625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T5>& g5,
3626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T5>::iterator& current5,
3627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6,
3628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T6>::iterator& current6,
3629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T7>& g7,
3630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T7>::iterator& current7)
3631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
3632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
3639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
3642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
3645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
3647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
3648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
3649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
3650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current7_;
3651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current7_ == end7_) {
3652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_ = begin7_;
3653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current6_;
3654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current6_ == end6_) {
3656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_ = begin6_;
3657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current5_;
3658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current5_ == end5_) {
3660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_ = begin5_;
3661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current4_;
3662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
3664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
3665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
3666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
3668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
3669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
3670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
3672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
3673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
3674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
3678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
3679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
3681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
3683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
3684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
3686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
3687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
3688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
3689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
3690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
3691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
3692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
3693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
3694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
3695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
3696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
3697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_ &&
3698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == typed_other->current5_ &&
3699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == typed_other->current6_ &&
3700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == typed_other->current7_);
3701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
3704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
3705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
3706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
3707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
3708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
3709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
3710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
3711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
3712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
3713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
3714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
3715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
3716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
3717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_),
3718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin5_(other.begin5_),
3719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end5_(other.end5_),
3720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_(other.current5_),
3721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin6_(other.begin6_),
3722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end6_(other.end6_),
3723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_(other.current6_),
3724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin7_(other.begin7_),
3725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end7_(other.end7_),
3726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_(other.current7_) {
3727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
3731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
3732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
3733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_, *current5_, *current6_, *current7_);
3734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
3736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
3737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
3738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
3739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
3740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
3741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
3742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_ ||
3743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == end5_ ||
3744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == end6_ ||
3745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == end7_;
3746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
3749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
3750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
3752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
3754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
3755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
3756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
3757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
3758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
3759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
3760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
3761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
3762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
3763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
3764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
3765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
3766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator begin5_;
3767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator end5_;
3768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T5>::iterator current5_;
3769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator begin6_;
3770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator end6_;
3771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T6>::iterator current6_;
3772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator begin7_;
3773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator end7_;
3774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T7>::iterator current7_;
3775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
3776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator7::Iterator
3777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
3779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator7& other);
3780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
3782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
3783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
3784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
3785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T5> g5_;
3786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T6> g6_;
3787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T7> g7_;
3788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator7
3789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8>
3793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator8
3794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T7, T8> > {
3796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
3797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
3798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
3800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
3803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T8>& g8)
3804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
3805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          g8_(g8) {}
3806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator8() {}
3807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
3809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g7_.begin(), g8_, g8_.begin());
3812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
3814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
3816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g8_.end());
3817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
3818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
3820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
3821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
3822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
3823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
3824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
3825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
3826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
3827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
3828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
3829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
3830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4,
3831894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T5>& g5,
3832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T5>::iterator& current5,
3833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6,
3834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T6>::iterator& current6,
3835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T7>& g7,
3836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T7>::iterator& current7,
3837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T8>& g8,
3838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T8>::iterator& current8)
3839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
3840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
3847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
3848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
3851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
3854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
3856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
3857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
3858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
3859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current8_;
3860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current8_ == end8_) {
3861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current8_ = begin8_;
3862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current7_;
3863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current7_ == end7_) {
3865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_ = begin7_;
3866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current6_;
3867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3868894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current6_ == end6_) {
3869894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_ = begin6_;
3870894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current5_;
3871894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3872894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current5_ == end5_) {
3873894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_ = begin5_;
3874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current4_;
3875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
3877894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
3878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
3879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
3881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
3882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
3883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
3885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
3886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
3887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
3888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
3891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
3892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
3894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
3896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
3897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3898894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
3899894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
3900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
3901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
3902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
3903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
3904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
3905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
3906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
3907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
3908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
3909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
3910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_ &&
3911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == typed_other->current5_ &&
3912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == typed_other->current6_ &&
3913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == typed_other->current7_ &&
3914894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current8_ == typed_other->current8_);
3915894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
3918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
3919894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
3920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
3921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
3922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
3923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
3924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
3925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
3926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
3927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
3928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
3929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
3930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
3931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_),
3932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin5_(other.begin5_),
3933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end5_(other.end5_),
3934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_(other.current5_),
3935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin6_(other.begin6_),
3936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end6_(other.end6_),
3937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_(other.current6_),
3938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin7_(other.begin7_),
3939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end7_(other.end7_),
3940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_(other.current7_),
3941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin8_(other.begin8_),
3942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end8_(other.end8_),
3943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current8_(other.current8_) {
3944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
3945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
3948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
3949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
3950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_, *current5_, *current6_, *current7_, *current8_);
3951894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3952894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
3953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
3954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
3955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
3956894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
3957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
3958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
3959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_ ||
3960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == end5_ ||
3961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == end6_ ||
3962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == end7_ ||
3963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current8_ == end8_;
3964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
3965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
3967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
3968894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3969894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
3970894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3971894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
3972894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
3973894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
3974894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
3975894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
3976894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
3977894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
3978894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
3979894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
3980894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
3981894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
3982894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
3983894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
3984894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator begin5_;
3985894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator end5_;
3986894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T5>::iterator current5_;
3987894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator begin6_;
3988894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator end6_;
3989894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T6>::iterator current6_;
3990894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator begin7_;
3991894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator end7_;
3992894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T7>::iterator current7_;
3993894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T8>::iterator begin8_;
3994894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T8>::iterator end8_;
3995894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T8>::iterator current8_;
3996894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
3997894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator8::Iterator
3998894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3999894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4000894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator8& other);
4001894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4002894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
4003894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
4004894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
4005894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
4006894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T5> g5_;
4007894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T6> g6_;
4008894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T7> g7_;
4009894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T8> g8_;
4010894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator8
4011894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4012894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4013894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4014894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9>
4015894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator9
4016894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4017894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T7, T8, T9> > {
4018894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4019894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
4020894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4021894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
4022894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4023894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4024894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4025894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
4026894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4027894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          g9_(g9) {}
4028894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator9() {}
4029894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4030894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
4031894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4032894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4033894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
4034894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4035894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
4036894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4037894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4038894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g8_.end(), g9_, g9_.end());
4039894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4040894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4041894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4042894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
4043894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
4044894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
4045894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
4046894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
4047894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
4048894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
4049894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
4050894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
4051894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
4052894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4,
4053894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T5>& g5,
4054894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T5>::iterator& current5,
4055894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6,
4056894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T6>::iterator& current6,
4057894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T7>& g7,
4058894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T7>::iterator& current7,
4059894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T8>& g8,
4060894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T8>::iterator& current8,
4061894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T9>& g9,
4062894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T9>::iterator& current9)
4063894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
4064894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4065894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4066894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4067894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4068894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4069894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4070894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4071894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4072894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
4073894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
4074894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4075894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
4076894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4077894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4078894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
4079894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4080894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
4081894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
4082894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
4083894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
4084894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current9_;
4085894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current9_ == end9_) {
4086894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current9_ = begin9_;
4087894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current8_;
4088894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4089894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current8_ == end8_) {
4090894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current8_ = begin8_;
4091894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current7_;
4092894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4093894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current7_ == end7_) {
4094894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_ = begin7_;
4095894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current6_;
4096894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4097894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current6_ == end6_) {
4098894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_ = begin6_;
4099894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current5_;
4100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current5_ == end5_) {
4102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_ = begin5_;
4103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current4_;
4104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
4106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
4107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
4108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
4110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
4111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
4112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
4114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
4115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
4116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
4118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
4120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
4121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
4123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
4125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
4126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
4128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
4129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
4130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
4131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
4132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
4133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
4134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
4135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
4136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
4137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
4138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
4139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_ &&
4140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == typed_other->current5_ &&
4141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == typed_other->current6_ &&
4142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == typed_other->current7_ &&
4143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current8_ == typed_other->current8_ &&
4144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current9_ == typed_other->current9_);
4145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
4148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
4149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
4150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
4151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
4152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
4153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
4154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
4155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
4156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
4157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
4158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
4159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
4160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
4161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_),
4162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin5_(other.begin5_),
4163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end5_(other.end5_),
4164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_(other.current5_),
4165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin6_(other.begin6_),
4166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end6_(other.end6_),
4167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_(other.current6_),
4168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin7_(other.begin7_),
4169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end7_(other.end7_),
4170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_(other.current7_),
4171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin8_(other.begin8_),
4172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end8_(other.end8_),
4173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current8_(other.current8_),
4174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin9_(other.begin9_),
4175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end9_(other.end9_),
4176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current9_(other.current9_) {
4177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
4178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
4181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
4182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
4183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_, *current5_, *current6_, *current7_, *current8_,
4184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current9_);
4185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
4187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
4188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
4189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
4190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
4191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
4192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
4193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_ ||
4194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == end5_ ||
4195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == end6_ ||
4196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == end7_ ||
4197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current8_ == end8_ ||
4198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current9_ == end9_;
4199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
4202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
4203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
4205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
4207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
4208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
4209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
4210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
4211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
4212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
4213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
4214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
4215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
4216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
4217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
4218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
4219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator begin5_;
4220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator end5_;
4221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T5>::iterator current5_;
4222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator begin6_;
4223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator end6_;
4224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T6>::iterator current6_;
4225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator begin7_;
4226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator end7_;
4227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T7>::iterator current7_;
4228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T8>::iterator begin8_;
4229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T8>::iterator end8_;
4230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T8>::iterator current8_;
4231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T9>::iterator begin9_;
4232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T9>::iterator end9_;
4233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T9>::iterator current9_;
4234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
4235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator9::Iterator
4236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator9& other);
4239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
4241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
4242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
4243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
4244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T5> g5_;
4245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T6> g6_;
4246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T7> g7_;
4247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T8> g8_;
4248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T9> g9_;
4249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator9
4250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6, typename T7, typename T8, typename T9, typename T10>
4254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductGenerator10
4255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T7, T8, T9, T10> > {
4257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
4259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
4261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
4265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T10>& g10)
4266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          g9_(g9), g10_(g10) {}
4268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ~CartesianProductGenerator10() {}
4269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* Begin() const {
4271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
4274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  virtual ParamIteratorInterface<ParamType>* End() const {
4276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
4279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class Iterator : public ParamIteratorInterface<ParamType> {
4283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   public:
4284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const ParamGeneratorInterface<ParamType>* base,
4285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T1>& g1,
4286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T1>::iterator& current1,
4287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T2>& g2,
4288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T2>::iterator& current2,
4289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T3>& g3,
4290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T3>::iterator& current3,
4291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T4>& g4,
4292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T4>::iterator& current4,
4293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T5>& g5,
4294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T5>::iterator& current5,
4295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T6>& g6,
4296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T6>::iterator& current6,
4297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T7>& g7,
4298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T7>::iterator& current7,
4299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T8>& g8,
4300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T8>::iterator& current8,
4301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T9>& g9,
4302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T9>::iterator& current9,
4303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const ParamGenerator<T10>& g10,
4304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const typename ParamGenerator<T10>::iterator& current10)
4305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(base),
4306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
4315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
4316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
4317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ~Iterator() {}
4319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return base_;
4322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // Advance should not be called on beyond-of-range iterators
4324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // so no component iterators must be beyond end of range, either.
4325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void Advance() {
4326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(!AtEnd());
4327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ++current10_;
4328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current10_ == end10_) {
4329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current10_ = begin10_;
4330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current9_;
4331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current9_ == end9_) {
4333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current9_ = begin9_;
4334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current8_;
4335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current8_ == end8_) {
4337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current8_ = begin8_;
4338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current7_;
4339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current7_ == end7_) {
4341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_ = begin7_;
4342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current6_;
4343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current6_ == end6_) {
4345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_ = begin6_;
4346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current5_;
4347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current5_ == end5_) {
4349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_ = begin5_;
4350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current4_;
4351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current4_ == end4_) {
4353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_ = begin4_;
4354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current3_;
4355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current3_ == end3_) {
4357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_ = begin3_;
4358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current2_;
4359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (current2_ == end2_) {
4361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_ = begin2_;
4362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ++current1_;
4363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
4364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
4365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual ParamIteratorInterface<ParamType>* Clone() const {
4367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return new Iterator(*this);
4368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual const ParamType* Current() const { return &current_value_; }
4370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // Having the same base generator guarantees that the other
4372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // iterator is of the same type and we can downcast.
4373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "The program attempted to compare iterators "
4375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          << "from different generators." << std::endl;
4376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      const Iterator* typed_other =
4377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          CheckedDowncastToActualType<const Iterator>(&other);
4378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterators equal if they both point beyond their
4379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // respective ranges. That can happen in a variety of fashions,
4380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // so we have to consult AtEnd().
4381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return (AtEnd() && typed_other->AtEnd()) ||
4382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         (
4383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == typed_other->current1_ &&
4384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == typed_other->current2_ &&
4385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == typed_other->current3_ &&
4386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == typed_other->current4_ &&
4387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == typed_other->current5_ &&
4388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == typed_other->current6_ &&
4389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == typed_other->current7_ &&
4390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current8_ == typed_other->current8_ &&
4391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current9_ == typed_other->current9_ &&
4392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current10_ == typed_other->current10_);
4393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
4396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Iterator(const Iterator& other)
4397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        : base_(other.base_),
4398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin1_(other.begin1_),
4399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end1_(other.end1_),
4400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current1_(other.current1_),
4401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin2_(other.begin2_),
4402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end2_(other.end2_),
4403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current2_(other.current2_),
4404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin3_(other.begin3_),
4405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end3_(other.end3_),
4406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current3_(other.current3_),
4407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin4_(other.begin4_),
4408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end4_(other.end4_),
4409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current4_(other.current4_),
4410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin5_(other.begin5_),
4411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end5_(other.end5_),
4412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current5_(other.current5_),
4413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin6_(other.begin6_),
4414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end6_(other.end6_),
4415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current6_(other.current6_),
4416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin7_(other.begin7_),
4417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end7_(other.end7_),
4418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current7_(other.current7_),
4419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin8_(other.begin8_),
4420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end8_(other.end8_),
4421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current8_(other.current8_),
4422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin9_(other.begin9_),
4423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end9_(other.end9_),
4424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current9_(other.current9_),
4425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        begin10_(other.begin10_),
4426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        end10_(other.end10_),
4427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current10_(other.current10_) {
4428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      ComputeCurrentValue();
4429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void ComputeCurrentValue() {
4432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!AtEnd())
4433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        current_value_ = ParamType(*current1_, *current2_, *current3_,
4434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current4_, *current5_, *current6_, *current7_, *current8_,
4435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            *current9_, *current10_);
4436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool AtEnd() const {
4438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // We must report iterator past the end of the range when either of the
4439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      // component iterators has reached the end of its range.
4440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return
4441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current1_ == end1_ ||
4442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current2_ == end2_ ||
4443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current3_ == end3_ ||
4444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current4_ == end4_ ||
4445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current5_ == end5_ ||
4446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current6_ == end6_ ||
4447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current7_ == end7_ ||
4448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current8_ == end8_ ||
4449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current9_ == end9_ ||
4450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          current10_ == end10_;
4451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
4452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // No implementation - assignment is unsupported.
4454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void operator=(const Iterator& other);
4455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const ParamGeneratorInterface<ParamType>* const base_;
4457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    // current[i]_ is the actual traversing iterator.
4459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator begin1_;
4460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T1>::iterator end1_;
4461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T1>::iterator current1_;
4462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator begin2_;
4463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T2>::iterator end2_;
4464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T2>::iterator current2_;
4465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator begin3_;
4466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T3>::iterator end3_;
4467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T3>::iterator current3_;
4468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator begin4_;
4469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T4>::iterator end4_;
4470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T4>::iterator current4_;
4471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator begin5_;
4472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T5>::iterator end5_;
4473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T5>::iterator current5_;
4474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator begin6_;
4475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T6>::iterator end6_;
4476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T6>::iterator current6_;
4477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator begin7_;
4478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T7>::iterator end7_;
4479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T7>::iterator current7_;
4480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T8>::iterator begin8_;
4481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T8>::iterator end8_;
4482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T8>::iterator current8_;
4483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T9>::iterator begin9_;
4484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T9>::iterator end9_;
4485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T9>::iterator current9_;
4486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T10>::iterator begin10_;
4487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const typename ParamGenerator<T10>::iterator end10_;
4488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename ParamGenerator<T10>::iterator current10_;
4489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ParamType current_value_;
4490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };  // class CartesianProductGenerator10::Iterator
4491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductGenerator10& other);
4494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T1> g1_;
4496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T2> g2_;
4497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T3> g3_;
4498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T4> g4_;
4499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T5> g5_;
4500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T6> g6_;
4501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T7> g7_;
4502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T8> g8_;
4503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T9> g9_;
4504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const ParamGenerator<T10> g10_;
4505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductGenerator10
4506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
4509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
4510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Helper classes providing Combine() with polymorphic features. They allow
4511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
4512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// convertible to U.
4513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
4514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2>
4515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder2 {
4516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
4518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2) {}
4519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2>
4520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
4521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
4522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator2<T1, T2>(
4523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_)));
4525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder2& other);
4530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder2
4534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3>
4536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder3 {
4537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
4539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3)
4540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3) {}
4541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3>
4542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
4543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
4544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator3<T1, T2, T3>(
4545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_)));
4548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder3& other);
4553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder3
4558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4>
4561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder4 {
4562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
4564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4)
4565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
4566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4>
4567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
4568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
4569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator4<T1, T2, T3, T4>(
4570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_)));
4574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder4& other);
4579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder4
4585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4, class Generator5>
4588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder5 {
4589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
4591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4, const Generator5& g5)
4592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
4593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4, typename T5>
4594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
4595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
4596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
4597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_),
4601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T5> >(g5_)));
4602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder5& other);
4607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator5 g5_;
4613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder5
4614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4, class Generator5, class Generator6>
4617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder6 {
4618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
4620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator6& g6)
4622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
4623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      typename T6>
4625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
4626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
4627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
4628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_),
4632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T5> >(g5_),
4633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T6> >(g6_)));
4634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder6& other);
4639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator5 g5_;
4645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator6 g6_;
4646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder6
4647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4, class Generator5, class Generator6, class Generator7>
4650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder7 {
4651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
4653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator6& g6, const Generator7& g7)
4655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
4656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      typename T6, typename T7>
4658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T7> >() const {
4660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
4661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
4662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_),
4666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T5> >(g5_),
4667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T6> >(g6_),
4668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T7> >(g7_)));
4669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder7& other);
4674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator5 g5_;
4680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator6 g6_;
4681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator7 g7_;
4682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder7
4683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4, class Generator5, class Generator6, class Generator7,
4686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator8>
4687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder8 {
4688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
4690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator6& g6, const Generator7& g7, const Generator8& g8)
4692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
4693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          g8_(g8) {}
4694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      typename T6, typename T7, typename T8>
4696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
4697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T8> >() const {
4698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
4699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
4700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_),
4704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T5> >(g5_),
4705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T6> >(g6_),
4706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T7> >(g7_),
4707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T8> >(g8_)));
4708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder8& other);
4713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator5 g5_;
4719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator6 g6_;
4720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator7 g7_;
4721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator8 g8_;
4722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder8
4723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4, class Generator5, class Generator6, class Generator7,
4726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator8, class Generator9>
4727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder9 {
4728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
4730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator6& g6, const Generator7& g7, const Generator8& g8,
4732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator9& g9)
4733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          g9_(g9) {}
4735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      typename T6, typename T7, typename T8, typename T9>
4737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T9> >() const {
4739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T9> >(
4741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
4742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_),
4746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T5> >(g5_),
4747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T6> >(g6_),
4748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T7> >(g7_),
4749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T8> >(g8_),
4750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T9> >(g9_)));
4751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder9& other);
4756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator5 g5_;
4762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator6 g6_;
4763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator7 g7_;
4764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator8 g8_;
4765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator9 g9_;
4766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder9
4767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <class Generator1, class Generator2, class Generator3,
4769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator4, class Generator5, class Generator6, class Generator7,
4770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    class Generator8, class Generator9, class Generator10>
4771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass CartesianProductHolder10 {
4772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
4773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
4774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator6& g6, const Generator7& g7, const Generator8& g8,
4776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const Generator9& g9, const Generator10& g10)
4777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          g9_(g9), g10_(g10) {}
4779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      typename T6, typename T7, typename T8, typename T9, typename T10>
4781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      T9, T10> >() const {
4783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        T9, T10> >(
4785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
4786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            T10>(
4787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T1> >(g1_),
4788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T2> >(g2_),
4789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T3> >(g3_),
4790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T4> >(g4_),
4791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T5> >(g5_),
4792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T6> >(g6_),
4793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T7> >(g7_),
4794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T8> >(g8_),
4795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T9> >(g9_),
4796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        static_cast<ParamGenerator<T10> >(g10_)));
4797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
4798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman private:
4800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // No implementation - assignment is unsupported.
4801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  void operator=(const CartesianProductHolder10& other);
4802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator1 g1_;
4804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator2 g2_;
4805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator3 g3_;
4806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator4 g4_;
4807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator5 g5_;
4808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator6 g6_;
4809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator7 g7_;
4810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator8 g8_;
4811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator9 g9_;
4812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const Generator10 g10_;
4813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};  // class CartesianProductHolder10
4814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
481519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# endif  // GTEST_HAS_COMBINE
4816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace internal
4818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace testing
4819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif  //  GTEST_HAS_PARAM_TEST
4821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
4823