1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// All Rights Reserved.
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: vladl@google.com (Vlad Losev)
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Type and function utilities for implementing parameterized tests.
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Currently Google Test supports at most 50 arguments in Values,
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and at most 10 arguments in Combine. Please contact
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// googletestframework@googlegroups.com if you need more.
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Please note that the number of arguments to Combine is limited
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// by the maximum arity of the implementation of tr1::tuple which is
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// currently set at 10.
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/internal/gtest-port.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_PARAM_TEST
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/internal/gtest-param-util.h>
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace testing {
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Used in the Values() function to provide polymorphic capabilities.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1>
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray1 {
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit ValueArray1(T1 v1) : v1_(v1) {}
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
66d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
67d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray1& other);
68d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2>
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray2 {
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_};
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray2& other);
86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3>
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray3 {
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_};
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray3& other);
105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4>
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray4 {
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4) {}
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_};
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray4& other);
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray5 {
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4), v5_(v5) {}
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_};
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray5& other);
148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6>
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray6 {
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray6& other);
172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7>
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray7 {
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
195d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
196d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray7& other);
197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8>
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray8 {
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8) {}
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
223d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray8& other);
224d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9>
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray9 {
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9) {}
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray9& other);
252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10>
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray10 {
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10) {}
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
279d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
280d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray10& other);
281d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11>
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray11 {
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray11& other);
312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12>
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray12 {
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_};
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
343d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
344d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray12& other);
345d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13>
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray13 {
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v12_(v12), v13_(v13) {}
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_};
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
378d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
379d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray13& other);
380d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14>
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray14 {
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_};
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
414d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
415d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray14& other);
416d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15>
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray15 {
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_};
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
451d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
452d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray15& other);
453d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16>
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray16 {
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v16_(v16) {}
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_};
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
491d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
492d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray16& other);
493d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17>
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray17 {
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17) {}
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_};
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
532d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
533d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray17& other);
534d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18>
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray18 {
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_};
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
574d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
575d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray18& other);
576d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19>
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray19 {
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
617d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
618d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray19& other);
619d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20>
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray20 {
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v19_(v19), v20_(v20) {}
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
662d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
663d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray20& other);
664d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21>
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray21 {
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
709d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
710d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray21& other);
711d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22>
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray22 {
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray22& other);
759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23>
789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray23 {
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23) {}
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v23_};
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
808d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
809d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray23& other);
810d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24>
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray24 {
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v22_(v22), v23_(v23), v24_(v24) {}
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_};
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
860d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
861d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray24& other);
862d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25>
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray25 {
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_};
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
913d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
914d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray25& other);
915d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26>
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray26 {
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_};
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
968d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
969d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray26& other);
970d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27>
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray27 {
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v26_(v26), v27_(v27) {}
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_};
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1025d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1026d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray27& other);
1027d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28>
1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray28 {
1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_};
1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1083d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1084d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray28& other);
1085d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29>
1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray29 {
1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_};
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray29& other);
1144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30>
1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray30 {
1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v29_(v29), v30_(v30) {}
1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_};
1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1204d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray30& other);
1205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31>
1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray31 {
1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v29_(v29), v30_(v30), v31_(v31) {}
1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
1262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1266d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1267d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray31& other);
1268d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32>
1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray32 {
1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1330d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1331d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray32& other);
1332d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33>
1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray33 {
1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v33_(v33) {}
1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1396d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1397d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray33& other);
1398d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34>
1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray34 {
1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v33_(v33), v34_(v34) {}
1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
1459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1463d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1464d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray34& other);
1465d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35>
1509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray35 {
1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v35_};
1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1532d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1533d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray35& other);
1534d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36>
1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray36 {
1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
1591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
1592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_};
1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1603d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1604d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray36& other);
1605d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
1641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37>
1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray37 {
1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v36_(v36), v37_(v37) {}
1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_};
1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1676d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1677d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray37& other);
1678d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
1714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
1725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38>
1726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray38 {
1727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
1733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
1739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_};
1746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1750d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1751d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray38& other);
1752d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
1788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
1789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
1790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
1791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
1800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39>
1801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray39 {
1802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
1808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
1814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_};
1821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1825d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1826d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray39& other);
1827d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
1863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
1864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
1865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
1866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
1867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
1876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40>
1877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray40 {
1878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
1884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
1889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
1890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v40_(v40) {}
1891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_};
1898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1902d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1903d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray40& other);
1904d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
1921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
1922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
1923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
1924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
1925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
1926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
1927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
1928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
1929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
1930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
1931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
1932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
1933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
1934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
1935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
1936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
1937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
1938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
1939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
1940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
1941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
1942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
1943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
1944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
1945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
1949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
1950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
1951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
1952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
1953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
1954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
1955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41>
1956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray41 {
1957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
1963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
1969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v39_(v39), v40_(v40), v41_(v41) {}
1970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
1972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
1973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_};
1977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
1978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1981d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
1982d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray41& other);
1983d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
1985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
1986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
1987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
1988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
1989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
1990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
1991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
1992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
1993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
1994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
1995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
1996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
1997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
1998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
1999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42>
2036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray42 {
2037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
2050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_};
2057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2061d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2062d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray42& other);
2063d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43>
2117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray43 {
2118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
2125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
2126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
2127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
2128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
2129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
2130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
2131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
2138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray43& other);
2144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44>
2199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray44 {
2200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
2207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
2208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
2209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
2210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
2211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
2212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
2213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v43_(v43), v44_(v44) {}
2214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
2221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2226d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray44& other);
2227d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44, typename T45>
2283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray45 {
2284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
2291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
2292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
2293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
2294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
2295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
2296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
2297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
2298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
2305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray45& other);
2311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T45 v45_;
2357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44, typename T45,
2368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T46>
2369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray46 {
2370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
2377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
2384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
2391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2395d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2396d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray46& other);
2397d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T45 v45_;
2443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T46 v46_;
2444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44, typename T45,
2455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T46, typename T47>
2456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray47 {
2457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
2464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
2471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v47_(v47) {}
2472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
2479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v47_};
2480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2484d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2485d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray47& other);
2486d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T45 v45_;
2532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T46 v46_;
2533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T47 v47_;
2534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44, typename T45,
2545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T46, typename T47, typename T48>
2546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray48 {
2547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
2554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
2561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v46_(v46), v47_(v47), v48_(v48) {}
2562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v48_};
2570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2574d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2575d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray48& other);
2576d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T45 v45_;
2622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T46 v46_;
2623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T47 v47_;
2624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T48 v48_;
2625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44, typename T45,
2636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T46, typename T47, typename T48, typename T49>
2637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray49 {
2638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
2645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
2653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v48_, v49_};
2661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2665d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2666d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray49& other);
2667d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T45 v45_;
2713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T46 v46_;
2714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T47 v47_;
2715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T48 v48_;
2716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T49 v49_;
2717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10,
2721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T11, typename T12, typename T13, typename T14, typename T15,
2722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T16, typename T17, typename T18, typename T19, typename T20,
2723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T21, typename T22, typename T23, typename T24, typename T25,
2724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T26, typename T27, typename T28, typename T29, typename T30,
2725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T31, typename T32, typename T33, typename T34, typename T35,
2726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T36, typename T37, typename T38, typename T39, typename T40,
2727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T41, typename T42, typename T43, typename T44, typename T45,
2728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T46, typename T47, typename T48, typename T49, typename T50>
2729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValueArray50 {
2730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
2737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
2745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T>
2747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator<T>() const {
2748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        v48_, v49_, v50_};
2753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ValuesIn(array);
2754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const ValueArray50& other);
2759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T1 v1_;
2761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T2 v2_;
2762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T3 v3_;
2763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T4 v4_;
2764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T5 v5_;
2765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T6 v6_;
2766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T7 v7_;
2767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T8 v8_;
2768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T9 v9_;
2769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T10 v10_;
2770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T11 v11_;
2771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T12 v12_;
2772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T13 v13_;
2773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T14 v14_;
2774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T15 v15_;
2775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T16 v16_;
2776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T17 v17_;
2777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T18 v18_;
2778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T19 v19_;
2779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T20 v20_;
2780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T21 v21_;
2781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T22 v22_;
2782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T23 v23_;
2783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T24 v24_;
2784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T25 v25_;
2785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T26 v26_;
2786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T27 v27_;
2787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T28 v28_;
2788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T29 v29_;
2789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T30 v30_;
2790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T31 v31_;
2791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T32 v32_;
2792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T33 v33_;
2793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T34 v34_;
2794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T35 v35_;
2795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T36 v36_;
2796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T37 v37_;
2797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T38 v38_;
2798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T39 v39_;
2799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T40 v40_;
2800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T41 v41_;
2801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T42 v42_;
2802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T43 v43_;
2803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T44 v44_;
2804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T45 v45_;
2805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T46 v46_;
2806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T47 v47_;
2807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T48 v48_;
2808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T49 v49_;
2809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const T50 v50_;
2810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
2811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_COMBINE
2813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
2815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Generates values from the Cartesian product of values produced
2816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// by the argument generators.
2817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
2818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2>
2819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator2
2820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
2821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2> ParamType;
2823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
2825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2)
2826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2) {}
2827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator2() {}
2828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
2830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
2831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
2833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
2834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
2838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
2839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
2840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
2841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
2842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
2843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2)
2844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
2845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
2846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
2847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
2848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
2850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
2852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
2853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
2855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
2856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
2857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
2858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current2_;
2859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
2860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
2861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
2862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
2863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
2864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
2866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
2867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
2869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
2870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
2871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
2872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
2873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
2874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
2875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
2876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
2877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
2878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
2879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
2880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
2881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
2882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
2883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_);
2884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
2887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
2888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
2889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
2890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
2891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
2892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
2893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
2894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_) {
2895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
2896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
2899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
2900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_);
2901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
2903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
2904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
2905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
2906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
2907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_;
2908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2910d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
2911d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
2912d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
2914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
2915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
2916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
2917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
2918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
2919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
2920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
2921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
2922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
2923d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator2::Iterator
2924d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
2925d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
2926d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator2& other);
2927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
2929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
2930d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator2
2931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3>
2934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator3
2935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
2936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
2937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
2938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
2940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
2941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3) {}
2942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator3() {}
2943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
2945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
2946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin());
2947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
2949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
2950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
2951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
2953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
2954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
2955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
2956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
2957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
2958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
2959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
2960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
2961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3)
2962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
2963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
2964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
2965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
2966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
2967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
2969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
2970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
2971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
2972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
2974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
2975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
2976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
2977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current3_;
2978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
2979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
2980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
2981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
2982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
2983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
2984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
2985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
2986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
2987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
2989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
2990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
2991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
2992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
2993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
2994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
2995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
2996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
2997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
2998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
2999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
3000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
3001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
3002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
3003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
3004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
3005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
3006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
3007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_);
3008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
3011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
3012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
3013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
3014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
3015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
3016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
3017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
3018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
3019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
3020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
3021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_) {
3022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
3026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
3027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_);
3028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
3030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
3031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
3032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
3033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
3034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
3035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_;
3036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3038d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
3039d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
3040d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
3042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
3044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
3045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
3046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
3047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
3048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
3049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
3050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
3051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
3052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
3053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
3054d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator3::Iterator
3055d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3056d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
3057d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator3& other);
3058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
3060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
3061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
3062d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator3
3063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4>
3066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator4
3067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
3068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
3069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
3070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
3072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4)
3074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
3075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator4() {}
3076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
3078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin());
3080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
3082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end());
3084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
3087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
3088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
3089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
3090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
3091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
3092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
3093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
3094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
3095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
3096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
3097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4)
3098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
3099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
3103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
3106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
3109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
3111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
3112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
3113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
3114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current4_;
3115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
3116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
3117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
3118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
3120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
3121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
3122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
3124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
3125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
3126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
3130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
3131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
3133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
3135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
3136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
3138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
3139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
3140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
3141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
3142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
3143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
3144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
3145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
3146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
3147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
3148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
3149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_);
3150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
3153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
3154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
3155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
3156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
3157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
3158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
3159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
3160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
3161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
3162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
3163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
3164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
3165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
3166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_) {
3167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
3171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
3172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
3173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_);
3174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
3176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
3177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
3178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
3179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
3180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
3181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
3182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_;
3183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
3186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
3187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
3189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
3191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
3192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
3193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
3194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
3195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
3196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
3197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
3198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
3199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
3200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
3201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
3202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
3203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
3204d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator4::Iterator
3205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
3207d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator4& other);
3208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
3210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
3211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
3212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
3213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator4
3214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator5
3218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
3219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
3220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
3221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
3223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
3225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
3226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator5() {}
3227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
3229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
3231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
3233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end(), g5_, g5_.end());
3235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
3238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
3239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
3240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
3241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
3242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
3243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
3244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
3245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
3246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
3247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
3248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4,
3249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T5>& g5,
3250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T5>::iterator& current5)
3251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
3252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
3257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
3260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
3263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
3265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
3266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
3267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
3268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current5_;
3269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current5_ == end5_) {
3270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_ = begin5_;
3271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current4_;
3272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
3274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
3275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
3276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
3278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
3279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
3280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
3282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
3283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
3284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
3288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
3289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
3291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
3293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
3294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
3296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
3297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
3298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
3299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
3300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
3301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
3302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
3303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
3304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
3305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
3306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
3307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_ &&
3308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == typed_other->current5_);
3309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
3312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
3313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
3314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
3315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
3316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
3317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
3318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
3319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
3320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
3321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
3322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
3323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
3324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
3325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_),
3326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin5_(other.begin5_),
3327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end5_(other.end5_),
3328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_(other.current5_) {
3329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
3333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
3334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
3335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_, *current5_);
3336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
3338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
3339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
3340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
3341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
3342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
3343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
3344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_ ||
3345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == end5_;
3346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3348d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
3349d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
3350d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
3352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
3354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
3355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
3356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
3357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
3358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
3359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
3360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
3361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
3362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
3363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
3364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
3365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
3366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator begin5_;
3367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator end5_;
3368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T5>::iterator current5_;
3369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
3370d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator5::Iterator
3371d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3372d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
3373d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator5& other);
3374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
3376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
3377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
3378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
3379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T5> g5_;
3380d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator5
3381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6>
3385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator6
3386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
3387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T6> > {
3388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
3389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
3390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
3392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6)
3395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
3396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator6() {}
3397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
3399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
3401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
3403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
3405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
3408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
3409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
3410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
3411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
3412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
3413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
3414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
3415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
3416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
3417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
3418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4,
3419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T5>& g5,
3420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T5>::iterator& current5,
3421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6,
3422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T6>::iterator& current6)
3423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
3424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
3430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
3433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
3436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
3438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
3439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
3440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
3441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current6_;
3442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current6_ == end6_) {
3443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_ = begin6_;
3444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current5_;
3445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current5_ == end5_) {
3447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_ = begin5_;
3448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current4_;
3449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
3451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
3452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
3453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
3455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
3456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
3457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
3459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
3460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
3461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
3465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
3466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
3468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
3470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
3471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
3473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
3474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
3475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
3476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
3477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
3478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
3479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
3480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
3481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
3482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
3483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
3484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_ &&
3485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == typed_other->current5_ &&
3486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == typed_other->current6_);
3487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
3490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
3491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
3492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
3493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
3494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
3495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
3496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
3497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
3498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
3499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
3500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
3501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
3502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
3503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_),
3504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin5_(other.begin5_),
3505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end5_(other.end5_),
3506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_(other.current5_),
3507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin6_(other.begin6_),
3508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end6_(other.end6_),
3509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_(other.current6_) {
3510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
3514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
3515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
3516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_, *current5_, *current6_);
3517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
3519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
3520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
3521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
3522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
3523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
3524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
3525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_ ||
3526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == end5_ ||
3527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == end6_;
3528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3530d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
3531d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
3532d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
3534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
3536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
3537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
3538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
3539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
3540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
3541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
3542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
3543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
3544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
3545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
3546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
3547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
3548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator begin5_;
3549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator end5_;
3550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T5>::iterator current5_;
3551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator begin6_;
3552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator end6_;
3553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T6>::iterator current6_;
3554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
3555d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator6::Iterator
3556d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
3558d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator6& other);
3559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
3561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
3562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
3563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
3564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T5> g5_;
3565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T6> g6_;
3566d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator6
3567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7>
3571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator7
3572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T7> > {
3574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
3575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
3576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
3578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
3581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
3582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator7() {}
3583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
3585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g7_.begin());
3588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
3590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
3592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
3595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
3596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
3597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
3598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
3599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
3600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
3601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
3602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
3603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
3604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
3605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4,
3606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T5>& g5,
3607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T5>::iterator& current5,
3608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6,
3609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T6>::iterator& current6,
3610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T7>& g7,
3611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T7>::iterator& current7)
3612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
3613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
3620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
3623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
3626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
3628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
3629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
3630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
3631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current7_;
3632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current7_ == end7_) {
3633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_ = begin7_;
3634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current6_;
3635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current6_ == end6_) {
3637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_ = begin6_;
3638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current5_;
3639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current5_ == end5_) {
3641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_ = begin5_;
3642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current4_;
3643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
3645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
3646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
3647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
3649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
3650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
3651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
3653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
3654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
3655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
3659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
3660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
3662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
3664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
3665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
3667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
3668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
3669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
3670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
3671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
3672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
3673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
3674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
3675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
3676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
3677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
3678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_ &&
3679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == typed_other->current5_ &&
3680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == typed_other->current6_ &&
3681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == typed_other->current7_);
3682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
3685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
3686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
3687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
3688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
3689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
3690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
3691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
3692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
3693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
3694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
3695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
3696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
3697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
3698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_),
3699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin5_(other.begin5_),
3700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end5_(other.end5_),
3701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_(other.current5_),
3702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin6_(other.begin6_),
3703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end6_(other.end6_),
3704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_(other.current6_),
3705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin7_(other.begin7_),
3706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end7_(other.end7_),
3707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_(other.current7_) {
3708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
3712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
3713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
3714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_, *current5_, *current6_, *current7_);
3715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
3717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
3718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
3719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
3720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
3721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
3722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
3723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_ ||
3724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == end5_ ||
3725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == end6_ ||
3726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == end7_;
3727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3729d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
3730d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
3731d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
3733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
3735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
3736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
3737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
3738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
3739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
3740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
3741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
3742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
3743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
3744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
3745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
3746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
3747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator begin5_;
3748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator end5_;
3749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T5>::iterator current5_;
3750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator begin6_;
3751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator end6_;
3752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T6>::iterator current6_;
3753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator begin7_;
3754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator end7_;
3755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T7>::iterator current7_;
3756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
3757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator7::Iterator
3758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
3760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator7& other);
3761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
3763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
3764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
3765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
3766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T5> g5_;
3767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T6> g6_;
3768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T7> g7_;
3769d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator7
3770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8>
3774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator8
3775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T7, T8> > {
3777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
3778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
3779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
3781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
3784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T8>& g8)
3785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
3786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          g8_(g8) {}
3787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator8() {}
3788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
3790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g7_.begin(), g8_, g8_.begin());
3793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
3795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
3797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g8_.end());
3798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
3799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
3801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
3802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
3803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
3804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
3805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
3806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
3807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
3808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
3809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
3810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
3811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4,
3812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T5>& g5,
3813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T5>::iterator& current5,
3814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6,
3815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T6>::iterator& current6,
3816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T7>& g7,
3817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T7>::iterator& current7,
3818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T8>& g8,
3819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T8>::iterator& current8)
3820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
3821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
3828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
3829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
3832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
3835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
3837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
3838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
3839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
3840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current8_;
3841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current8_ == end8_) {
3842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current8_ = begin8_;
3843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current7_;
3844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current7_ == end7_) {
3846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_ = begin7_;
3847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current6_;
3848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current6_ == end6_) {
3850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_ = begin6_;
3851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current5_;
3852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current5_ == end5_) {
3854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_ = begin5_;
3855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current4_;
3856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
3858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
3859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
3860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
3862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
3863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
3864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
3866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
3867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
3868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
3869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
3872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
3873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
3875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
3877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
3878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
3880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
3881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
3882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
3883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
3884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
3885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
3886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
3887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
3888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
3889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
3890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
3891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_ &&
3892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == typed_other->current5_ &&
3893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == typed_other->current6_ &&
3894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == typed_other->current7_ &&
3895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current8_ == typed_other->current8_);
3896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
3899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
3900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
3901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
3902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
3903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
3904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
3905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
3906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
3907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
3908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
3909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
3910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
3911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
3912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_),
3913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin5_(other.begin5_),
3914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end5_(other.end5_),
3915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_(other.current5_),
3916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin6_(other.begin6_),
3917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end6_(other.end6_),
3918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_(other.current6_),
3919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin7_(other.begin7_),
3920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end7_(other.end7_),
3921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_(other.current7_),
3922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin8_(other.begin8_),
3923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end8_(other.end8_),
3924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current8_(other.current8_) {
3925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
3926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
3929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
3930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
3931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_, *current5_, *current6_, *current7_, *current8_);
3932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
3934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
3935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
3936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
3937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
3938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
3939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
3940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_ ||
3941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == end5_ ||
3942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == end6_ ||
3943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == end7_ ||
3944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current8_ == end8_;
3945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
3946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3947d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
3948d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
3949d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
3951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
3953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
3954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
3955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
3956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
3957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
3958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
3959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
3960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
3961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
3962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
3963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
3964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
3965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator begin5_;
3966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator end5_;
3967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T5>::iterator current5_;
3968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator begin6_;
3969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator end6_;
3970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T6>::iterator current6_;
3971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator begin7_;
3972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator end7_;
3973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T7>::iterator current7_;
3974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T8>::iterator begin8_;
3975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T8>::iterator end8_;
3976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T8>::iterator current8_;
3977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
3978d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator8::Iterator
3979d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
3980d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
3981d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator8& other);
3982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
3984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
3985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
3986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
3987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T5> g5_;
3988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T6> g6_;
3989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T7> g7_;
3990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T8> g8_;
3991d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator8
3992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9>
3996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator9
3997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T7, T8, T9> > {
3999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
4001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
4003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
4007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          g9_(g9) {}
4009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator9() {}
4010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
4012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
4015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
4017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g8_.end(), g9_, g9_.end());
4020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
4024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
4025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
4026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
4027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
4028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
4029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
4030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
4031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
4032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
4033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4,
4034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T5>& g5,
4035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T5>::iterator& current5,
4036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6,
4037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T6>::iterator& current6,
4038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T7>& g7,
4039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T7>::iterator& current7,
4040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T8>& g8,
4041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T8>::iterator& current8,
4042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T9>& g9,
4043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T9>::iterator& current9)
4044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
4045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
4054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
4055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
4057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
4060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
4062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
4063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
4064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
4065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current9_;
4066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current9_ == end9_) {
4067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current9_ = begin9_;
4068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current8_;
4069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current8_ == end8_) {
4071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current8_ = begin8_;
4072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current7_;
4073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current7_ == end7_) {
4075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_ = begin7_;
4076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current6_;
4077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current6_ == end6_) {
4079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_ = begin6_;
4080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current5_;
4081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current5_ == end5_) {
4083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_ = begin5_;
4084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current4_;
4085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
4087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
4088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
4089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
4091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
4092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
4093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
4095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
4096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
4097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
4099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
4101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
4102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
4104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
4106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
4107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
4109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
4110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
4111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
4112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
4113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
4114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
4115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
4116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
4117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
4118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
4119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
4120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_ &&
4121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == typed_other->current5_ &&
4122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == typed_other->current6_ &&
4123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == typed_other->current7_ &&
4124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current8_ == typed_other->current8_ &&
4125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current9_ == typed_other->current9_);
4126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
4129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
4130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
4131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
4132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
4133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
4134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
4135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
4136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
4137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
4138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
4139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
4140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
4141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
4142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_),
4143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin5_(other.begin5_),
4144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end5_(other.end5_),
4145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_(other.current5_),
4146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin6_(other.begin6_),
4147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end6_(other.end6_),
4148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_(other.current6_),
4149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin7_(other.begin7_),
4150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end7_(other.end7_),
4151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_(other.current7_),
4152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin8_(other.begin8_),
4153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end8_(other.end8_),
4154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current8_(other.current8_),
4155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin9_(other.begin9_),
4156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end9_(other.end9_),
4157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current9_(other.current9_) {
4158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
4159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
4162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
4163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
4164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_, *current5_, *current6_, *current7_, *current8_,
4165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current9_);
4166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
4168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
4169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
4170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
4171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
4172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
4173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
4174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_ ||
4175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == end5_ ||
4176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == end6_ ||
4177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == end7_ ||
4178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current8_ == end8_ ||
4179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current9_ == end9_;
4180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
4183d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
4184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
4186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
4188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
4189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
4190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
4191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
4192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
4193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
4194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
4195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
4196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
4197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
4198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
4199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
4200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator begin5_;
4201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator end5_;
4202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T5>::iterator current5_;
4203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator begin6_;
4204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator end6_;
4205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T6>::iterator current6_;
4206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator begin7_;
4207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator end7_;
4208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T7>::iterator current7_;
4209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T8>::iterator begin8_;
4210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T8>::iterator end8_;
4211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T8>::iterator current8_;
4212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T9>::iterator begin9_;
4213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T9>::iterator end9_;
4214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T9>::iterator current9_;
4215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
4216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator9::Iterator
4217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator9& other);
4220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
4222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
4223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
4224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
4225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T5> g5_;
4226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T6> g6_;
4227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T7> g7_;
4228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T8> g8_;
4229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T9> g9_;
4230d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator9
4231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename T6, typename T7, typename T8, typename T9, typename T10>
4235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductGenerator10
4236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T7, T8, T9, T10> > {
4238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
4240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
4242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
4246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T10>& g10)
4247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          g9_(g9), g10_(g10) {}
4249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~CartesianProductGenerator10() {}
4250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* Begin() const {
4252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
4255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ParamIteratorInterface<ParamType>* End() const {
4257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
4260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class Iterator : public ParamIteratorInterface<ParamType> {
4264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
4265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const ParamGeneratorInterface<ParamType>* base,
4266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T1>& g1,
4267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T1>::iterator& current1,
4268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T2>& g2,
4269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T2>::iterator& current2,
4270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T3>& g3,
4271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T3>::iterator& current3,
4272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T4>& g4,
4273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T4>::iterator& current4,
4274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T5>& g5,
4275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T5>::iterator& current5,
4276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T6>& g6,
4277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T6>::iterator& current6,
4278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T7>& g7,
4279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T7>::iterator& current7,
4280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T8>& g8,
4281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T8>::iterator& current8,
4282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T9>& g9,
4283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T9>::iterator& current9,
4284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const ParamGenerator<T10>& g10,
4285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const typename ParamGenerator<T10>::iterator& current10)
4286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(base),
4287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
4296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
4297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
4298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ~Iterator() {}
4300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return base_;
4303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Advance should not be called on beyond-of-range iterators
4305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // so no component iterators must be beyond end of range, either.
4306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void Advance() {
4307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assert(!AtEnd());
4308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ++current10_;
4309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current10_ == end10_) {
4310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current10_ = begin10_;
4311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current9_;
4312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current9_ == end9_) {
4314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current9_ = begin9_;
4315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current8_;
4316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current8_ == end8_) {
4318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current8_ = begin8_;
4319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current7_;
4320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current7_ == end7_) {
4322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_ = begin7_;
4323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current6_;
4324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current6_ == end6_) {
4326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_ = begin6_;
4327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current5_;
4328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current5_ == end5_) {
4330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_ = begin5_;
4331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current4_;
4332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current4_ == end4_) {
4334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_ = begin4_;
4335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current3_;
4336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current3_ == end3_) {
4338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_ = begin3_;
4339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current2_;
4340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (current2_ == end2_) {
4342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_ = begin2_;
4343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ++current1_;
4344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
4345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
4346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual ParamIteratorInterface<ParamType>* Clone() const {
4348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return new Iterator(*this);
4349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual const ParamType* Current() const { return &current_value_; }
4351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Having the same base generator guarantees that the other
4353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // iterator is of the same type and we can downcast.
4354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "The program attempted to compare iterators "
4356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          << "from different generators." << std::endl;
4357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Iterator* typed_other =
4358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CheckedDowncastToActualType<const Iterator>(&other);
4359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterators equal if they both point beyond their
4360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // respective ranges. That can happen in a variety of fashions,
4361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // so we have to consult AtEnd().
4362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return (AtEnd() && typed_other->AtEnd()) ||
4363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (
4364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == typed_other->current1_ &&
4365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == typed_other->current2_ &&
4366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == typed_other->current3_ &&
4367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == typed_other->current4_ &&
4368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == typed_other->current5_ &&
4369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == typed_other->current6_ &&
4370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == typed_other->current7_ &&
4371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current8_ == typed_other->current8_ &&
4372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current9_ == typed_other->current9_ &&
4373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current10_ == typed_other->current10_);
4374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
4377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Iterator(const Iterator& other)
4378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        : base_(other.base_),
4379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin1_(other.begin1_),
4380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end1_(other.end1_),
4381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current1_(other.current1_),
4382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin2_(other.begin2_),
4383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end2_(other.end2_),
4384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current2_(other.current2_),
4385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin3_(other.begin3_),
4386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end3_(other.end3_),
4387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current3_(other.current3_),
4388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin4_(other.begin4_),
4389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end4_(other.end4_),
4390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current4_(other.current4_),
4391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin5_(other.begin5_),
4392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end5_(other.end5_),
4393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current5_(other.current5_),
4394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin6_(other.begin6_),
4395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end6_(other.end6_),
4396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current6_(other.current6_),
4397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin7_(other.begin7_),
4398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end7_(other.end7_),
4399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current7_(other.current7_),
4400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin8_(other.begin8_),
4401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end8_(other.end8_),
4402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current8_(other.current8_),
4403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin9_(other.begin9_),
4404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end9_(other.end9_),
4405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current9_(other.current9_),
4406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        begin10_(other.begin10_),
4407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        end10_(other.end10_),
4408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current10_(other.current10_) {
4409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ComputeCurrentValue();
4410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ComputeCurrentValue() {
4413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!AtEnd())
4414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        current_value_ = ParamType(*current1_, *current2_, *current3_,
4415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current4_, *current5_, *current6_, *current7_, *current8_,
4416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            *current9_, *current10_);
4417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool AtEnd() const {
4419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must report iterator past the end of the range when either of the
4420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // component iterators has reached the end of its range.
4421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
4422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current1_ == end1_ ||
4423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current2_ == end2_ ||
4424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current3_ == end3_ ||
4425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current4_ == end4_ ||
4426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current5_ == end5_ ||
4427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current6_ == end6_ ||
4428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current7_ == end7_ ||
4429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current8_ == end8_ ||
4430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current9_ == end9_ ||
4431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          current10_ == end10_;
4432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
4433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4434d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // No implementation - assignment is unsupported.
4435d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void operator=(const Iterator& other);
4436d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const ParamGeneratorInterface<ParamType>* const base_;
4438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // current[i]_ is the actual traversing iterator.
4440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator begin1_;
4441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T1>::iterator end1_;
4442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T1>::iterator current1_;
4443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator begin2_;
4444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T2>::iterator end2_;
4445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T2>::iterator current2_;
4446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator begin3_;
4447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T3>::iterator end3_;
4448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T3>::iterator current3_;
4449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator begin4_;
4450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T4>::iterator end4_;
4451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T4>::iterator current4_;
4452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator begin5_;
4453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T5>::iterator end5_;
4454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T5>::iterator current5_;
4455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator begin6_;
4456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T6>::iterator end6_;
4457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T6>::iterator current6_;
4458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator begin7_;
4459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T7>::iterator end7_;
4460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T7>::iterator current7_;
4461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T8>::iterator begin8_;
4462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T8>::iterator end8_;
4463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T8>::iterator current8_;
4464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T9>::iterator begin9_;
4465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T9>::iterator end9_;
4466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T9>::iterator current9_;
4467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T10>::iterator begin10_;
4468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const typename ParamGenerator<T10>::iterator end10_;
4469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typename ParamGenerator<T10>::iterator current10_;
4470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ParamType current_value_;
4471d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  };  // class CartesianProductGenerator10::Iterator
4472d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4473d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4474d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductGenerator10& other);
4475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T1> g1_;
4477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T2> g2_;
4478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T3> g3_;
4479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T4> g4_;
4480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T5> g5_;
4481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T6> g6_;
4482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T7> g7_;
4483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T8> g8_;
4484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T9> g9_;
4485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const ParamGenerator<T10> g10_;
4486d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductGenerator10
4487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
4490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
4491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Helper classes providing Combine() with polymorphic features. They allow
4492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
4493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// convertible to U.
4494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
4495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2>
4496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder2 {
4497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
4499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2) {}
4500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2>
4501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
4502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
4503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator2<T1, T2>(
4504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_)));
4506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4509d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4510d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder2& other);
4511d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4514d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder2
4515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3>
4517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder3 {
4518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
4520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3)
4521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3) {}
4522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3>
4523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
4524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
4525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator3<T1, T2, T3>(
4526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_)));
4529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4532d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4533d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder3& other);
4534d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4538d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder3
4539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4>
4542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder4 {
4543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
4545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4)
4546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
4547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4>
4548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
4549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
4550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator4<T1, T2, T3, T4>(
4551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_)));
4555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4558d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4559d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder4& other);
4560d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4565d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder4
4566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4, class Generator5>
4569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder5 {
4570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
4572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4, const Generator5& g5)
4573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
4574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4, typename T5>
4575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
4576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
4577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
4578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_),
4582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T5> >(g5_)));
4583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4586d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4587d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder5& other);
4588d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator5 g5_;
4594d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder5
4595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4, class Generator5, class Generator6>
4598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder6 {
4599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
4601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator6& g6)
4603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
4604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      typename T6>
4606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
4607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
4608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
4609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_),
4613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T5> >(g5_),
4614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T6> >(g6_)));
4615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4618d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4619d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder6& other);
4620d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator5 g5_;
4626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator6 g6_;
4627d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder6
4628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4, class Generator5, class Generator6, class Generator7>
4631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder7 {
4632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
4634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator6& g6, const Generator7& g7)
4636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
4637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      typename T6, typename T7>
4639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T7> >() const {
4641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
4642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
4643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_),
4647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T5> >(g5_),
4648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T6> >(g6_),
4649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T7> >(g7_)));
4650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4653d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4654d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder7& other);
4655d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator5 g5_;
4661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator6 g6_;
4662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator7 g7_;
4663d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder7
4664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4, class Generator5, class Generator6, class Generator7,
4667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator8>
4668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder8 {
4669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
4671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator6& g6, const Generator7& g7, const Generator8& g8)
4673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
4674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          g8_(g8) {}
4675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      typename T6, typename T7, typename T8>
4677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
4678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T8> >() const {
4679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
4680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
4681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_),
4685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T5> >(g5_),
4686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T6> >(g6_),
4687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T7> >(g7_),
4688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T8> >(g8_)));
4689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4692d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4693d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder8& other);
4694d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator5 g5_;
4700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator6 g6_;
4701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator7 g7_;
4702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator8 g8_;
4703d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder8
4704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4, class Generator5, class Generator6, class Generator7,
4707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator8, class Generator9>
4708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder9 {
4709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
4711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator6& g6, const Generator7& g7, const Generator8& g8,
4713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator9& g9)
4714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          g9_(g9) {}
4716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      typename T6, typename T7, typename T8, typename T9>
4718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T9> >() const {
4720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T9> >(
4722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
4723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_),
4727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T5> >(g5_),
4728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T6> >(g6_),
4729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T7> >(g7_),
4730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T8> >(g8_),
4731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T9> >(g9_)));
4732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4735d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4736d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder9& other);
4737d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator5 g5_;
4743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator6 g6_;
4744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator7 g7_;
4745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator8 g8_;
4746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator9 g9_;
4747d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder9
4748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class Generator1, class Generator2, class Generator3,
4750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator4, class Generator5, class Generator6, class Generator7,
4751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Generator8, class Generator9, class Generator10>
4752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CartesianProductHolder10 {
4753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
4754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
4755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator3& g3, const Generator4& g4, const Generator5& g5,
4756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator6& g6, const Generator7& g7, const Generator8& g8,
4757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Generator9& g9, const Generator10& g10)
4758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          g9_(g9), g10_(g10) {}
4760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename T1, typename T2, typename T3, typename T4, typename T5,
4761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      typename T6, typename T7, typename T8, typename T9, typename T10>
4762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      T9, T10> >() const {
4764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        T9, T10> >(
4766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
4767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            T10>(
4768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T1> >(g1_),
4769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T2> >(g2_),
4770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T3> >(g3_),
4771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T4> >(g4_),
4772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T5> >(g5_),
4773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T6> >(g6_),
4774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T7> >(g7_),
4775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T8> >(g8_),
4776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T9> >(g9_),
4777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        static_cast<ParamGenerator<T10> >(g10_)));
4778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
4779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
4781d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // No implementation - assignment is unsupported.
4782d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void operator=(const CartesianProductHolder10& other);
4783d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
4784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator1 g1_;
4785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator2 g2_;
4786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator3 g3_;
4787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator4 g4_;
4788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator5 g5_;
4789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator6 g6_;
4790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator7 g7_;
4791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator8 g8_;
4792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator9 g9_;
4793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Generator10 g10_;
4794d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville};  // class CartesianProductHolder10
4795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_HAS_COMBINE
4797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
4799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace testing
4800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  //  GTEST_HAS_PARAM_TEST
4802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
4803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
4804