146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This file was GENERATED by command:
246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     pump.py gtest-param-util-generated.h.pump
346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// DO NOT EDIT BY HAND!!!
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008 Google Inc.
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All Rights Reserved.
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: vladl@google.com (Vlad Losev)
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Type and function utilities for implementing parameterized tests.
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Currently Google Test supports at most 50 arguments in Values,
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and at most 10 arguments in Combine. Please contact
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// googletestframework@googlegroups.com if you need more.
42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Please note that the number of arguments to Combine is limited
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// by the maximum arity of the implementation of tr1::tuple which is
44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// currently set at 10.
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// scripts/fuse_gtest.py depends on gtest's own header being #included
5046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// *unconditionally*.  Therefore these #includes cannot be moved
5146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// inside #if GTEST_HAS_PARAM_TEST.
5246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-param-util.h"
5346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-port.h"
54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_PARAM_TEST
56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
58894236585f9b631a3994214143cfb9a559c12691Han Shen
59894236585f9b631a3994214143cfb9a559c12691Han Shen// Forward declarations of ValuesIn(), which is implemented in
60894236585f9b631a3994214143cfb9a559c12691Han Shen// include/gtest/gtest-param-test.h.
61894236585f9b631a3994214143cfb9a559c12691Han Shentemplate <typename ForwardIterator>
62894236585f9b631a3994214143cfb9a559c12691Han Sheninternal::ParamGenerator<
6346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
6446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanValuesIn(ForwardIterator begin, ForwardIterator end);
65894236585f9b631a3994214143cfb9a559c12691Han Shen
66894236585f9b631a3994214143cfb9a559c12691Han Shentemplate <typename T, size_t N>
67894236585f9b631a3994214143cfb9a559c12691Han Sheninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
68894236585f9b631a3994214143cfb9a559c12691Han Shen
69894236585f9b631a3994214143cfb9a559c12691Han Shentemplate <class Container>
70894236585f9b631a3994214143cfb9a559c12691Han Sheninternal::ParamGenerator<typename Container::value_type> ValuesIn(
71894236585f9b631a3994214143cfb9a559c12691Han Shen    const Container& container);
72894236585f9b631a3994214143cfb9a559c12691Han Shen
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Used in the Values() function to provide polymorphic capabilities.
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1>
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray1 {
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ValueArray1(T1 v1) : v1_(v1) {}
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
8546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
8646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray1& other);
8746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2>
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray2 {
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
9846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
10346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
10446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray2& other);
10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3>
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray3 {
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
11746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_)};
119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
12346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray3& other);
12546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4>
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray4 {
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4) {}
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
13946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
14046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_)};
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
14546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
14646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray4& other);
14746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray5 {
156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4), v5_(v5) {}
159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
16846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
16946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray5& other);
17046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6>
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray6 {
181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
18746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
18846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
18946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_)};
190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
19446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
19546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray6& other);
19646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7>
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray7 {
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
21446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
21546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
21646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_)};
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
22146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
22246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray7& other);
22346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8>
235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray8 {
236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8) {}
240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
24346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
24446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
24546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
25046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
25146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray8& other);
25246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9>
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray9 {
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9) {}
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
27346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
27446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
27546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
27646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_)};
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
28146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
28246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray9& other);
28346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10>
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray10 {
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10) {}
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
30546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
30646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
30746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
30846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_)};
309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
31346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
31446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray10& other);
31546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11>
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray11 {
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
33946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
34046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
34146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
34246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
34746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
34846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray11& other);
34946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12>
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray12 {
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
37446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
37546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
37646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
37746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
37846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_)};
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
38346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
38446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray12& other);
38546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13>
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray13 {
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12_(v12), v13_(v13) {}
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
41246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
41346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
41446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
41546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
41646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_)};
417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
42146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
42246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray13& other);
42346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14>
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray14 {
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
45146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
45246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
45346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
45446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
45546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
46046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
46146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray14& other);
46246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15>
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray15 {
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
49146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
49246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
49346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
49446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
49546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
49646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_)};
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
50146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
50246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray15& other);
50346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16>
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray16 {
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16_(v16) {}
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
53546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
53646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
53746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
53846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
53946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
54046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_)};
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
54546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
54646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray16& other);
54746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17>
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray17 {
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17) {}
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
58046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
58146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
58246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
58346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
58446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
58546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
59046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
59146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray17& other);
59246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18>
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray18 {
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
62646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
62746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
62846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
62946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
63046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
63146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
63246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_)};
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
63746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
63846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray18& other);
63946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19>
664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray19 {
665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
67446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
67546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
67646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
67746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
67846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
67946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
68046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_)};
681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
68546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
68646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray19& other);
68746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20>
713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray20 {
714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v19_(v19), v20_(v20) {}
721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
72446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
72546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
72646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
72746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
72846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
72946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
73046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
73546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
73646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray20& other);
73746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21>
765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray21 {
766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
77646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
77746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
77846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
77946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
78046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
78146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
78246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
78346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_)};
784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
78846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
78946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray21& other);
79046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22>
819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray22 {
820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
83046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
83146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
83246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
83346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
83446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
83546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
83646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
83746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_)};
838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
84246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
84346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray22& other);
84446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23>
874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray23 {
875dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
878dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23) {}
883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
88646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
88746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
88846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
88946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
89046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
89146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
89246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
89346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
89846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
89946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray23& other);
90046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24>
931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray24 {
932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v22_(v22), v23_(v23), v24_(v24) {}
940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
94346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
94446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
94546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
94646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
94746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
94846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
94946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
95046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
95146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_)};
952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
95646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
95746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray24& other);
95846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25>
990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray25 {
991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
100246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
100346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
100446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
100546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
100646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
100746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
100846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
100946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
101046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_)};
1011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
101546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
101646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray25& other);
101746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1033dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26>
1051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray26 {
1052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
1060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
106346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
106446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
106546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
106646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
106746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
106846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
106946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
107046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
107146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
1072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
107646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
107746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray26& other);
107846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27>
1113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray27 {
1114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v26_(v26), v27_(v27) {}
1123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
112646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
112746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
112846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
112946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
113046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
113146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
113246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
113346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
113446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
113546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_)};
1136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
114046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
114146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray27& other);
114246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28>
1178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray28 {
1179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
1188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
119146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
119246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
119346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
119446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
119546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
119646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
119746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
119846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
119946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
120046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_)};
1201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
120546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
120646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray28& other);
120746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29>
1244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray29 {
1245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
1254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
125746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
125846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
125946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
126046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
126146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
126246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
126346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
126446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
126546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
126646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
1267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
127146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
127246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray29& other);
127346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30>
1311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray30 {
1312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
1317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29_(v29), v30_(v30) {}
1322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
132546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
132646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
132746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
132846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
132946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
133046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
133146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
133246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
133346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
133446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
133546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_)};
1336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
134046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
134146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray30& other);
134246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31>
1382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray31 {
1383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
1388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29_(v29), v30_(v30), v31_(v31) {}
1393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
139646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
139746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
139846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
139946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
140046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
140146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
140246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
140346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
140446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
140546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
140646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_)};
1407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
141146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
141246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray31& other);
141346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32>
1454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray32 {
1455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
1460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
1465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
146846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
146946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
147046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
147146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
147246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
147346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
147446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
147546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
147646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
147746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
147846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
1479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
148346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
148446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray32& other);
148546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33>
1527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray33 {
1528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33_(v33) {}
1539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
154246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
154346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
154446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
154546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
154646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
154746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
154846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
154946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
155046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
155146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
155246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
155346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_)};
1554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
155846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
155946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray33& other);
156046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
1594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34>
1603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray34 {
1604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33_(v33), v34_(v34) {}
1615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
161846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
161946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
162046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
162146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
162246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
162346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
162446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
162546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
162646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
162746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
162846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
162946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_)};
1630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
163446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
163546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray34& other);
163646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
1670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
1671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35>
1680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray35 {
1681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
1691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
1692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
169546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
169646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
169746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
169846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
169946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
170046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
170146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
170246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
170346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
170446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
170546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
170646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
1707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
171146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
171246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray35& other);
171346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
1747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
1748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
1749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36>
1759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray36 {
1760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
1770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
1771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
177446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
177546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
177646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
177746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
177846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
177946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
178046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
178146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
178246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
178346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
178446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
178546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
178646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_)};
1787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
179146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
179246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray36& other);
179346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
1827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
1828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
1829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
1830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37>
1840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray37 {
1841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
1851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
1852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v36_(v36), v37_(v37) {}
1853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
185646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
185746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
185846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
185946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
186046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
186146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
186246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
186346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
186446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
186546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
186646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
186746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
186846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_)};
1869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
187346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
187446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray37& other);
187546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1878dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1891dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
1909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
1910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
1911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
1912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
1913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
1917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
1918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
1919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
1920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
1921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
1922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38>
1923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray38 {
1924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
1930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
1936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
1938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
193946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
194046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
194146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
194246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
194346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
194446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
194546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
194646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
194746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
194846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
194946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
195046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
195146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
1952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
1953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
195646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
195746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray38& other);
195846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
1960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
1961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
1962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
1963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
1964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
1965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
1966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
1967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
1968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
1969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
1970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
1971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
1972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
1973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
1974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
1975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
1976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
1977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
1978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
1979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
1980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
1981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
1982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
1983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
1984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
1985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
1986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
1987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
1988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
1989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
1990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
1991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
1992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
1993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
1994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
1995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
1996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
1997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39>
2007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray39 {
2008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
2014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
2020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
202346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
202446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
202546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
202646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
202746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
202846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
202946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
203046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
203146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
203246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
203346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
203446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
203546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
203646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_)};
2037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
204146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
204246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray39& other);
204346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40>
2093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray40 {
2094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
2100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v40_(v40) {}
2107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
211046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
211146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
211246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
211346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
211446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
211546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
211646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
211746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
211846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
211946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
212046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
212146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
212246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
212346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_)};
2124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
212846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
212946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray40& other);
213046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41>
2182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray41 {
2183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
2189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v39_(v39), v40_(v40), v41_(v41) {}
2196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
219946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
220046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
220146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
220246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
220346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
220446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
220546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
220646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
220746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
220846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
220946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
221046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
221146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
221246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
2213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
221746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
221846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray41& other);
221946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42>
2272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray42 {
2273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
2286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
228946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
229046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
229146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
229246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
229346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
229446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
229546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
229646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
229746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
229846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
229946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
230046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
230146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
230246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
230346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_)};
2304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
230846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
230946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray42& other);
231046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43>
2364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray43 {
2365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
2372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
2373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
2374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
2375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
2376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
2377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
2378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
238146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
238246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
238346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
238446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
238546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
238646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
238746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
238846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
238946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
239046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
239146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
239246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
239346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
239446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
239546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_)};
2396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
240046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
240146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray43& other);
240246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
2446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44>
2457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray44 {
2458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
2465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
2466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
2467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
2468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
2469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
2470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
2471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v43_(v43), v44_(v44) {}
2472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
247546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
247646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
247746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
247846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
247946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
248046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
248146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
248246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
248346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
248446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
248546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
248646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
248746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
248846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
248946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
2490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
249446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
249546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray44& other);
249646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
2540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
2541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45>
2552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray45 {
2553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
2560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
2561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
2562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
2563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
2564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
2565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
2566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
2567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
257046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
257146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
257246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
257346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
257446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
257546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
257646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
257746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
257846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
257946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
258046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
258146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
258246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
258346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
258446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
258546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v45_)};
2586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
259046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
259146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray45& other);
259246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
2636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
2637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T45 v45_;
2638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
2649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46>
2650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray46 {
2651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
2658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
2665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
266846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
266946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
267046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
267146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
267246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
267346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
267446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
267546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
267646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
267746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
267846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
267946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
268046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
268146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
268246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
268346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v45_), static_cast<T>(v46_)};
2684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
268846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
268946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray46& other);
269046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
2734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
2735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T45 v45_;
2736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T46 v46_;
2737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
2748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47>
2749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray47 {
2750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
2757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
2764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v47_(v47) {}
2765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
276846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
276946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
277046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
277146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
277246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
277346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
277446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
277546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
277646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
277746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
277846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
277946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
278046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
278146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
278246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
278346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
2784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
278846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
278946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray47& other);
279046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
2834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
2835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T45 v45_;
2836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T46 v46_;
2837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T47 v47_;
2838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
2849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47, typename T48>
2850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray48 {
2851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
2858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
2865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v46_(v46), v47_(v47), v48_(v48) {}
2866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
286946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
287046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
287146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
287246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
287346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
287446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
287546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
287646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
287746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
287846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
287946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
288046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
288146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
288246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
288346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
288446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
288546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v48_)};
2886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
289046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
289146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray48& other);
289246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
2897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
2898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
2899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
2900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
2901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
2902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
2903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
2904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
2905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
2906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
2907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
2908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
2909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
2910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
2911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
2912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
2913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
2914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
2915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
2916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
2917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
2918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
2919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
2920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
2921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
2922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
2923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
2924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
2925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
2926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
2927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
2928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
2929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
2930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
2931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
2932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
2933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
2934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
2935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
2936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
2937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T45 v45_;
2938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T46 v46_;
2939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T47 v47_;
2940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T48 v48_;
2941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
2945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
2946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
2947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
2948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
2949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
2950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
2951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
2952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47, typename T48, typename T49>
2953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray49 {
2954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
2955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
2961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
2969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
2971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
297246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
297346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
297446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
297546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
297646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
297746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
297846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
297946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
298046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
298146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
298246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
298346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
298446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
298546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
298646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
298746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
298846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v48_), static_cast<T>(v49_)};
2989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
2990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
299346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
299446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray49& other);
299546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
2997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
2998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
2999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
3000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
3001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
3002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
3003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
3004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
3005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
3006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
3007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
3008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
3009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
3010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
3011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
3012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
3013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
3014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
3015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
3016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
3017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
3018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
3019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
3020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
3021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
3022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
3023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
3024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
3025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
3026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
3027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
3028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
3029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
3030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
3031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
3032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
3033dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
3034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
3035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
3036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
3037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
3038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
3039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
3040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T45 v45_;
3041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T46 v46_;
3042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T47 v47_;
3043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T48 v48_;
3044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T49 v49_;
3045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
3046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10,
3049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T11, typename T12, typename T13, typename T14, typename T15,
3050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T16, typename T17, typename T18, typename T19, typename T20,
3051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T21, typename T22, typename T23, typename T24, typename T25,
3052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T26, typename T27, typename T28, typename T29, typename T30,
3053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T31, typename T32, typename T33, typename T34, typename T35,
3054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T36, typename T37, typename T38, typename T39, typename T40,
3055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T41, typename T42, typename T43, typename T44, typename T45,
3056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T46, typename T47, typename T48, typename T49, typename T50>
3057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValueArray50 {
3058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
3061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
3062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
3063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
3064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
3065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
3066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
3067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
3068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
3069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
3070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
3071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
3072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
3073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T>
3075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator<T>() const {
307646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
307746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
307846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
307946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
308046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
308146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
308246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
308346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
308446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
308546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
308646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
308746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
308846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
308946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
309046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
309146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
309246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
3093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ValuesIn(array);
3094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
309746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
309846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValueArray50& other);
309946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1 v1_;
3101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2 v2_;
3102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3 v3_;
3103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4 v4_;
3104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5 v5_;
3105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6 v6_;
3106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7 v7_;
3107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8 v8_;
3108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9 v9_;
3109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10 v10_;
3110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T11 v11_;
3111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T12 v12_;
3112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T13 v13_;
3113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T14 v14_;
3114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T15 v15_;
3115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T16 v16_;
3116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T17 v17_;
3117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T18 v18_;
3118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T19 v19_;
3119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T20 v20_;
3120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T21 v21_;
3121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T22 v22_;
3122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T23 v23_;
3123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T24 v24_;
3124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T25 v25_;
3125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T26 v26_;
3126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T27 v27_;
3127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T28 v28_;
3128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T29 v29_;
3129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T30 v30_;
3130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T31 v31_;
3131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T32 v32_;
3132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T33 v33_;
3133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T34 v34_;
3134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T35 v35_;
3135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T36 v36_;
3136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T37 v37_;
3137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T38 v38_;
3138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T39 v39_;
3139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T40 v40_;
3140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T41 v41_;
3141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T42 v42_;
3142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T43 v43_;
3143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T44 v44_;
3144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T45 v45_;
3145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T46 v46_;
3146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T47 v47_;
3147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T48 v48_;
3148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T49 v49_;
3149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T50 v50_;
3150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
3151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
315246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# if GTEST_HAS_COMBINE
3153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
3154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
3155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Generates values from the Cartesian product of values produced
3156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// by the argument generators.
3157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
3158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2>
3159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator2
3160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
3161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2> ParamType;
3163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
3165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2)
3166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2) {}
3167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator2() {}
3168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
3170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
3171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
3173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
3174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
3177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
3178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
3179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
3180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
3181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
3182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
3183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2)
3184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
3185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
3187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
3190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
3193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
3195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
3196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
3197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
3198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current2_;
3199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
3200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
3201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
3202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
3206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
3207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
3209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
3211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
3212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
3214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
3215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
3216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
3217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
3218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
3219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
3220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
3221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
3222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
3223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_);
3224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
3227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
3228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
3229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
3230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
3231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
3232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
3233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
3234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_) {
3235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
3239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
3240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_);
3241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
3243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
3244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
3245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
3246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
3247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_;
3248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
325046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
325146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
325246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
3254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
3256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
3257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
3258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
3259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
3260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
3261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
3262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
326346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator2::Iterator
326446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
326546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
326646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator2& other);
3267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
3269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
327046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator2
3271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3>
3274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator3
3275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
3276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
3278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
3280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
3281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3) {}
3282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator3() {}
3283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
3285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin());
3287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
3289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
3290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
3293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
3294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
3295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
3296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
3297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
3298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
3299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
3300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
3301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3)
3302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
3303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
3306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
3309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
3312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
3314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
3315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
3316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
3317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current3_;
3318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
3319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
3320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
3321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
3323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
3324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
3325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
3329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
3330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
3332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
3334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
3335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
3337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
3338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
3339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
3340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
3341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
3342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
3343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
3344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
3345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
3346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
3347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_);
3348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
3351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
3352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
3353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
3354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
3355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
3356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
3357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
3358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
3359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
3360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
3361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_) {
3362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
3366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
3367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_);
3368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
3370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
3371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
3372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
3373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
3374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
3375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_;
3376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
337846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
337946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
338046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
3382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
3384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
3385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
3386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
3387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
3388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
3389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
3390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
3391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
3392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
3393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
339446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator3::Iterator
339546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
339646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
339746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator3& other);
3398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
3400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
3401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
340246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator3
3403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4>
3406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator4
3407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
3408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
3410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
3412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4)
3414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
3415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator4() {}
3416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
3418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin());
3420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
3422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end());
3424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
3427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
3428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
3429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
3430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
3431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
3432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
3433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
3434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
3435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
3436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
3437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4)
3438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
3439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
3443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
3446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
3449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
3451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
3452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
3453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
3454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current4_;
3455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
3456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
3457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
3458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
3460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
3461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
3462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
3464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
3465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
3466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
3470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
3471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
3473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
3475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
3476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
3478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
3479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
3480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
3481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
3482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
3483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
3484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
3485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
3486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
3487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
3488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
3489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_);
3490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
3493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
3494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
3495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
3496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
3497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
3498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
3499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
3500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
3501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
3502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
3503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
3504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
3505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
3506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_) {
3507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
3511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
3512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
3513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_);
3514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
3516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
3517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
3518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
3519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
3520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
3521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
3522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_;
3523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
352546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
352646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
352746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
3529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
3531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
3532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
3533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
3534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
3535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
3536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
3537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
3538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
3539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
3540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
3541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
3542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
3543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
354446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator4::Iterator
354546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
354646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
354746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator4& other);
3548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
3550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
3551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
3552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
355346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator4
3554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator5
3558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
3559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
3561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
3563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
3565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
3566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator5() {}
3567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
3569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
3571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
3573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end(), g5_, g5_.end());
3575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
3578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
3579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
3580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
3581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
3582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
3583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
3584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
3585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
3586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
3587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
3588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4,
3589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T5>& g5,
3590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T5>::iterator& current5)
3591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
3592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
3597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
3600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
3603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
3605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
3606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
3607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
3608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current5_;
3609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current5_ == end5_) {
3610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_ = begin5_;
3611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current4_;
3612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
3614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
3615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
3616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
3618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
3619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
3620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
3622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
3623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
3624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
3628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
3629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
3631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
3633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
3634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
3636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
3637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
3638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
3639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
3640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
3641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
3642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
3643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
3644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
3645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
3646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
3647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_ &&
3648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == typed_other->current5_);
3649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
3652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
3653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
3654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
3655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
3656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
3657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
3658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
3659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
3660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
3661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
3662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
3663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
3664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
3665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_),
3666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin5_(other.begin5_),
3667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end5_(other.end5_),
3668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_(other.current5_) {
3669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
3673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
3674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
3675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_, *current5_);
3676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
3678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
3679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
3680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
3681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
3682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
3683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
3684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_ ||
3685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == end5_;
3686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
368846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
368946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
369046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
3692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
3694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
3695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
3696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
3697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
3698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
3699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
3700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
3701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
3702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
3703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
3704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
3705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
3706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator begin5_;
3707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator end5_;
3708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T5>::iterator current5_;
3709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
371046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator5::Iterator
371146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
371246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
371346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator5& other);
3714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
3716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
3717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
3718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
3719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T5> g5_;
372046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator5
3721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6>
3725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator6
3726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
3727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T6> > {
3728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
3730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
3732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6)
3735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
3736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator6() {}
3737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
3739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
3741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
3743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
3745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
3748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
3749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
3750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
3751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
3752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
3753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
3754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
3755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
3756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
3757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
3758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4,
3759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T5>& g5,
3760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T5>::iterator& current5,
3761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6,
3762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T6>::iterator& current6)
3763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
3764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
3770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
3773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
3776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
3778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
3779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
3780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
3781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current6_;
3782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current6_ == end6_) {
3783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_ = begin6_;
3784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current5_;
3785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current5_ == end5_) {
3787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_ = begin5_;
3788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current4_;
3789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
3791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
3792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
3793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
3795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
3796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
3797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
3799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
3800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
3801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
3805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
3806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
3808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
3810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
3811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
3813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
3814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
3815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
3816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
3817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
3818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
3819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
3820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
3821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
3822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
3823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
3824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_ &&
3825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == typed_other->current5_ &&
3826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == typed_other->current6_);
3827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
3830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
3831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
3832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
3833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
3834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
3835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
3836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
3837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
3838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
3839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
3840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
3841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
3842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
3843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_),
3844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin5_(other.begin5_),
3845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end5_(other.end5_),
3846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_(other.current5_),
3847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin6_(other.begin6_),
3848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end6_(other.end6_),
3849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_(other.current6_) {
3850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
3854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
3855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
3856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_, *current5_, *current6_);
3857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
3859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
3860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
3861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
3862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
3863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
3864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
3865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_ ||
3866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == end5_ ||
3867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == end6_;
3868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
387046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
387146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
387246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
3874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3875dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
3876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
3877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
3878dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
3879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
3880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
3881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
3882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
3883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
3884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
3885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
3886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
3887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
3888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator begin5_;
3889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator end5_;
3890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T5>::iterator current5_;
3891dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator begin6_;
3892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator end6_;
3893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T6>::iterator current6_;
3894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
389546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator6::Iterator
389646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
389746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
389846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator6& other);
3899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
3901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
3902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
3903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
3904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T5> g5_;
3905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T6> g6_;
390646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator6
3907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7>
3911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator7
3912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T7> > {
3914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
3915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
3916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
3918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
3921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
3922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator7() {}
3923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
3925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g7_.begin());
3928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
3930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
3932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
3933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
3935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
3936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
3937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
3938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
3939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
3940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
3941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
3942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
3943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
3944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
3945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4,
3946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T5>& g5,
3947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T5>::iterator& current5,
3948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6,
3949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T6>::iterator& current6,
3950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T7>& g7,
3951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T7>::iterator& current7)
3952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
3953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
3960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
3963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
3966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
3968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
3969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
3970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
3971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current7_;
3972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current7_ == end7_) {
3973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_ = begin7_;
3974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current6_;
3975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current6_ == end6_) {
3977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_ = begin6_;
3978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current5_;
3979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current5_ == end5_) {
3981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_ = begin5_;
3982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current4_;
3983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
3985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
3986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
3987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
3989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
3990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
3991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
3993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
3994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
3995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
3996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
3997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
3998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
3999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
4000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
4002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
4004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
4005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
4007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
4008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
4009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
4010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
4011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
4012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
4013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
4014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
4015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
4016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
4017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
4018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_ &&
4019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == typed_other->current5_ &&
4020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == typed_other->current6_ &&
4021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == typed_other->current7_);
4022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
4025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
4026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
4027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
4028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
4029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
4030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
4031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
4032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
4033dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
4034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
4035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
4036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
4037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
4038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_),
4039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin5_(other.begin5_),
4040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end5_(other.end5_),
4041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_(other.current5_),
4042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin6_(other.begin6_),
4043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end6_(other.end6_),
4044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_(other.current6_),
4045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin7_(other.begin7_),
4046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end7_(other.end7_),
4047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_(other.current7_) {
4048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
4052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
4053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
4054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_, *current5_, *current6_, *current7_);
4055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
4057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
4058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
4059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
4060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
4061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
4062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
4063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_ ||
4064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == end5_ ||
4065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == end6_ ||
4066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == end7_;
4067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
406946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
407046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
407146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
4073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
4075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
4076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
4077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
4078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
4079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
4080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
4081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
4082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
4083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
4084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
4085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
4086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
4087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator begin5_;
4088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator end5_;
4089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T5>::iterator current5_;
4090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator begin6_;
4091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator end6_;
4092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T6>::iterator current6_;
4093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator begin7_;
4094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator end7_;
4095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T7>::iterator current7_;
4096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
409746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator7::Iterator
409846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
409946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
410046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator7& other);
4101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
4103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
4104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
4105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
4106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T5> g5_;
4107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T6> g6_;
4108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T7> g7_;
410946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator7
4110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8>
4114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator8
4115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T7, T8> > {
4117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
4119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
4121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T8>& g8)
4125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
4126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          g8_(g8) {}
4127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator8() {}
4128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
4130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g7_.begin(), g8_, g8_.begin());
4133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
4135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g8_.end());
4138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
4141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
4142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
4143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
4144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
4145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
4146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
4147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
4148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
4149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
4150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
4151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4,
4152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T5>& g5,
4153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T5>::iterator& current5,
4154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6,
4155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T6>::iterator& current6,
4156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T7>& g7,
4157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T7>::iterator& current7,
4158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T8>& g8,
4159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T8>::iterator& current8)
4160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
4161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
4169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
4172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
4175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
4177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
4178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
4179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
4180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current8_;
4181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current8_ == end8_) {
4182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current8_ = begin8_;
4183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current7_;
4184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current7_ == end7_) {
4186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_ = begin7_;
4187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current6_;
4188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current6_ == end6_) {
4190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_ = begin6_;
4191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current5_;
4192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current5_ == end5_) {
4194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_ = begin5_;
4195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current4_;
4196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
4198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
4199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
4200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
4202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
4203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
4204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
4206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
4207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
4208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
4212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
4213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
4215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
4217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
4218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
4220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
4221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
4222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
4223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
4224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
4225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
4226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
4227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
4228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
4229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
4230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
4231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_ &&
4232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == typed_other->current5_ &&
4233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == typed_other->current6_ &&
4234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == typed_other->current7_ &&
4235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current8_ == typed_other->current8_);
4236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
4239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
4240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
4241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
4242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
4243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
4244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
4245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
4246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
4247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
4248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
4249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
4250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
4251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
4252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_),
4253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin5_(other.begin5_),
4254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end5_(other.end5_),
4255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_(other.current5_),
4256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin6_(other.begin6_),
4257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end6_(other.end6_),
4258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_(other.current6_),
4259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin7_(other.begin7_),
4260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end7_(other.end7_),
4261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_(other.current7_),
4262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin8_(other.begin8_),
4263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end8_(other.end8_),
4264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current8_(other.current8_) {
4265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
4269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
4270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
4271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_, *current5_, *current6_, *current7_, *current8_);
4272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
4274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
4275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
4276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
4277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
4278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
4279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
4280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_ ||
4281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == end5_ ||
4282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == end6_ ||
4283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == end7_ ||
4284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current8_ == end8_;
4285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
428746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
428846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
428946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
4291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
4293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
4294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
4295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
4296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
4297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
4298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
4299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
4300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
4301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
4302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
4303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
4304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
4305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator begin5_;
4306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator end5_;
4307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T5>::iterator current5_;
4308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator begin6_;
4309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator end6_;
4310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T6>::iterator current6_;
4311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator begin7_;
4312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator end7_;
4313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T7>::iterator current7_;
4314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T8>::iterator begin8_;
4315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T8>::iterator end8_;
4316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T8>::iterator current8_;
4317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
431846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator8::Iterator
431946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
432046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
432146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator8& other);
4322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
4324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
4325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
4326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
4327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T5> g5_;
4328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T6> g6_;
4329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T7> g7_;
4330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T8> g8_;
433146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator8
4332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9>
4336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator9
4337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T7, T8, T9> > {
4339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
4341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
4343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
4347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          g9_(g9) {}
4349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator9() {}
4350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
4352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
4355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
4357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g8_.end(), g9_, g9_.end());
4360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
4363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
4364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
4365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
4366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
4367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
4368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
4369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
4370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
4371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
4372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
4373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4,
4374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T5>& g5,
4375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T5>::iterator& current5,
4376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6,
4377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T6>::iterator& current6,
4378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T7>& g7,
4379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T7>::iterator& current7,
4380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T8>& g8,
4381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T8>::iterator& current8,
4382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T9>& g9,
4383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T9>::iterator& current9)
4384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
4385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
4394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
4397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
4400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
4402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
4403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
4404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
4405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current9_;
4406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current9_ == end9_) {
4407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current9_ = begin9_;
4408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current8_;
4409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current8_ == end8_) {
4411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current8_ = begin8_;
4412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current7_;
4413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current7_ == end7_) {
4415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_ = begin7_;
4416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current6_;
4417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current6_ == end6_) {
4419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_ = begin6_;
4420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current5_;
4421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current5_ == end5_) {
4423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_ = begin5_;
4424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current4_;
4425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
4427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
4428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
4429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
4431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
4432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
4433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
4435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
4436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
4437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
4441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
4442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
4444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
4446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
4447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
4449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
4450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
4451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
4452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
4453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
4454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
4455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
4456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
4457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
4458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
4459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
4460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_ &&
4461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == typed_other->current5_ &&
4462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == typed_other->current6_ &&
4463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == typed_other->current7_ &&
4464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current8_ == typed_other->current8_ &&
4465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current9_ == typed_other->current9_);
4466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
4469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
4470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
4471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
4472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
4473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
4474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
4475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
4476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
4477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
4478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
4479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
4480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
4481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
4482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_),
4483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin5_(other.begin5_),
4484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end5_(other.end5_),
4485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_(other.current5_),
4486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin6_(other.begin6_),
4487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end6_(other.end6_),
4488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_(other.current6_),
4489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin7_(other.begin7_),
4490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end7_(other.end7_),
4491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_(other.current7_),
4492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin8_(other.begin8_),
4493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end8_(other.end8_),
4494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current8_(other.current8_),
4495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin9_(other.begin9_),
4496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end9_(other.end9_),
4497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current9_(other.current9_) {
4498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
4502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
4503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
4504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_, *current5_, *current6_, *current7_, *current8_,
4505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current9_);
4506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
4508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
4509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
4510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
4511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
4512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
4513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
4514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_ ||
4515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == end5_ ||
4516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == end6_ ||
4517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == end7_ ||
4518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current8_ == end8_ ||
4519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current9_ == end9_;
4520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
452246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
452346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
452446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
4526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
4528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
4529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
4530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
4531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
4532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
4533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
4534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
4535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
4536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
4537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
4538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
4539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
4540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator begin5_;
4541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator end5_;
4542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T5>::iterator current5_;
4543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator begin6_;
4544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator end6_;
4545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T6>::iterator current6_;
4546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator begin7_;
4547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator end7_;
4548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T7>::iterator current7_;
4549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T8>::iterator begin8_;
4550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T8>::iterator end8_;
4551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T8>::iterator current8_;
4552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T9>::iterator begin9_;
4553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T9>::iterator end9_;
4554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T9>::iterator current9_;
4555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
455646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator9::Iterator
455746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
455846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
455946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator9& other);
4560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
4562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
4563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
4564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
4565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T5> g5_;
4566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T6> g6_;
4567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T7> g7_;
4568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T8> g8_;
4569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T9> g9_;
457046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator9
4571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10>
4575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductGenerator10
4576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T7, T8, T9, T10> > {
4578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
4580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
4582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
4586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T10>& g10)
4587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          g9_(g9), g10_(g10) {}
4589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CartesianProductGenerator10() {}
4590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* Begin() const {
4592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
4595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<ParamType>* End() const {
4597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
4600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
4603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<ParamType> {
4604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
4605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<ParamType>* base,
4606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T1>& g1,
4607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T1>::iterator& current1,
4608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T2>& g2,
4609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T2>::iterator& current2,
4610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T3>& g3,
4611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T3>::iterator& current3,
4612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T4>& g4,
4613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T4>::iterator& current4,
4614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T5>& g5,
4615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T5>::iterator& current5,
4616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T6>& g6,
4617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T6>::iterator& current6,
4618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T7>& g7,
4619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T7>::iterator& current7,
4620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T8>& g8,
4621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T8>::iterator& current8,
4622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T9>& g9,
4623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T9>::iterator& current9,
4624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const ParamGenerator<T10>& g10,
4625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const typename ParamGenerator<T10>::iterator& current10)
4626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base),
4627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
4636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
4637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
4640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
4643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Advance should not be called on beyond-of-range iterators
4645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // so no component iterators must be beyond end of range, either.
4646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
4647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      assert(!AtEnd());
4648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++current10_;
4649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current10_ == end10_) {
4650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current10_ = begin10_;
4651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current9_;
4652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current9_ == end9_) {
4654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current9_ = begin9_;
4655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current8_;
4656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current8_ == end8_) {
4658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current8_ = begin8_;
4659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current7_;
4660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current7_ == end7_) {
4662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_ = begin7_;
4663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current6_;
4664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current6_ == end6_) {
4666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_ = begin6_;
4667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current5_;
4668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current5_ == end5_) {
4670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_ = begin5_;
4671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current4_;
4672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current4_ == end4_) {
4674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_ = begin4_;
4675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current3_;
4676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current3_ == end3_) {
4678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_ = begin3_;
4679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current2_;
4680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (current2_ == end2_) {
4682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_ = begin2_;
4683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ++current1_;
4684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
4685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<ParamType>* Clone() const {
4688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
4689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamType* Current() const { return &current_value_; }
4691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
4693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
4694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
4696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
4697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const Iterator* typed_other =
4698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other);
4699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterators equal if they both point beyond their
4700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // respective ranges. That can happen in a variety of fashions,
4701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // so we have to consult AtEnd().
4702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return (AtEnd() && typed_other->AtEnd()) ||
4703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         (
4704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == typed_other->current1_ &&
4705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == typed_other->current2_ &&
4706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == typed_other->current3_ &&
4707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == typed_other->current4_ &&
4708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == typed_other->current5_ &&
4709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == typed_other->current6_ &&
4710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == typed_other->current7_ &&
4711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current8_ == typed_other->current8_ &&
4712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current9_ == typed_other->current9_ &&
4713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current10_ == typed_other->current10_);
4714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
4717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
4718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(other.base_),
4719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin1_(other.begin1_),
4720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end1_(other.end1_),
4721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current1_(other.current1_),
4722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin2_(other.begin2_),
4723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end2_(other.end2_),
4724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current2_(other.current2_),
4725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin3_(other.begin3_),
4726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end3_(other.end3_),
4727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current3_(other.current3_),
4728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin4_(other.begin4_),
4729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end4_(other.end4_),
4730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current4_(other.current4_),
4731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin5_(other.begin5_),
4732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end5_(other.end5_),
4733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current5_(other.current5_),
4734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin6_(other.begin6_),
4735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end6_(other.end6_),
4736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current6_(other.current6_),
4737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin7_(other.begin7_),
4738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end7_(other.end7_),
4739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current7_(other.current7_),
4740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin8_(other.begin8_),
4741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end8_(other.end8_),
4742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current8_(other.current8_),
4743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin9_(other.begin9_),
4744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end9_(other.end9_),
4745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current9_(other.current9_),
4746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        begin10_(other.begin10_),
4747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        end10_(other.end10_),
4748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current10_(other.current10_) {
4749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ComputeCurrentValue();
4750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    void ComputeCurrentValue() {
4753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (!AtEnd())
4754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        current_value_ = ParamType(*current1_, *current2_, *current3_,
4755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current4_, *current5_, *current6_, *current7_, *current8_,
4756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            *current9_, *current10_);
4757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool AtEnd() const {
4759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We must report iterator past the end of the range when either of the
4760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // component iterators has reached the end of its range.
4761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return
4762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current1_ == end1_ ||
4763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current2_ == end2_ ||
4764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current3_ == end3_ ||
4765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current4_ == end4_ ||
4766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current5_ == end5_ ||
4767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current6_ == end6_ ||
4768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current7_ == end7_ ||
4769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current8_ == end8_ ||
4770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current9_ == end9_ ||
4771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          current10_ == end10_;
4772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
4773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
477446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
477546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
477646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<ParamType>* const base_;
4778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // current[i]_ is the actual traversing iterator.
4780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator begin1_;
4781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T1>::iterator end1_;
4782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T1>::iterator current1_;
4783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator begin2_;
4784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T2>::iterator end2_;
4785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T2>::iterator current2_;
4786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator begin3_;
4787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T3>::iterator end3_;
4788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T3>::iterator current3_;
4789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator begin4_;
4790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T4>::iterator end4_;
4791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T4>::iterator current4_;
4792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator begin5_;
4793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T5>::iterator end5_;
4794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T5>::iterator current5_;
4795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator begin6_;
4796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T6>::iterator end6_;
4797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T6>::iterator current6_;
4798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator begin7_;
4799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T7>::iterator end7_;
4800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T7>::iterator current7_;
4801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T8>::iterator begin8_;
4802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T8>::iterator end8_;
4803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T8>::iterator current8_;
4804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T9>::iterator begin9_;
4805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T9>::iterator end9_;
4806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T9>::iterator current9_;
4807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T10>::iterator begin10_;
4808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const typename ParamGenerator<T10>::iterator end10_;
4809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ParamGenerator<T10>::iterator current10_;
4810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamType current_value_;
481146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class CartesianProductGenerator10::Iterator
481246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
481346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
481446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductGenerator10& other);
4815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T1> g1_;
4817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T2> g2_;
4818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T3> g3_;
4819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T4> g4_;
4820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T5> g5_;
4821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T6> g6_;
4822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T7> g7_;
4823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T8> g8_;
4824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T9> g9_;
4825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamGenerator<T10> g10_;
482646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductGenerator10
4827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
4830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Helper classes providing Combine() with polymorphic features. They allow
4832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
4833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// convertible to U.
4834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2>
4836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder2 {
4837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
4839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2) {}
4840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2>
4841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
4842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
4843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator2<T1, T2>(
4844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
4845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_)));
4846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
484946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
485046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder2& other);
485146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
4853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
485446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder2
4855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3>
4857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder3 {
4858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
4860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3)
4861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3) {}
4862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3>
4863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
4864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
4865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator3<T1, T2, T3>(
4866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
4867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
4868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_)));
4869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
487246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
487346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder3& other);
487446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4875dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
4876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
4877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
487846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder3
4879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
4881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4>
4882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder4 {
4883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
4885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4)
4886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
4887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4>
4888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
4889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
4890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator4<T1, T2, T3, T4>(
4891dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
4892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
4893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
4894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_)));
4895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
489846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
489946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder4& other);
490046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
4902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
4903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
4904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
490546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder4
4906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
4908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4, class Generator5>
4909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder5 {
4910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
4912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4, const Generator5& g5)
4913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
4914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4, typename T5>
4915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
4916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
4917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
4918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
4919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
4920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
4921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_),
4922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T5> >(g5_)));
4923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
492646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
492746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder5& other);
492846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
4930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
4931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
4932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
4933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator5 g5_;
493446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder5
4935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
4937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4, class Generator5, class Generator6>
4938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder6 {
4939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
4941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator6& g6)
4943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
4944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename T6>
4946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
4947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
4948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
4949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
4950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
4951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
4952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_),
4953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T5> >(g5_),
4954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T6> >(g6_)));
4955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
495846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
495946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder6& other);
496046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
4962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
4963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
4964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
4965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator5 g5_;
4966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator6 g6_;
496746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder6
4968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
4970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4, class Generator5, class Generator6, class Generator7>
4971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder7 {
4972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
4973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
4974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator6& g6, const Generator7& g7)
4976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
4977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename T6, typename T7>
4979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T7> >() const {
4981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
4982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
4983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
4984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
4985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
4986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_),
4987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T5> >(g5_),
4988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T6> >(g6_),
4989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T7> >(g7_)));
4990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
4991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
499346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
499446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder7& other);
499546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
4997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
4998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
4999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
5000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator5 g5_;
5001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator6 g6_;
5002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator7 g7_;
500346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder7
5004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
5006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4, class Generator5, class Generator6, class Generator7,
5007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator8>
5008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder8 {
5009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
5010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
5011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
5012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator6& g6, const Generator7& g7, const Generator8& g8)
5013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
5014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          g8_(g8) {}
5015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
5016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename T6, typename T7, typename T8>
5017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
5018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T8> >() const {
5019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
5020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
5021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
5022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
5023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
5024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_),
5025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T5> >(g5_),
5026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T6> >(g6_),
5027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T7> >(g7_),
5028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T8> >(g8_)));
5029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
5030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
503246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
503346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder8& other);
503446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
5035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
5036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
5037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
5038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
5039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator5 g5_;
5040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator6 g6_;
5041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator7 g7_;
5042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator8 g8_;
504346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder8
5044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
5046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4, class Generator5, class Generator6, class Generator7,
5047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator8, class Generator9>
5048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder9 {
5049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
5050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
5051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
5052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator6& g6, const Generator7& g7, const Generator8& g8,
5053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator9& g9)
5054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
5055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          g9_(g9) {}
5056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
5057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename T6, typename T7, typename T8, typename T9>
5058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
5059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T9> >() const {
5060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
5061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T9> >(
5062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
5063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
5064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
5065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
5066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_),
5067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T5> >(g5_),
5068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T6> >(g6_),
5069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T7> >(g7_),
5070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T8> >(g8_),
5071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T9> >(g9_)));
5072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
5073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
507546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
507646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder9& other);
507746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
5078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
5079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
5080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
5081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
5082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator5 g5_;
5083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator6 g6_;
5084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator7 g7_;
5085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator8 g8_;
5086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator9 g9_;
508746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder9
5088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Generator1, class Generator2, class Generator3,
5090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator4, class Generator5, class Generator6, class Generator7,
5091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class Generator8, class Generator9, class Generator10>
5092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CartesianProductHolder10 {
5093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
5094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
5095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
5096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator6& g6, const Generator7& g7, const Generator8& g8,
5097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Generator9& g9, const Generator10& g10)
5098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
5099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          g9_(g9), g10_(g10) {}
5100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
5101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename T6, typename T7, typename T8, typename T9, typename T10>
5102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
5103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T9, T10> >() const {
5104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
5105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        T9, T10> >(
5106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
5107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            T10>(
5108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T1> >(g1_),
5109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T2> >(g2_),
5110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T3> >(g3_),
5111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T4> >(g4_),
5112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T5> >(g5_),
5113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T6> >(g6_),
5114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T7> >(g7_),
5115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T8> >(g8_),
5116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T9> >(g9_),
5117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        static_cast<ParamGenerator<T10> >(g10_)));
5118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
5119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
512146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
512246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const CartesianProductHolder10& other);
512346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
5124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator1 g1_;
5125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator2 g2_;
5126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator3 g3_;
5127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator4 g4_;
5128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator5 g5_;
5129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator6 g6_;
5130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator7 g7_;
5131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator8 g8_;
5132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator9 g9_;
5133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Generator10 g10_;
513446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};  // class CartesianProductHolder10
5135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
513646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif  // GTEST_HAS_COMBINE
5137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
5139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
5140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  //  GTEST_HAS_PARAM_TEST
5142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
5144