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