141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This file was GENERATED by command:
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     pump.py gtest-param-util-generated.h.pump
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DO NOT EDIT BY HAND!!!
41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2008 Google Inc.
61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All Rights Reserved.
71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without
91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are
101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met:
111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions of source code must retain the above copyright
131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer.
141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions in binary form must reproduce the above
151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer
161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the
171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution.
181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Neither the name of Google Inc. nor the names of its
191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from
201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission.
211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Author: vladl@google.com (Vlad Losev)
351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Type and function utilities for implementing parameterized tests.
371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Currently Google Test supports at most 50 arguments in Values,
401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// and at most 10 arguments in Combine. Please contact
411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// googletestframework@googlegroups.com if you need more.
421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Please note that the number of arguments to Combine is limited
431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// by the maximum arity of the implementation of tr1::tuple which is
441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// currently set at 10.
451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// scripts/fuse_gtest.py depends on gtest's own header being #included
5041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// *unconditionally*.  Therefore these #includes cannot be moved
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// inside #if GTEST_HAS_PARAM_TEST.
5241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-param-util.h"
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-port.h"
541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_PARAM_TEST
561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace testing {
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Forward declarations of ValuesIn(), which is implemented in
6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// include/gtest/gtest-param-test.h.
6141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename ForwardIterator>
6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinternal::ParamGenerator<
6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotValuesIn(ForwardIterator begin, ForwardIterator end);
6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T, size_t N>
6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <class Container>
7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinternal::ParamGenerator<typename Container::value_type> ValuesIn(
7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const Container& container);
7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace internal {
741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Used in the Values() function to provide polymorphic capabilities.
761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1>
771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray1 {
781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  explicit ValueArray1(T1 v1) : v1_(v1) {}
801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
8541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
8641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray1& other);
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2>
921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray2 {
931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
98fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray2& other);
10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3>
1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray3 {
1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
117fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
118fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_)};
1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray3& other);
12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
1281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
1291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
1301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4>
1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray4 {
1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4) {}
1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
1381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
139fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
140fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_)};
1411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
1421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
1431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray4& other);
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
1481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
1491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
1501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
1511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
1521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
1531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
1551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray5 {
1561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
1571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
1581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4), v5_(v5) {}
1591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
1611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
162fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
163fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
1641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
1651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
1661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray5& other);
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
1711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
1721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
1731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
1741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
1751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
1761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
1771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6>
1801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray6 {
1811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
1821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
1831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
1841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
1861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
187fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
188fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
189fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_)};
1901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
1911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
1921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray6& other);
19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
1971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
1981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
1991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
2001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
2011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
2021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
2031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
2041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7>
2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray7 {
2081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
2091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
2101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
2111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
2131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
214fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
215fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
216fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_)};
2171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
2181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
2191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray7& other);
22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
2241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
2251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
2261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
2271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
2281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
2291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
2301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
2311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
2321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8>
2351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray8 {
2361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
2371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
2381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8) {}
2401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
2421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
243fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
244fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
245fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
2461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
2471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
2481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray8& other);
25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
2531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
2541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
2551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
2561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
2571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
2581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
2591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
2601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
2611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
2621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9>
2651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray9 {
2661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
2671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
2681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9) {}
2701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
2721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
273fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
274fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
275fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
276fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_)};
2771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
2781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
2791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray9& other);
28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
2841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
2851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
2861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
2871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
2881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
2891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
2901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
2911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
2921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
2931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
2941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10>
2971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray10 {
2981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
2991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
3011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10) {}
3021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
3041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
305fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
306fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
307fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
308fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_)};
3091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
3101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
3111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray10& other);
31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
3171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
3181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
3191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
3201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
3211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
3221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
3231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
3241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
3251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
3261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
3271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
3301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11>
3311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray11 {
3321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
3331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
3351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
3361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
3381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
339fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
340fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
341fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
342fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
3431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
3441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
3451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
34741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
34841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray11& other);
34941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
3511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
3521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
3531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
3541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
3551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
3561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
3571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
3581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
3591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
3601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
3611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
3621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
3651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12>
3661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray12 {
3671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
3681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
3701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
3711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
3731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
374fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
375fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
376fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
377fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
378fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_)};
3791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
3801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
3811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
38341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
38441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray12& other);
38541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
3871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
3881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
3891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
3901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
3911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
3921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
3931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
3941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
3951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
3961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
3971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
3981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
3991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13>
4031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray13 {
4041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
4051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
4071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
4081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12_(v12), v13_(v13) {}
4091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
4111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
412fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
413fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
414fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
415fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
416fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_)};
4171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
4181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
4191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
42141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
42241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray13& other);
42341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
4251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
4261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
4271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
4281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
4291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
4301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
4311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
4321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
4331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
4341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
4351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
4361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
4371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
4381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14>
4421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray14 {
4431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
4441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
4461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
4471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
4481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
4501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
451fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
452fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
453fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
454fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
455fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
4561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
4571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
4581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
46041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
46141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray14& other);
46241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
4641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
4651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
4661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
4671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
4681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
4691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
4701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
4711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
4721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
4731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
4741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
4751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
4761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
4771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
4781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15>
4821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray15 {
4831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
4841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
4861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
4871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
4881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
4901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
491fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
492fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
493fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
494fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
495fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
496fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_)};
4971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
4981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
4991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
50141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
50241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray15& other);
50341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
5051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
5061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
5071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
5081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
5091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
5101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
5111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
5121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
5131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
5141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
5151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
5161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
5171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
5181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
5191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
5201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16>
5251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray16 {
5261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
5271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
5281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
5291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
5301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
5311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16_(v16) {}
5321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
5341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
535fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
536fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
537fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
538fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
539fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
540fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_)};
5411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
5421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
54541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
54641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray16& other);
54741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
5491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
5501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
5511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
5521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
5531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
5541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
5551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
5561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
5571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
5581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
5591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
5601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
5611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
5621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
5631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
5641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
5651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17>
5701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray17 {
5711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
5721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
5731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
5741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
5751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
5761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17) {}
5771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
5791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
580fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
581fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
582fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
583fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
584fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
585fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
5861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
5871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
59041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
59141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray17& other);
59241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
5941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
5951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
5961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
5971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
5981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
5991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
6001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
6011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
6021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
6031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
6041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
6051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
6061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
6071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
6081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
6091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
6101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
6111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18>
6161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray18 {
6171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
6181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
6211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
6221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
6231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
6251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
626fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
627fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
628fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
629fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
630fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
631fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
632fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_)};
6331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
6341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
6351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
63741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
63841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray18& other);
63941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
6411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
6421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
6431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
6441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
6451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
6461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
6471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
6481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
6491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
6501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
6511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
6521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
6531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
6541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
6551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
6561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
6571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
6581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
6591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19>
6641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray19 {
6651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
6661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
6691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
6701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
6711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
6731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
674fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
675fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
676fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
677fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
678fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
679fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
680fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_)};
6811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
6821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
6831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
68541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
68641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray19& other);
68741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
6891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
6901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
6911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
6921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
6931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
6941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
6951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
6961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
6971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
6981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
6991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
7001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
7011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
7021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
7031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
7041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
7051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
7061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
7071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
7081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20>
7131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray20 {
7141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
7151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
7161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
7171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
7181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
7191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
7201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v19_(v19), v20_(v20) {}
7211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
7231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
724fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
725fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
726fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
727fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
728fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
729fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
730fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
7311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
7321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
7331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
73541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
73641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray20& other);
73741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
7391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
7401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
7411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
7421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
7431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
7441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
7451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
7461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
7471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
7481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
7491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
7501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
7511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
7521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
7531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
7541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
7551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
7561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
7571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
7581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
7591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
7641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21>
7651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray21 {
7661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
7671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
7681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
7691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
7701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
7711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
7721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
7731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
7751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
776fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
777fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
778fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
779fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
780fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
781fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
782fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
783fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_)};
7841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
7851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
7861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
78841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
78941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray21& other);
79041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
7921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
7931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
7941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
7951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
7961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
7971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
7981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
7991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
8001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
8011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
8021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
8031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
8041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
8051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
8061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
8071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
8081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
8091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
8101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
8111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
8121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
8131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
8161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
8171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
8181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22>
8191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray22 {
8201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
8211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
8221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
8231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
8241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
8251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
8261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
8271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
8291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
830fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
831fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
832fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
833fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
834fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
835fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
836fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
837fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_)};
8381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
8391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
8401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
84241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
84341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray22& other);
84441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
8461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
8471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
8481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
8491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
8501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
8511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
8521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
8531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
8541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
8551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
8561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
8571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
8581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
8591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
8601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
8611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
8621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
8631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
8641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
8651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
8661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
8671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
8681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
8711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
8721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
8731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23>
8741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray23 {
8751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
8761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
8771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
8781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
8791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
8801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
8811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
8821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23) {}
8831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
8851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
886fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
887fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
888fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
889fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
890fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
891fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
892fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
893fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
8941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
8951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
8961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
89841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
89941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray23& other);
90041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
9021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
9031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
9041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
9051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
9061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
9071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
9081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
9091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
9101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
9111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
9121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
9131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
9141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
9151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
9161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
9171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
9181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
9191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
9201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
9211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
9221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
9231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
9241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
9251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
9281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
9291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
9301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24>
9311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray24 {
9321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
9331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
9361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
9371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
9381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
9391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v22_(v22), v23_(v23), v24_(v24) {}
9401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
9421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
943fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
944fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
945fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
946fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
947fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
948fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
949fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
950fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
951fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_)};
9521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
9531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
9541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
95641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
95741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray24& other);
95841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
9601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
9611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
9621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
9631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
9641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
9651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
9661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
9671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
9681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
9691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
9701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
9711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
9721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
9731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
9741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
9751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
9761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
9771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
9781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
9791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
9801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
9811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
9821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
9831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
9841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
9871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
9881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
9891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25>
9901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray25 {
9911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
9921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
9951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
9961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
9971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
9981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
9991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
10011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1002fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1003fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1004fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1005fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1006fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1007fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1008fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1009fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1010fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_)};
10111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
10121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
10131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
101541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
101641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray25& other);
101741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
10191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
10201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
10211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
10221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
10231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
10241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
10251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
10261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
10271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
10281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
10291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
10301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
10311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
10321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
10331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
10341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
10351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
10361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
10371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
10381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
10391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
10401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
10411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
10421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
10431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
10441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
10471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
10481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
10491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
10501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26>
10511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray26 {
10521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
10531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
10581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
10591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
10601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
10621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1063fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1064fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1065fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1066fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1067fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1068fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1069fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1070fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1071fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
10721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
10731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
10741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
107641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
107741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray26& other);
107841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
10801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
10811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
10821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
10831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
10841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
10851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
10861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
10871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
10881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
10891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
10901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
10911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
10921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
10931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
10941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
10951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
10961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
10971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
10981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
10991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
11001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
11011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
11021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
11031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
11041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
11051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
11061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
11091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
11101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
11111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
11121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27>
11131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray27 {
11141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
11151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
11211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
11221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v26_(v26), v27_(v27) {}
11231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
11251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1126fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1127fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1128fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1129fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1130fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1131fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1132fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1133fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1134fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1135fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_)};
11361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
11371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
11381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
114041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
114141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray27& other);
114241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
11441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
11451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
11461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
11471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
11481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
11491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
11501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
11511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
11521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
11531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
11541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
11551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
11561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
11571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
11581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
11591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
11601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
11611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
11621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
11631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
11641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
11651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
11661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
11671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
11681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
11691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
11701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
11711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
11741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
11751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
11761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
11771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28>
11781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray28 {
11791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
11801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
11871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
11881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
11901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1191fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1192fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1193fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1194fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1195fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1196fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1197fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1198fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1199fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1200fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_)};
12011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
12021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
12031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
120541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
120641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray28& other);
120741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
12091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
12101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
12111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
12121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
12131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
12141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
12151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
12161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
12171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
12181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
12191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
12201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
12211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
12221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
12231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
12241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
12251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
12261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
12271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
12281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
12291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
12301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
12311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
12321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
12331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
12341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
12351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
12361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
12371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
12401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
12411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
12421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
12431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29>
12441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray29 {
12451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
12461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
12501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
12511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
12521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
12531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
12541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
12561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1257fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1258fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1259fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1260fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1261fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1262fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1263fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1264fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1265fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1266fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
12671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
12681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
12691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
127141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
127241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray29& other);
127341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
12751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
12761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
12771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
12781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
12791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
12801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
12811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
12821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
12831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
12841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
12851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
12861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
12871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
12881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
12891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
12901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
12911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
12921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
12931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
12941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
12951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
12961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
12971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
12981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
12991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
13001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
13011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
13021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
13031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
13041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
13071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
13081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
13091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
13101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30>
13111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray30 {
13121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
13131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
13171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29_(v29), v30_(v30) {}
13221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
13241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1325fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1326fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1327fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1328fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1329fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1330fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1331fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1332fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1333fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1334fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1335fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_)};
13361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
13371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
13381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
134041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
134141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray30& other);
134241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
13441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
13451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
13461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
13471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
13481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
13491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
13501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
13511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
13521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
13531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
13541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
13551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
13561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
13571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
13581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
13591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
13601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
13611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
13621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
13631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
13641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
13651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
13661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
13671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
13681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
13691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
13701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
13711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
13721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
13731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
13741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
13771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
13781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
13791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
13801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
13811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31>
13821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray31 {
13831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
13841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
13881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29_(v29), v30_(v30), v31_(v31) {}
13931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
13951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1396fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1397fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1398fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1399fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1400fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1401fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1402fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1403fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1404fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1405fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1406fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_)};
14071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
14081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
14091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
141141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
141241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray31& other);
141341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
14151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
14161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
14171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
14181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
14191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
14201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
14211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
14221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
14231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
14241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
14251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
14261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
14271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
14281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
14291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
14301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
14311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
14321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
14331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
14341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
14351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
14361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
14371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
14381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
14391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
14401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
14411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
14421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
14431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
14441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
14451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
14461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
14491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
14501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
14511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
14521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
14531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32>
14541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray32 {
14551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
14561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
14571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
14581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
14591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
14601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
14611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
14621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
14631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
14641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
14651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
14671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1468fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1469fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1470fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1471fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1472fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1473fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1474fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1475fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1476fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1477fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1478fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
14791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
14801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
14811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
148341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
148441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray32& other);
148541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
14871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
14881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
14891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
14901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
14911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
14921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
14931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
14941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
14951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
14961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
14971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
14981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
14991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
15001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
15011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
15021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
15031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
15041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
15051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
15061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
15071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
15081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
15091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
15101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
15111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
15121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
15131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
15141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
15151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
15161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
15171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
15181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
15191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
15201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
15221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
15231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
15241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
15251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
15261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33>
15271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray33 {
15281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
15291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
15311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
15321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
15331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
15341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
15351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
15361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
15371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
15381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33_(v33) {}
15391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
15401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
15411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1542fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1543fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1544fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1545fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1546fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1547fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1548fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1549fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1550fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1551fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1552fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1553fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_)};
15541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
15551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
15561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
15571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
155841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
155941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray33& other);
156041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
15621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
15631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
15641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
15651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
15661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
15671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
15681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
15691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
15701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
15711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
15721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
15731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
15741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
15751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
15761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
15771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
15781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
15791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
15801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
15811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
15821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
15831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
15841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
15851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
15861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
15871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
15881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
15891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
15901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
15911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
15921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
15931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
15941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
15951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
15961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
15981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
15991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
16001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
16011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
16021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34>
16031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray34 {
16041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
16051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
16101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
16111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
16121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
16131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
16141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33_(v33), v34_(v34) {}
16151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
16161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
16171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1618fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1619fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1620fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1621fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1622fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1623fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1624fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1625fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1626fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1627fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1628fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1629fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_)};
16301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
16311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
16321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
16331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
163441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
163541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray34& other);
163641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
16381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
16391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
16401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
16411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
16421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
16431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
16441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
16451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
16461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
16471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
16481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
16491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
16501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
16511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
16521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
16531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
16541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
16551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
16561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
16571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
16581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
16591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
16601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
16611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
16621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
16631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
16641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
16651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
16661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
16671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
16681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
16691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
16701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
16711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
16721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
16731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
16751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
16761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
16771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
16781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
16791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35>
16801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray35 {
16811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
16821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
16871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
16881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
16891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
16901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
16911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
16921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
16931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
16941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1695fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1696fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1697fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1698fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1699fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1700fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1701fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1702fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1703fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1704fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1705fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1706fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
17071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
17081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
17091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
17101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
171141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
171241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray35& other);
171341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
17151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
17161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
17171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
17181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
17191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
17201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
17211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
17221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
17231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
17241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
17251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
17261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
17271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
17281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
17291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
17301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
17311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
17321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
17331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
17341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
17351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
17361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
17371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
17381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
17391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
17401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
17411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
17421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
17431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
17441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
17451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
17461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
17471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
17481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
17491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
17501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
17511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
17521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
17531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
17541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
17551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
17561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
17571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
17581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36>
17591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray36 {
17601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
17611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
17621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
17631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
17641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
17651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
17661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
17671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
17681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
17691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
17701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
17711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
17721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
17731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1774fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1775fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1776fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1777fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1778fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1779fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1780fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1781fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1782fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1783fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1784fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1785fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
1786fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_)};
17871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
17881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
17891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
17901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
179141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
179241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray36& other);
179341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
17951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
17961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
17971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
17981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
17991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
18001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
18011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
18021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
18031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
18041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
18051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
18061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
18071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
18081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
18091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
18101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
18111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
18121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
18131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
18141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
18151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
18161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
18171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
18181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
18191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
18201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
18211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
18221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
18231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
18241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
18251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
18261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
18271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
18281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
18291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
18301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
18311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
18331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
18341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
18351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
18361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
18371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
18381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
18391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37>
18401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray37 {
18411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
18421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
18431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
18441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
18451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
18461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
18471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
18481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
18491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
18501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
18511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
18521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v36_(v36), v37_(v37) {}
18531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
18551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1856fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1857fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1858fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1859fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1860fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1861fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1862fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1863fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1864fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1865fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1866fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1867fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
1868fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_)};
18691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
18701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
18711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
187341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
187441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray37& other);
187541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
18771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
18781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
18791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
18801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
18811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
18821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
18831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
18841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
18851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
18861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
18871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
18881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
18891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
18901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
18911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
18921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
18931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
18941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
18951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
18961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
18971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
18981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
18991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
19001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
19011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
19021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
19031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
19041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
19051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
19061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
19071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
19081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
19091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
19101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
19111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
19121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
19131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
19141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
19151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
19161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
19171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
19181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
19191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
19201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
19211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
19221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38>
19231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray38 {
19241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
19251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
19261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
19271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
19281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
19291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
19301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
19311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
19321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
19331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
19341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
19351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
19361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
19371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
19381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
1939fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
1940fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
1941fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
1942fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
1943fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
1944fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
1945fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
1946fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
1947fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
1948fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
1949fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
1950fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
1951fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
19521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
19531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
19541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
19551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
195641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
195741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray38& other);
195841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
19591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
19601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
19611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
19621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
19631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
19641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
19651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
19661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
19671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
19681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
19691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
19701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
19711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
19721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
19731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
19741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
19751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
19761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
19771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
19781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
19791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
19801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
19811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
19821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
19831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
19841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
19851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
19861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
19871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
19881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
19891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
19901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
19911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
19921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
19931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
19941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
19951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
19961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
19971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
19981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
19991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
20001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
20011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
20021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
20031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
20041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
20051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
20061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39>
20071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray39 {
20081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
20091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
20101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
20111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
20121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
20131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
20141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
20151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
20161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
20171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
20181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
20191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
20201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
20211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
20221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2023fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2024fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2025fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2026fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2027fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2028fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2029fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2030fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2031fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2032fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2033fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2034fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2035fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2036fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_)};
20371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
20381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
20391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
20401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
204141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
204241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray39& other);
204341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
20451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
20461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
20471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
20481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
20491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
20501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
20511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
20521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
20531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
20541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
20551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
20561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
20571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
20581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
20591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
20601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
20611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
20621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
20631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
20641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
20651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
20661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
20671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
20681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
20691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
20701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
20711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
20721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
20731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
20741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
20751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
20761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
20771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
20781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
20791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
20801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
20811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
20821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
20831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
20841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
20851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
20861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
20871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
20881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
20891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
20901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
20911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
20921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40>
20931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray40 {
20941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
20951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
20961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
20971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
20981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
20991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
21001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
21011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
21021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
21031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
21041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
21051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
21061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v40_(v40) {}
21071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
21081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
21091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2110fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2111fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2112fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2113fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2114fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2115fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2116fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2117fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2118fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2119fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2120fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2121fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2122fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2123fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_)};
21241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
21251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
21261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
21271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
212841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
212941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray40& other);
213041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
21321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
21331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
21341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
21351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
21361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
21371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
21381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
21391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
21401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
21411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
21421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
21431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
21441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
21451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
21461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
21471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
21481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
21491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
21501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
21511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
21521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
21531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
21541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
21551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
21561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
21571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
21581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
21591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
21601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
21611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
21621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
21631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
21641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
21651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
21661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
21671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
21681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
21691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
21701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
21711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
21721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
21731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
21741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
21751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
21761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
21771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
21781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
21791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
21801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
21811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41>
21821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray41 {
21831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
21841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
21851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
21861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
21871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
21881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
21891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
21901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
21911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
21921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
21931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
21941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
21951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v39_(v39), v40_(v40), v41_(v41) {}
21961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
21971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
21981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2199fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2200fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2201fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2202fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2203fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2204fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2205fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2206fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2207fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2208fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2209fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2210fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2211fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2212fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
22131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
22141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
22151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
22161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
221741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
221841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray41& other);
221941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
22201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
22211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
22221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
22231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
22241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
22251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
22261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
22271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
22281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
22291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
22301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
22311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
22321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
22331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
22341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
22351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
22361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
22371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
22381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
22391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
22401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
22411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
22421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
22431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
22441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
22451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
22461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
22471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
22481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
22491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
22501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
22511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
22521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
22531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
22541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
22551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
22561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
22571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
22581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
22591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
22601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
22611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
22621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
22631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
22641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
22651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
22661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
22671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
22681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
22691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
22701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
22711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42>
22721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray42 {
22731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
22741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
22751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
22761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
22771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
22781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
22791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
22801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
22811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
22821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
22831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
22841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
22851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
22861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
22871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
22881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2289fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2290fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2291fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2292fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2293fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2294fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2295fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2296fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2297fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2298fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2299fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2300fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2301fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2302fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2303fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_)};
23041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
23051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
23061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
23071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
230841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
230941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray42& other);
231041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
23111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
23121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
23131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
23141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
23151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
23161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
23171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
23181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
23191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
23201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
23211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
23221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
23231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
23241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
23251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
23261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
23271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
23281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
23291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
23301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
23311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
23321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
23331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
23341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
23351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
23361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
23371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
23381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
23391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
23401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
23411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
23421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
23431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
23441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
23451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
23461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
23471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
23481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
23491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
23501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
23511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
23521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
23531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
23541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
23551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
23561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
23571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
23581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
23591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
23601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
23611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
23621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
23631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43>
23641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray43 {
23651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
23661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
23671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
23681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
23691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
23701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
23711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
23721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
23731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
23741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
23751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
23761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
23771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
23781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
23791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
23801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2381fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2382fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2383fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2384fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2385fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2386fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2387fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2388fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2389fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2390fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2391fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2392fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2393fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2394fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2395fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_)};
23961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
23971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
23981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
23991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
240041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
240141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray43& other);
240241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
24031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
24041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
24051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
24061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
24071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
24081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
24091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
24101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
24111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
24121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
24131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
24141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
24151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
24161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
24171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
24181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
24191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
24201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
24211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
24221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
24231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
24241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
24251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
24261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
24271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
24281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
24291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
24301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
24311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
24321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
24331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
24341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
24351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
24361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
24371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
24381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
24391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
24401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
24411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
24421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
24431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
24441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
24451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
24461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
24471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
24481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
24491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
24501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
24511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
24521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
24531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
24541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
24551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
24561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44>
24571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray44 {
24581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
24591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
24601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
24611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
24621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
24631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
24641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
24651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
24661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
24671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
24681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
24691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
24701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
24711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v43_(v43), v44_(v44) {}
24721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
24731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
24741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2475fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2476fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2477fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2478fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2479fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2480fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2481fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2482fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2483fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2484fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2485fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2486fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2487fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2488fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2489fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
24901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
24911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
24921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
24931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
249441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
249541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray44& other);
249641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
24971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
24981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
24991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
25001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
25011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
25021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
25031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
25041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
25051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
25061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
25071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
25081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
25091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
25101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
25111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
25121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
25131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
25141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
25151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
25161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
25171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
25181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
25191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
25201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
25211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
25221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
25231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
25241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
25251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
25261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
25271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
25281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
25291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
25301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
25311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
25321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
25331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
25341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
25351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
25361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
25371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
25381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
25391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
25401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
25411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
25421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
25431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
25441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
25451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
25461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
25471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
25481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
25491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
25501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
25511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45>
25521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray45 {
25531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
25541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
25551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
25561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
25571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
25581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
25591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
25601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
25611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
25621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
25631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
25641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
25651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
25661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
25671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
25681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
25691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2570fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2571fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2572fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2573fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2574fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2575fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2576fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2577fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2578fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2579fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2580fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2581fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2582fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2583fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2584fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2585fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v45_)};
25861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
25871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
25881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
25891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
259041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
259141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray45& other);
259241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
25931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
25941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
25951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
25961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
25971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
25981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
25991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
26001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
26011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
26021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
26031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
26041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
26051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
26061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
26071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
26081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
26091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
26101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
26111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
26121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
26131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
26141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
26151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
26161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
26171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
26181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
26191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
26201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
26211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
26221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
26231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
26241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
26251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
26261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
26271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
26281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
26291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
26301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
26311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
26321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
26331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
26341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
26351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
26361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
26371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T45 v45_;
26381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
26391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
26401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
26411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
26421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
26431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
26441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
26451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
26461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
26471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
26481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
26491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46>
26501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray46 {
26511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
26521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
26531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
26541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
26551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
26561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
26571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
26581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
26591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
26601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
26611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
26621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
26631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
26641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
26651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
26661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
26671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2668fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2669fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2670fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2671fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2672fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2673fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2674fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2675fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2676fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2677fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2678fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2679fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2680fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2681fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2682fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2683fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v45_), static_cast<T>(v46_)};
26841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
26851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
26861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
26871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
268841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
268941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray46& other);
269041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
26911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
26921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
26931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
26941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
26951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
26961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
26971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
26981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
26991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
27001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
27011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
27021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
27031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
27041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
27051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
27061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
27071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
27081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
27091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
27101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
27111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
27121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
27131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
27141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
27151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
27161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
27171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
27181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
27191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
27201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
27211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
27221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
27231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
27241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
27251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
27261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
27271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
27281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
27291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
27301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
27311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
27321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
27331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
27341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
27351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T45 v45_;
27361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T46 v46_;
27371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
27381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
27391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
27401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
27411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
27421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
27431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
27441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
27451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
27461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
27471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
27481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47>
27491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray47 {
27501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
27511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
27521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
27531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
27541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
27551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
27561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
27571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
27581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
27591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
27601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
27611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
27621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
27631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
27641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v47_(v47) {}
27651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
27661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
27671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2768fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2769fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2770fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2771fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2772fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2773fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2774fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2775fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2776fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2777fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2778fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2779fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2780fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2781fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2782fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2783fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
27841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
27851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
27861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
27871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
278841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
278941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray47& other);
279041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
27911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
27921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
27931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
27941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
27951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
27961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
27971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
27981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
27991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
28001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
28011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
28021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
28031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
28041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
28051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
28061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
28071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
28081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
28091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
28101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
28111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
28121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
28131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
28141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
28151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
28161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
28171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
28181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
28191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
28201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
28211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
28221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
28231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
28241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
28251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
28261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
28271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
28281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
28291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
28301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
28311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
28321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
28331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
28341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
28351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T45 v45_;
28361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T46 v46_;
28371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T47 v47_;
28381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
28391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
28401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
28411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
28421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
28431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
28441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
28451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
28461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
28471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
28481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
28491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47, typename T48>
28501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray48 {
28511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
28521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
28531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
28541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
28551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
28561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
28571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
28581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
28591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
28601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
28611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
28621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
28631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
28641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
28651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v46_(v46), v47_(v47), v48_(v48) {}
28661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
28671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
28681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2869fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2870fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2871fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2872fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2873fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2874fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2875fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2876fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2877fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2878fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2879fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2880fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2881fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2882fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2883fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2884fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
2885fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v48_)};
28861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
28871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
28881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
28891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
289041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
289141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray48& other);
289241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
28931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
28941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
28951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
28961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
28971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
28981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
28991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
29001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
29011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
29021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
29031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
29041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
29051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
29061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
29071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
29081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
29091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
29101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
29111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
29121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
29131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
29141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
29151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
29161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
29171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
29181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
29191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
29201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
29211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
29221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
29231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
29241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
29251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
29261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
29271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
29281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
29291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
29301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
29311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
29321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
29331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
29341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
29351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
29361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
29371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T45 v45_;
29381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T46 v46_;
29391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T47 v47_;
29401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T48 v48_;
29411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
29421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
29431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
29441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
29451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
29461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
29471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
29481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
29491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
29501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
29511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
29521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47, typename T48, typename T49>
29531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray49 {
29541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
29551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
29561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
29571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
29581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
29591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
29601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
29611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
29621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
29631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
29641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
29651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
29661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
29671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
29681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
29691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
29701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
29711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
2972fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
2973fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
2974fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
2975fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
2976fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
2977fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
2978fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
2979fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
2980fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
2981fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
2982fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
2983fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
2984fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
2985fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
2986fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
2987fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
2988fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v48_), static_cast<T>(v49_)};
29891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
29901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
29911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
29921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
299341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
299441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray49& other);
299541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
29961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
29971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
29981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
29991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
30001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
30011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
30021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
30031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
30041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
30051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
30061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
30071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
30081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
30091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
30101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
30111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
30121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
30131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
30141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
30151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
30161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
30171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
30181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
30191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
30201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
30211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
30221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
30231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
30241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
30251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
30261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
30271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
30281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
30291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
30301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
30311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
30321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
30331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
30341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
30351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
30361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
30371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
30381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
30391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
30401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T45 v45_;
30411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T46 v46_;
30421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T47 v47_;
30431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T48 v48_;
30441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T49 v49_;
30451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
30461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
30471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
30481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
30491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
30501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
30511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
30521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
30531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
30541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
30551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
30561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47, typename T48, typename T49, typename T50>
30571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ValueArray50 {
30581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
30591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
30601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
30611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
30621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
30631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
30641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
30651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
30661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
30671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
30681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
30691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
30701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
30711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
30721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
30731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
30741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T>
30751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator<T>() const {
3076fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
3077fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
3078fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
3079fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
3080fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
3081fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
3082fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
3083fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
3084fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
3085fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
3086fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
3087fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
3088fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
3089fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
3090fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
3091fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
3092fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
30931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ValuesIn(array);
30941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
30951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
30961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
309741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
309841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const ValueArray50& other);
309941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
31001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T1 v1_;
31011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T2 v2_;
31021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T3 v3_;
31031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T4 v4_;
31041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T5 v5_;
31051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T6 v6_;
31061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T7 v7_;
31071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T8 v8_;
31081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T9 v9_;
31091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T10 v10_;
31101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T11 v11_;
31111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T12 v12_;
31121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T13 v13_;
31131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T14 v14_;
31141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T15 v15_;
31151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T16 v16_;
31161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T17 v17_;
31171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T18 v18_;
31181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T19 v19_;
31191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T20 v20_;
31201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T21 v21_;
31211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T22 v22_;
31221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T23 v23_;
31231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T24 v24_;
31241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T25 v25_;
31251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T26 v26_;
31261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T27 v27_;
31271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T28 v28_;
31281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T29 v29_;
31291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T30 v30_;
31301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T31 v31_;
31311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T32 v32_;
31321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T33 v33_;
31331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T34 v34_;
31341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T35 v35_;
31351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T36 v36_;
31361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T37 v37_;
31371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T38 v38_;
31381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T39 v39_;
31391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T40 v40_;
31401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T41 v41_;
31411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T42 v42_;
31421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T43 v43_;
31431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T44 v44_;
31441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T45 v45_;
31451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T46 v46_;
31461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T47 v47_;
31471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T48 v48_;
31481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T49 v49_;
31491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T50 v50_;
31501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
31511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
315241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_HAS_COMBINE
31531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
31541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
31551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Generates values from the Cartesian product of values produced
31561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// by the argument generators.
31571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
31581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2>
31591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator2
31601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
31611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
31621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2> ParamType;
31631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
31641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
31651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2)
31661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2) {}
31671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator2() {}
31681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
31691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
31701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
31711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
31721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
31731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
31741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
31751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
31761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
31771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
31781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
31791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
31801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
31811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
31821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
31831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2)
31841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
31851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
31861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
31871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
31881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
31891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
31901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
31911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
31921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
31931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
31941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
31951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
31961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
31971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
31981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current2_;
31991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
32001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
32011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
32021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
32031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
32041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
32051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
32061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
32071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
32081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
32091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
32101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
32111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
32121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
32131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
32141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
32151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
32161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
32171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
32181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
32191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
32201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
32211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
32221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
32231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_);
32241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
32251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
32271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
32281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
32291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
32301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
32311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
32321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
32331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
32341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_) {
32351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
32361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
32371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
32391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
32401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_);
32411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
32421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
32431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
32441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
32451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
32461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
32471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_;
32481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
32491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
325041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
325141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
325241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
32531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
32541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
32551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
32561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
32571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
32581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
32591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
32601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
32611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
32621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
326341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator2::Iterator
326441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
326541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
326641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator2& other);
32671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
32691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
327041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator2
32711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3>
32741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator3
32751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
32761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
32771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
32781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
32801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
32811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3) {}
32821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator3() {}
32831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
32851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
32861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin());
32871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
32881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
32891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
32901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
32911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
32921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
32931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
32941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
32951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
32961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
32971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
32981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
32991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
33001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
33011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3)
33021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
33031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
33041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
33051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
33061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
33071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
33091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
33101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
33111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
33121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
33141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
33151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
33161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
33171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current3_;
33181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
33191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
33201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
33211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
33221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
33231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
33241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
33251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
33261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
33271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
33291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
33301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
33321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
33331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
33341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
33351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
33361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
33371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
33381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
33391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
33401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
33411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
33421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
33431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
33441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
33451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
33461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
33471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_);
33481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
33501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
33511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
33521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
33531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
33541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
33551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
33561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
33571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
33581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
33591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
33601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
33611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_) {
33621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
33631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
33651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
33661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
33671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_);
33681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
33701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
33711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
33721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
33731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
33741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
33751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_;
33761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
33771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
337841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
337941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
338041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
33811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
33821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
33831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
33841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
33851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
33861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
33871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
33881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
33891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
33901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
33911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
33921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
33931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
339441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator3::Iterator
339541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
339641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
339741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator3& other);
33981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
33991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
34001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
34011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
340241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator3
34031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4>
34061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator4
34071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
34081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
34091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
34101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
34121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
34131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4)
34141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
34151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator4() {}
34161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
34181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
34191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin());
34201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
34211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
34221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
34231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end());
34241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
34251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
34271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
34281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
34291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
34301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
34311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
34321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
34331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
34341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
34351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
34361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
34371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4)
34381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
34391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
34401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
34411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
34421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
34431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
34441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
34451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
34461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
34481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
34491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
34501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
34511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
34521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
34531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
34541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current4_;
34551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
34561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
34571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
34581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
34591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
34601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
34611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
34621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
34631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
34641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
34651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
34661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
34671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
34681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
34691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
34701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
34711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
34721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
34731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
34741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
34751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
34761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
34771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
34781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
34791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
34801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
34811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
34821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
34831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
34841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
34851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
34861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
34871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
34881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
34891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_);
34901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
34911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
34921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
34931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
34941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
34951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
34961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
34971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
34981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
34991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
35001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
35011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
35021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
35031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
35041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
35051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
35061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_) {
35071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
35081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
35091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
35111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
35121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
35131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_);
35141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
35151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
35161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
35171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
35181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
35191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
35201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
35211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
35221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_;
35231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
35241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
352541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
352641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
352741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
35281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
35291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
35301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
35311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
35321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
35331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
35341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
35351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
35361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
35371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
35381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
35391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
35401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
35411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
35421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
35431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
354441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator4::Iterator
354541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
354641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
354741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator4& other);
35481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
35501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
35511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
35521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
355341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator4
35541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
35571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator5
35581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
35591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
35601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
35611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
35631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
35641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
35651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
35661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator5() {}
35671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
35691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
35701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
35711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
35721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
35731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
35741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end(), g5_, g5_.end());
35751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
35761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
35771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
35781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
35791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
35801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
35811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
35821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
35831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
35841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
35851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
35861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
35871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
35881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4,
35891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T5>& g5,
35901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T5>::iterator& current5)
35911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
35921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
35931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
35941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
35951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
35961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
35971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
35981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
35991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
36001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
36011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
36021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
36031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
36051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
36061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
36071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
36081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current5_;
36091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current5_ == end5_) {
36101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_ = begin5_;
36111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current4_;
36121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
36131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
36141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
36151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
36161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
36171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
36181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
36191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
36201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
36211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
36221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
36231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
36241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
36251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
36261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
36281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
36291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
36311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
36321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
36331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
36341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
36351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
36361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
36371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
36381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
36391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
36401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
36411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
36421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
36431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
36441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
36451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
36461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
36471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_ &&
36481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == typed_other->current5_);
36491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
36511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
36521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
36531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
36541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
36551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
36561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
36571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
36581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
36591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
36601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
36611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
36621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
36631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
36641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
36651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_),
36661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin5_(other.begin5_),
36671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end5_(other.end5_),
36681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_(other.current5_) {
36691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
36701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
36721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
36731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
36741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
36751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_, *current5_);
36761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
36781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
36791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
36801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
36811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
36821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
36831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
36841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_ ||
36851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == end5_;
36861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
36871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
368841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
368941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
369041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
36911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
36921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
36931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
36941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
36951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
36961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
36971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
36981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
36991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
37001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
37011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
37021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
37031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
37041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
37051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
37061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator begin5_;
37071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator end5_;
37081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T5>::iterator current5_;
37091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
371041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator5::Iterator
371141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
371241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
371341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator5& other);
37141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
37161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
37171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
37181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
37191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T5> g5_;
372041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator5
37211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
37241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6>
37251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator6
37261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
37271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T6> > {
37281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
37291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
37301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
37321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
37331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
37341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6)
37351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
37361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator6() {}
37371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
37391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
37401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
37411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
37421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
37431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
37441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
37451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
37461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
37481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
37491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
37501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
37511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
37521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
37531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
37541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
37551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
37561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
37571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
37581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4,
37591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T5>& g5,
37601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T5>::iterator& current5,
37611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6,
37621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T6>::iterator& current6)
37631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
37641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
37651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
37661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
37671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
37681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
37691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
37701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
37711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
37721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
37731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
37741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
37751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
37761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
37771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
37781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
37791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
37801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
37811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current6_;
37821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current6_ == end6_) {
37831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_ = begin6_;
37841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current5_;
37851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
37861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current5_ == end5_) {
37871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_ = begin5_;
37881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current4_;
37891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
37901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
37911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
37921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
37931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
37941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
37951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
37961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
37971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
37981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
37991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
38001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
38011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
38021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
38031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
38041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
38051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
38061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
38071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
38081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
38091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
38101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
38111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
38121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
38131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
38141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
38151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
38161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
38171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
38181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
38191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
38201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
38211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
38221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
38231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
38241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_ &&
38251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == typed_other->current5_ &&
38261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == typed_other->current6_);
38271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
38281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
38291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
38301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
38311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
38321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
38331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
38341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
38351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
38361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
38371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
38381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
38391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
38401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
38411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
38421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
38431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_),
38441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin5_(other.begin5_),
38451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end5_(other.end5_),
38461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_(other.current5_),
38471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin6_(other.begin6_),
38481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end6_(other.end6_),
38491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_(other.current6_) {
38501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
38511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
38521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
38531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
38541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
38551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
38561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_, *current5_, *current6_);
38571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
38581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
38591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
38601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
38611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
38621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
38631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
38641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
38651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_ ||
38661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == end5_ ||
38671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == end6_;
38681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
38691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
387041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
387141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
387241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
38731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
38741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
38751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
38761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
38771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
38781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
38791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
38801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
38811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
38821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
38831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
38841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
38851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
38861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
38871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
38881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator begin5_;
38891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator end5_;
38901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T5>::iterator current5_;
38911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator begin6_;
38921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator end6_;
38931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T6>::iterator current6_;
38941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
389541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator6::Iterator
389641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
389741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
389841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator6& other);
38991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
39011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
39021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
39031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
39041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T5> g5_;
39051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T6> g6_;
390641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator6
39071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7>
39111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator7
39121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
39131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T7> > {
39141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
39151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
39161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
39181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
39191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
39201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
39211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
39221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator7() {}
39231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
39251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
39261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
39271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g7_.begin());
39281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
39291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
39301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
39311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
39321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
39331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
39351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
39361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
39371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
39381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
39391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
39401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
39411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
39421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
39431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
39441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
39451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4,
39461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T5>& g5,
39471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T5>::iterator& current5,
39481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6,
39491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T6>::iterator& current6,
39501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T7>& g7,
39511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T7>::iterator& current7)
39521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
39531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
39541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
39551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
39561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
39571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
39581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
39591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
39601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
39611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
39621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
39631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
39641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
39651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
39661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
39671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
39681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
39691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
39701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
39711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current7_;
39721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current7_ == end7_) {
39731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_ = begin7_;
39741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current6_;
39751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
39761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current6_ == end6_) {
39771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_ = begin6_;
39781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current5_;
39791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
39801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current5_ == end5_) {
39811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_ = begin5_;
39821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current4_;
39831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
39841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
39851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
39861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
39871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
39881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
39891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
39901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
39911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
39921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
39931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
39941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
39951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
39961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
39971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
39981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
39991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
40001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
40011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
40021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
40031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
40041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
40051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
40061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
40071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
40081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
40091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
40101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
40111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
40121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
40131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
40141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
40151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
40161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
40171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
40181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_ &&
40191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == typed_other->current5_ &&
40201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == typed_other->current6_ &&
40211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == typed_other->current7_);
40221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
40231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
40241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
40251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
40261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
40271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
40281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
40291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
40301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
40311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
40321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
40331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
40341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
40351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
40361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
40371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
40381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_),
40391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin5_(other.begin5_),
40401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end5_(other.end5_),
40411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_(other.current5_),
40421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin6_(other.begin6_),
40431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end6_(other.end6_),
40441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_(other.current6_),
40451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin7_(other.begin7_),
40461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end7_(other.end7_),
40471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_(other.current7_) {
40481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
40491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
40501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
40511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
40521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
40531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
40541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_, *current5_, *current6_, *current7_);
40551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
40561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
40571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
40581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
40591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
40601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
40611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
40621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
40631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_ ||
40641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == end5_ ||
40651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == end6_ ||
40661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == end7_;
40671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
40681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
406941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
407041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
407141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
40721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
40731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
40741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
40751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
40761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
40771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
40781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
40791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
40801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
40811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
40821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
40831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
40841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
40851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
40861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
40871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator begin5_;
40881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator end5_;
40891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T5>::iterator current5_;
40901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator begin6_;
40911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator end6_;
40921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T6>::iterator current6_;
40931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator begin7_;
40941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator end7_;
40951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T7>::iterator current7_;
40961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
409741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator7::Iterator
409841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
409941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
410041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator7& other);
41011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
41031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
41041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
41051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
41061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T5> g5_;
41071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T6> g6_;
41081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T7> g7_;
410941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator7
41101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8>
41141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator8
41151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
41161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T7, T8> > {
41171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
41181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
41191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
41211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
41221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
41231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
41241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T8>& g8)
41251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
41261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          g8_(g8) {}
41271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator8() {}
41281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
41301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
41311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
41321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g7_.begin(), g8_, g8_.begin());
41331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
41341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
41351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
41361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
41371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g8_.end());
41381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
41391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
41411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
41421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
41431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
41441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
41451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
41461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
41471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
41481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
41491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
41501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
41511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4,
41521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T5>& g5,
41531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T5>::iterator& current5,
41541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6,
41551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T6>::iterator& current6,
41561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T7>& g7,
41571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T7>::iterator& current7,
41581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T8>& g8,
41591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T8>::iterator& current8)
41601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
41611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
41621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
41631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
41641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
41651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
41661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
41671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
41681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
41691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
41701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
41711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
41721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
41731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
41741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
41751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
41761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
41771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
41781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
41791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
41801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current8_;
41811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current8_ == end8_) {
41821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current8_ = begin8_;
41831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current7_;
41841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
41851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current7_ == end7_) {
41861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_ = begin7_;
41871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current6_;
41881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
41891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current6_ == end6_) {
41901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_ = begin6_;
41911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current5_;
41921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
41931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current5_ == end5_) {
41941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_ = begin5_;
41951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current4_;
41961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
41971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
41981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
41991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
42001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
42011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
42021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
42031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
42041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
42051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
42061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
42071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
42081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
42091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
42101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
42111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
42121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
42131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
42141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
42151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
42161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
42171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
42181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
42191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
42201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
42211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
42221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
42231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
42241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
42251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
42261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
42271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
42281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
42291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
42301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
42311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_ &&
42321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == typed_other->current5_ &&
42331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == typed_other->current6_ &&
42341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == typed_other->current7_ &&
42351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current8_ == typed_other->current8_);
42361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
42371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
42381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
42391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
42401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
42411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
42421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
42431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
42441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
42451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
42461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
42471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
42481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
42491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
42501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
42511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
42521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_),
42531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin5_(other.begin5_),
42541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end5_(other.end5_),
42551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_(other.current5_),
42561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin6_(other.begin6_),
42571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end6_(other.end6_),
42581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_(other.current6_),
42591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin7_(other.begin7_),
42601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end7_(other.end7_),
42611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_(other.current7_),
42621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin8_(other.begin8_),
42631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end8_(other.end8_),
42641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current8_(other.current8_) {
42651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
42661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
42671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
42681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
42691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
42701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
42711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_, *current5_, *current6_, *current7_, *current8_);
42721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
42731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
42741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
42751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
42761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
42771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
42781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
42791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
42801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_ ||
42811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == end5_ ||
42821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == end6_ ||
42831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == end7_ ||
42841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current8_ == end8_;
42851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
42861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
428741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
428841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
428941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
42901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
42911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
42921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
42931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
42941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
42951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
42961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
42971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
42981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
42991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
43001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
43011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
43021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
43031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
43041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
43051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator begin5_;
43061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator end5_;
43071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T5>::iterator current5_;
43081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator begin6_;
43091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator end6_;
43101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T6>::iterator current6_;
43111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator begin7_;
43121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator end7_;
43131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T7>::iterator current7_;
43141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T8>::iterator begin8_;
43151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T8>::iterator end8_;
43161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T8>::iterator current8_;
43171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
431841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator8::Iterator
431941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
432041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
432141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator8& other);
43221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
43241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
43251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
43261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
43271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T5> g5_;
43281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T6> g6_;
43291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T7> g7_;
43301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T8> g8_;
433141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator8
43321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
43351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9>
43361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator9
43371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
43381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T7, T8, T9> > {
43391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
43401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
43411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
43431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
43441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
43451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
43461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
43471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
43481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          g9_(g9) {}
43491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator9() {}
43501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
43521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
43531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
43541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
43551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
43561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
43571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
43581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
43591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g8_.end(), g9_, g9_.end());
43601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
43611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
43631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
43641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
43651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
43661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
43671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
43681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
43691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
43701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
43711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
43721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
43731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4,
43741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T5>& g5,
43751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T5>::iterator& current5,
43761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6,
43771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T6>::iterator& current6,
43781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T7>& g7,
43791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T7>::iterator& current7,
43801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T8>& g8,
43811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T8>::iterator& current8,
43821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T9>& g9,
43831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T9>::iterator& current9)
43841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
43851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
43861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
43871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
43881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
43891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
43901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
43911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
43921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
43931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
43941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
43951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
43961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
43971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
43981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
43991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
44001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
44011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
44021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
44031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
44041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
44051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current9_;
44061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current9_ == end9_) {
44071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current9_ = begin9_;
44081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current8_;
44091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current8_ == end8_) {
44111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current8_ = begin8_;
44121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current7_;
44131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current7_ == end7_) {
44151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_ = begin7_;
44161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current6_;
44171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current6_ == end6_) {
44191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_ = begin6_;
44201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current5_;
44211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current5_ == end5_) {
44231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_ = begin5_;
44241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current4_;
44251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
44271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
44281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
44291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
44311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
44321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
44331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
44351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
44361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
44371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
44381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
44391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
44401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
44411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
44421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
44431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
44441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
44451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
44461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
44471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
44481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
44491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
44501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
44511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
44521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
44531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
44541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
44551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
44561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
44571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
44581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
44591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
44601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_ &&
44611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == typed_other->current5_ &&
44621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == typed_other->current6_ &&
44631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == typed_other->current7_ &&
44641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current8_ == typed_other->current8_ &&
44651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current9_ == typed_other->current9_);
44661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
44671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
44681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
44691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
44701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
44711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
44721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
44731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
44741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
44751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
44761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
44771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
44781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
44791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
44801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
44811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
44821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_),
44831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin5_(other.begin5_),
44841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end5_(other.end5_),
44851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_(other.current5_),
44861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin6_(other.begin6_),
44871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end6_(other.end6_),
44881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_(other.current6_),
44891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin7_(other.begin7_),
44901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end7_(other.end7_),
44911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_(other.current7_),
44921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin8_(other.begin8_),
44931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end8_(other.end8_),
44941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current8_(other.current8_),
44951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin9_(other.begin9_),
44961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end9_(other.end9_),
44971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current9_(other.current9_) {
44981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
44991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
45001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
45011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
45021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
45031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
45041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_, *current5_, *current6_, *current7_, *current8_,
45051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current9_);
45061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
45071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
45081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
45091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
45101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
45111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
45121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
45131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
45141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_ ||
45151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == end5_ ||
45161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == end6_ ||
45171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == end7_ ||
45181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current8_ == end8_ ||
45191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current9_ == end9_;
45201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
45211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
452241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
452341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
452441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
45251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
45261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
45271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
45281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
45291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
45301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
45311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
45321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
45331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
45341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
45351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
45361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
45371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
45381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
45391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
45401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator begin5_;
45411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator end5_;
45421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T5>::iterator current5_;
45431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator begin6_;
45441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator end6_;
45451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T6>::iterator current6_;
45461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator begin7_;
45471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator end7_;
45481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T7>::iterator current7_;
45491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T8>::iterator begin8_;
45501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T8>::iterator end8_;
45511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T8>::iterator current8_;
45521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T9>::iterator begin9_;
45531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T9>::iterator end9_;
45541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T9>::iterator current9_;
45551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
455641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator9::Iterator
455741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
455841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
455941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator9& other);
45601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
45611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
45621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
45631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
45641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
45651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T5> g5_;
45661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T6> g6_;
45671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T7> g7_;
45681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T8> g8_;
45691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T9> g9_;
457041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator9
45711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
45721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
45731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
45741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10>
45751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductGenerator10
45761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
45771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T7, T8, T9, T10> > {
45781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
45791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
45801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
45811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
45821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
45831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
45841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
45851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
45861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T10>& g10)
45871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
45881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          g9_(g9), g10_(g10) {}
45891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ~CartesianProductGenerator10() {}
45901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
45911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* Begin() const {
45921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
45931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
45941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
45951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
45961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  virtual ParamIteratorInterface<ParamType>* End() const {
45971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
45981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
45991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
46001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
46011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
46021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
46031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class Iterator : public ParamIteratorInterface<ParamType> {
46041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public:
46051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const ParamGeneratorInterface<ParamType>* base,
46061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T1>& g1,
46071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T1>::iterator& current1,
46081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T2>& g2,
46091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T2>::iterator& current2,
46101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T3>& g3,
46111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T3>::iterator& current3,
46121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T4>& g4,
46131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T4>::iterator& current4,
46141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T5>& g5,
46151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T5>::iterator& current5,
46161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T6>& g6,
46171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T6>::iterator& current6,
46181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T7>& g7,
46191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T7>::iterator& current7,
46201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T8>& g8,
46211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T8>::iterator& current8,
46221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T9>& g9,
46231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T9>::iterator& current9,
46241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const ParamGenerator<T10>& g10,
46251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const typename ParamGenerator<T10>::iterator& current10)
46261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(base),
46271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
46281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
46291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
46301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
46311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
46321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
46331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
46341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
46351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
46361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
46371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
46381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
46391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ~Iterator() {}
46401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
46411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
46421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return base_;
46431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
46441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // Advance should not be called on beyond-of-range iterators
46451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // so no component iterators must be beyond end of range, either.
46461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void Advance() {
46471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      assert(!AtEnd());
46481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ++current10_;
46491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current10_ == end10_) {
46501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current10_ = begin10_;
46511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current9_;
46521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current9_ == end9_) {
46541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current9_ = begin9_;
46551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current8_;
46561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current8_ == end8_) {
46581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current8_ = begin8_;
46591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current7_;
46601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current7_ == end7_) {
46621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_ = begin7_;
46631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current6_;
46641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current6_ == end6_) {
46661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_ = begin6_;
46671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current5_;
46681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current5_ == end5_) {
46701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_ = begin5_;
46711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current4_;
46721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current4_ == end4_) {
46741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_ = begin4_;
46751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current3_;
46761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current3_ == end3_) {
46781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_ = begin3_;
46791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current2_;
46801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (current2_ == end2_) {
46821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_ = begin2_;
46831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ++current1_;
46841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
46851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
46861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
46871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual ParamIteratorInterface<ParamType>* Clone() const {
46881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return new Iterator(*this);
46891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
46901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual const ParamType* Current() const { return &current_value_; }
46911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
46921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // Having the same base generator guarantees that the other
46931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // iterator is of the same type and we can downcast.
46941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
46951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "The program attempted to compare iterators "
46961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          << "from different generators." << std::endl;
46971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      const Iterator* typed_other =
46981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          CheckedDowncastToActualType<const Iterator>(&other);
46991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterators equal if they both point beyond their
47001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // respective ranges. That can happen in a variety of fashions,
47011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // so we have to consult AtEnd().
47021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return (AtEnd() && typed_other->AtEnd()) ||
47031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania         (
47041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == typed_other->current1_ &&
47051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == typed_other->current2_ &&
47061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == typed_other->current3_ &&
47071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == typed_other->current4_ &&
47081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == typed_other->current5_ &&
47091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == typed_other->current6_ &&
47101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == typed_other->current7_ &&
47111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current8_ == typed_other->current8_ &&
47121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current9_ == typed_other->current9_ &&
47131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current10_ == typed_other->current10_);
47141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
47151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
47161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private:
47171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Iterator(const Iterator& other)
47181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        : base_(other.base_),
47191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin1_(other.begin1_),
47201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end1_(other.end1_),
47211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current1_(other.current1_),
47221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin2_(other.begin2_),
47231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end2_(other.end2_),
47241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current2_(other.current2_),
47251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin3_(other.begin3_),
47261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end3_(other.end3_),
47271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current3_(other.current3_),
47281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin4_(other.begin4_),
47291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end4_(other.end4_),
47301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current4_(other.current4_),
47311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin5_(other.begin5_),
47321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end5_(other.end5_),
47331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current5_(other.current5_),
47341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin6_(other.begin6_),
47351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end6_(other.end6_),
47361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current6_(other.current6_),
47371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin7_(other.begin7_),
47381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end7_(other.end7_),
47391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current7_(other.current7_),
47401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin8_(other.begin8_),
47411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end8_(other.end8_),
47421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current8_(other.current8_),
47431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin9_(other.begin9_),
47441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end9_(other.end9_),
47451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current9_(other.current9_),
47461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        begin10_(other.begin10_),
47471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        end10_(other.end10_),
47481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current10_(other.current10_) {
47491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ComputeCurrentValue();
47501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
47511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
47521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    void ComputeCurrentValue() {
47531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (!AtEnd())
47541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        current_value_ = ParamType(*current1_, *current2_, *current3_,
47551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current4_, *current5_, *current6_, *current7_, *current8_,
47561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            *current9_, *current10_);
47571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
47581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool AtEnd() const {
47591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // We must report iterator past the end of the range when either of the
47601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      // component iterators has reached the end of its range.
47611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return
47621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current1_ == end1_ ||
47631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current2_ == end2_ ||
47641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current3_ == end3_ ||
47651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current4_ == end4_ ||
47661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current5_ == end5_ ||
47671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current6_ == end6_ ||
47681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current7_ == end7_ ||
47691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current8_ == end8_ ||
47701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current9_ == end9_ ||
47711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          current10_ == end10_;
47721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
47731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
477441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // No implementation - assignment is unsupported.
477541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    void operator=(const Iterator& other);
477641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
47771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const ParamGeneratorInterface<ParamType>* const base_;
47781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
47791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    // current[i]_ is the actual traversing iterator.
47801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator begin1_;
47811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T1>::iterator end1_;
47821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T1>::iterator current1_;
47831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator begin2_;
47841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T2>::iterator end2_;
47851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T2>::iterator current2_;
47861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator begin3_;
47871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T3>::iterator end3_;
47881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T3>::iterator current3_;
47891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator begin4_;
47901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T4>::iterator end4_;
47911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T4>::iterator current4_;
47921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator begin5_;
47931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T5>::iterator end5_;
47941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T5>::iterator current5_;
47951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator begin6_;
47961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T6>::iterator end6_;
47971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T6>::iterator current6_;
47981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator begin7_;
47991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T7>::iterator end7_;
48001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T7>::iterator current7_;
48011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T8>::iterator begin8_;
48021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T8>::iterator end8_;
48031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T8>::iterator current8_;
48041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T9>::iterator begin9_;
48051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T9>::iterator end9_;
48061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T9>::iterator current9_;
48071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T10>::iterator begin10_;
48081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const typename ParamGenerator<T10>::iterator end10_;
48091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename ParamGenerator<T10>::iterator current10_;
48101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ParamType current_value_;
481141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };  // class CartesianProductGenerator10::Iterator
481241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
481341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
481441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductGenerator10& other);
48151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T1> g1_;
48171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T2> g2_;
48181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T3> g3_;
48191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T4> g4_;
48201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T5> g5_;
48211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T6> g6_;
48221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T7> g7_;
48231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T8> g8_;
48241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T9> g9_;
48251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const ParamGenerator<T10> g10_;
482641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductGenerator10
48271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
48301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
48311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Helper classes providing Combine() with polymorphic features. They allow
48321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
48331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// convertible to U.
48341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
48351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2>
48361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder2 {
48371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
48381be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
48391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2) {}
48401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2>
48411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
48421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
48431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator2<T1, T2>(
48441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
48451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_)));
48461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
48471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
484941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
485041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder2& other);
485141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
48521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
48531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
485441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder2
48551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3>
48571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder3 {
48581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
48591be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
48601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3)
48611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3) {}
48621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3>
48631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
48641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
48651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator3<T1, T2, T3>(
48661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
48671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
48681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_)));
48691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
48701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
487241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
487341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder3& other);
487441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
48751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
48761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
48771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
487841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder3
48791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
48811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4>
48821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder4 {
48831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
48841be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
48851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4)
48861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
48871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4>
48881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
48891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
48901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator4<T1, T2, T3, T4>(
48911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
48921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
48931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
48941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_)));
48951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
48961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
48971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
489841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
489941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder4& other);
490041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
49011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
49021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
49031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
49041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
490541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder4
49061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
49071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
49081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4, class Generator5>
49091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder5 {
49101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
49111be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
49121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4, const Generator5& g5)
49131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
49141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4, typename T5>
49151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
49161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
49171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
49181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
49191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
49201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
49211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_),
49221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T5> >(g5_)));
49231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
49241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
49251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
492641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
492741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder5& other);
492841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
49291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
49301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
49311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
49321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
49331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator5 g5_;
493441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder5
49351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
49361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
49371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4, class Generator5, class Generator6>
49381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder6 {
49391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
49401be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
49411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4, const Generator5& g5,
49421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator6& g6)
49431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
49441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4, typename T5,
49451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      typename T6>
49461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
49471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
49481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
49491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
49501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
49511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
49521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_),
49531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T5> >(g5_),
49541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T6> >(g6_)));
49551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
49561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
49571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
495841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
495941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder6& other);
496041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
49611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
49621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
49631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
49641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
49651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator5 g5_;
49661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator6 g6_;
496741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder6
49681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
49691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
49701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4, class Generator5, class Generator6, class Generator7>
49711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder7 {
49721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
49731be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
49741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4, const Generator5& g5,
49751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator6& g6, const Generator7& g7)
49761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
49771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4, typename T5,
49781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      typename T6, typename T7>
49791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
49801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T7> >() const {
49811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
49821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
49831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
49841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
49851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
49861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_),
49871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T5> >(g5_),
49881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T6> >(g6_),
49891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T7> >(g7_)));
49901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
49911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
49921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
499341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
499441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder7& other);
499541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
49961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
49971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
49981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
49991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
50001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator5 g5_;
50011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator6 g6_;
50021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator7 g7_;
500341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder7
50041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
50051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
50061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4, class Generator5, class Generator6, class Generator7,
50071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator8>
50081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder8 {
50091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
50101be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
50111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4, const Generator5& g5,
50121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator6& g6, const Generator7& g7, const Generator8& g8)
50131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
50141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          g8_(g8) {}
50151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4, typename T5,
50161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      typename T6, typename T7, typename T8>
50171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
50181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T8> >() const {
50191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
50201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
50211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
50221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
50231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
50241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_),
50251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T5> >(g5_),
50261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T6> >(g6_),
50271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T7> >(g7_),
50281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T8> >(g8_)));
50291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
50301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
50311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
503241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
503341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder8& other);
503441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
50351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
50361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
50371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
50381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
50391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator5 g5_;
50401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator6 g6_;
50411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator7 g7_;
50421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator8 g8_;
504341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder8
50441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
50451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
50461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4, class Generator5, class Generator6, class Generator7,
50471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator8, class Generator9>
50481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder9 {
50491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
50501be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
50511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4, const Generator5& g5,
50521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator6& g6, const Generator7& g7, const Generator8& g8,
50531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator9& g9)
50541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
50551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          g9_(g9) {}
50561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4, typename T5,
50571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      typename T6, typename T7, typename T8, typename T9>
50581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
50591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T9> >() const {
50601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
50611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T9> >(
50621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
50631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
50641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
50651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
50661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_),
50671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T5> >(g5_),
50681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T6> >(g6_),
50691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T7> >(g7_),
50701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T8> >(g8_),
50711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T9> >(g9_)));
50721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
50731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
50741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
507541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
507641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder9& other);
507741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
50781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
50791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
50801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
50811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
50821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator5 g5_;
50831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator6 g6_;
50841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator7 g7_;
50851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator8 g8_;
50861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator9 g9_;
508741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder9
50881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
50891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Generator1, class Generator2, class Generator3,
50901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator4, class Generator5, class Generator6, class Generator7,
50911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    class Generator8, class Generator9, class Generator10>
50921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass CartesianProductHolder10 {
50931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
50941be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
50951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator3& g3, const Generator4& g4, const Generator5& g5,
50961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator6& g6, const Generator7& g7, const Generator8& g8,
50971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator9& g9, const Generator10& g10)
50981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
50991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          g9_(g9), g10_(g10) {}
51001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  template <typename T1, typename T2, typename T3, typename T4, typename T5,
51011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      typename T6, typename T7, typename T8, typename T9, typename T10>
51021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
51031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T9, T10> >() const {
51041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
51051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        T9, T10> >(
51061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
51071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania            T10>(
51081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T1> >(g1_),
51091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T2> >(g2_),
51101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T3> >(g3_),
51111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T4> >(g4_),
51121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T5> >(g5_),
51131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T6> >(g6_),
51141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T7> >(g7_),
51151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T8> >(g8_),
51161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T9> >(g9_),
51171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        static_cast<ParamGenerator<T10> >(g10_)));
51181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
51191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
51201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
512141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // No implementation - assignment is unsupported.
512241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  void operator=(const CartesianProductHolder10& other);
512341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
51241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator1 g1_;
51251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator2 g2_;
51261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator3 g3_;
51271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator4 g4_;
51281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator5 g5_;
51291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator6 g6_;
51301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator7 g7_;
51311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator8 g8_;
51321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator9 g9_;
51331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const Generator10 g10_;
513441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};  // class CartesianProductHolder10
51351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
513641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif  // GTEST_HAS_COMBINE
51371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
51381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}  // namespace internal
51391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}  // namespace testing
51401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
51411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  //  GTEST_HAS_PARAM_TEST
51421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
51431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
5144