13d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This file was GENERATED by command:
23d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     pump.py gtest-param-util-generated.h.pump
33d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DO NOT EDIT BY HAND!!!
43d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
53d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Copyright 2008 Google Inc.
63d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// All Rights Reserved.
73d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
83d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Redistribution and use in source and binary forms, with or without
93d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// modification, are permitted provided that the following conditions are
103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// met:
113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions of source code must retain the above copyright
133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// notice, this list of conditions and the following disclaimer.
143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions in binary form must reproduce the above
153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyright notice, this list of conditions and the following disclaimer
163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the documentation and/or other materials provided with the
173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// distribution.
183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Neither the name of Google Inc. nor the names of its
193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// contributors may be used to endorse or promote products derived from
203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// this software without specific prior written permission.
213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Author: vladl@google.com (Vlad Losev)
353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Type and function utilities for implementing parameterized tests.
373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Currently Google Test supports at most 50 arguments in Values,
403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// and at most 10 arguments in Combine. Please contact
413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// googletestframework@googlegroups.com if you need more.
423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Please note that the number of arguments to Combine is limited
433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// by the maximum arity of the implementation of tr1::tuple which is
443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// currently set at 10.
453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// scripts/fuse_gtest.py depends on gtest's own header being #included
503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// *unconditionally*.  Therefore these #includes cannot be moved
513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// inside #if GTEST_HAS_PARAM_TEST.
523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-param-util.h"
533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-port.h"
543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if GTEST_HAS_PARAM_TEST
563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace testing {
583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Forward declarations of ValuesIn(), which is implemented in
603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// include/gtest/gtest-param-test.h.
613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename ForwardIterator>
623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<
633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickValuesIn(ForwardIterator begin, ForwardIterator end);
653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T, size_t N>
673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Container>
703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinternal::ParamGenerator<typename Container::value_type> ValuesIn(
713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Container& container);
723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace internal {
743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Used in the Values() function to provide polymorphic capabilities.
763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1>
773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray1 {
783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit ValueArray1(T1 v1) : v1_(v1) {}
803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray1& other);
873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2>
923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray2 {
933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_};
993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
1003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
1013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
1043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray2& other);
1053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
1073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
1083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3>
1113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray3 {
1123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
1143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
1163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
1173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_};
1183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
1193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
1203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
1233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray3& other);
1243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
1263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
1273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
1283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4>
1313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray4 {
1323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
1343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4) {}
1353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
1373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
1383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_};
1393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
1403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
1413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
1443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray4& other);
1453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
1473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
1483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
1493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
1503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
1533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray5 {
1543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
1563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4), v5_(v5) {}
1573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
1593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
1603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_};
1613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
1623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
1633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
1663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray5& other);
1673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
1693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
1703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
1713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
1723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
1733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6>
1773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray6 {
1783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
1803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
1813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
1833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
1843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
1853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
1863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
1873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
1903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray6& other);
1913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
1933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
1943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
1953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
1963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
1973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
1983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7>
2023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray7 {
2033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
2053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
2063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
2083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
2093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
2103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
2113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
2143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
2153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray7& other);
2163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
2183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
2193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
2203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
2213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
2223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
2233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
2243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
2253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8>
2283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray8 {
2293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
2313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8) {}
2333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
2353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
2363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
2373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
2383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
2413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
2423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray8& other);
2433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
2453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
2463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
2473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
2483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
2493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
2503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
2513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
2523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
2533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9>
2563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray9 {
2573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
2593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9) {}
2613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
2633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
2643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
2653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
2663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
2693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
2703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray9& other);
2713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
2733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
2743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
2753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
2763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
2773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
2783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
2793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
2803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
2813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
2823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
2843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10>
2853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray10 {
2863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10) {}
2903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
2923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
2933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
2943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
2953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
2983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
2993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray10& other);
3003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
3023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
3033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
3043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
3053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
3063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
3073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
3083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
3093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
3103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
3113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
3123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
3153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11>
3163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray11 {
3173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
3183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
3203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
3213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
3233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
3243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
3253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
3263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
3293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
3303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray11& other);
3313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
3333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
3343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
3353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
3363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
3373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
3383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
3393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
3403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
3413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
3423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
3433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
3443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
3473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12>
3483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray12 {
3493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
3503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
3523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
3533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
3553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
3563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
3573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_};
3583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
3593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
3623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
3633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray12& other);
3643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
3663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
3673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
3683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
3693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
3703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
3713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
3723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
3733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
3743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
3753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
3763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
3773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
3783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
3813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13>
3823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray13 {
3833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
3843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
3853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
3863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
3873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12_(v12), v13_(v13) {}
3883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
3903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
3913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
3923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_};
3933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
3943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
3973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
3983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray13& other);
3993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
4013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
4023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
4033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
4043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
4053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
4063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
4073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
4083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
4093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
4103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
4113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
4123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
4133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
4143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14>
4183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray14 {
4193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
4203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
4223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
4233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
4243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
4263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
4273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
4283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_};
4293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
4303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
4313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
4333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
4343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray14& other);
4353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
4373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
4383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
4393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
4403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
4413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
4423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
4433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
4443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
4453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
4463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
4473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
4483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
4493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
4503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
4513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15>
4553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray15 {
4563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
4573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
4593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
4603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
4613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
4633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
4643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
4653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_};
4663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
4673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
4683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
4703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
4713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray15& other);
4723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
4743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
4753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
4763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
4773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
4783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
4793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
4803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
4813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
4823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
4833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
4843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
4853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
4863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
4873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
4883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
4893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
4923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
4933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16>
4943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray16 {
4953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
4963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
4983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
4993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
5003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16_(v16) {}
5013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
5033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
5043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
5053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_};
5063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
5073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
5103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
5113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray16& other);
5123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
5143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
5153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
5163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
5173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
5183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
5193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
5203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
5213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
5223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
5233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
5243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
5253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
5263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
5273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
5283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
5293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
5303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17>
5353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray17 {
5363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
5373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
5383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
5393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
5403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
5413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17) {}
5423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
5443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
5453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
5463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_};
5473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
5483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
5513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
5523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray17& other);
5533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
5553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
5563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
5573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
5583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
5593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
5603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
5613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
5623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
5633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
5643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
5653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
5663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
5673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
5683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
5693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
5703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
5713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
5723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
5753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
5763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18>
5773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray18 {
5783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
5793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
5803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
5813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
5823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
5833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
5843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
5863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
5873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
5883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_};
5893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
5903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
5933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
5943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray18& other);
5953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
5973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
5983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
5993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
6003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
6013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
6023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
6033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
6043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
6053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
6063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
6073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
6083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
6093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
6103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
6113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
6123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
6133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
6143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
6153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19>
6203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray19 {
6213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
6223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
6253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
6263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
6273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
6293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
6303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
6313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
6323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
6333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
6343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
6363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
6373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray19& other);
6383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
6403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
6413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
6423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
6433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
6443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
6453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
6463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
6473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
6483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
6493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
6503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
6513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
6523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
6533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
6543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
6553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
6563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
6573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
6583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
6593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
6623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
6633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20>
6643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray20 {
6653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
6663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
6693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
6703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
6713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v19_(v19), v20_(v20) {}
6723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
6743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
6753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
6763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
6773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
6783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
6793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
6813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
6823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray20& other);
6833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
6853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
6863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
6873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
6883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
6893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
6903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
6913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
6923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
6933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
6943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
6953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
6963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
6973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
6983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
6993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
7003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
7013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
7023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
7033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
7043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
7053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21>
7113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray21 {
7123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
7133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
7143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
7153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
7163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
7173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
7183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
7193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
7213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
7223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
7233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
7243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
7253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
7263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
7283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
7293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray21& other);
7303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
7323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
7333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
7343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
7353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
7363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
7373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
7383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
7393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
7403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
7413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
7423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
7433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
7443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
7453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
7463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
7473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
7483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
7493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
7503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
7513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
7523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
7533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
7563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
7573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
7583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22>
7593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray22 {
7603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
7613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
7623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
7633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
7643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
7653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
7663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
7673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
7693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
7703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
7713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
7723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
7733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
7743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
7763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
7773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray22& other);
7783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
7803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
7813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
7823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
7833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
7843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
7853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
7863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
7873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
7883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
7893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
7903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
7913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
7923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
7933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
7943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
7953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
7963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
7973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
7983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
7993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
8003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
8013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
8053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
8063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
8073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23>
8083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray23 {
8093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
8113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
8123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
8133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
8143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
8153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
8163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23) {}
8173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
8193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
8203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
8213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
8223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v23_};
8233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
8243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
8253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
8273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
8283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray23& other);
8293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
8313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
8323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
8333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
8343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
8353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
8363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
8373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
8383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
8393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
8403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
8413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
8423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
8433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
8443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
8453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
8463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
8473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
8483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
8493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
8503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
8513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
8523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
8533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
8573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
8583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
8593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24>
8603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray24 {
8613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
8633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
8643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
8653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
8663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
8673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
8683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v22_(v22), v23_(v23), v24_(v24) {}
8693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
8713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
8723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
8733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
8743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_};
8753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
8763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
8773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
8793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
8803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray24& other);
8813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
8833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
8843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
8853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
8863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
8873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
8883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
8893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
8903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
8913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
8923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
8933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
8943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
8953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
8963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
8973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
8983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
8993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
9003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
9013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
9023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
9033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
9043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
9053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
9063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
9073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
9103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
9113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
9123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25>
9133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray25 {
9143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
9153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
9183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
9193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
9203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
9213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
9223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
9243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
9253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
9263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
9273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_};
9283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
9293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
9303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
9323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
9333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray25& other);
9343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
9363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
9373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
9383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
9393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
9403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
9413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
9423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
9433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
9443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
9453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
9463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
9473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
9483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
9493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
9503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
9513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
9523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
9533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
9543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
9553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
9563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
9573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
9583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
9593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
9603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
9613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
9643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
9653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
9663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
9673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26>
9683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray26 {
9693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
9703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
9743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
9753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
9763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
9773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
9793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
9803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
9813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
9823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_};
9833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
9843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
9853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
9873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
9883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray26& other);
9893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
9913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
9923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
9933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
9943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
9953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
9963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
9973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
9983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
9993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
10003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
10013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
10023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
10033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
10043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
10053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
10063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
10073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
10083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
10093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
10103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
10113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
10123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
10133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
10143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
10153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
10163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
10173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
10203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
10213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
10223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
10233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27>
10243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray27 {
10253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
10263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
10303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
10313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
10323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
10333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v26_(v26), v27_(v27) {}
10343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
10363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
10373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
10383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
10393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_};
10403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
10413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
10423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
10443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
10453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray27& other);
10463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
10483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
10493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
10503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
10513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
10523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
10533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
10543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
10553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
10563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
10573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
10583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
10593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
10603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
10613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
10623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
10633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
10643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
10653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
10663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
10673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
10683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
10693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
10703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
10713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
10723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
10733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
10743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
10753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
10783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
10793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
10803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
10813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28>
10823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray28 {
10833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
10843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
10883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
10893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
10903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
10913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
10923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
10933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
10943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
10953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
10963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
10973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_};
10983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
10993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
11003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
11023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
11033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray28& other);
11043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
11063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
11073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
11083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
11093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
11103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
11113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
11123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
11133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
11143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
11153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
11163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
11173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
11183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
11193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
11203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
11213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
11223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
11233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
11243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
11253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
11263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
11273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
11283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
11293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
11303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
11313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
11323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
11333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
11343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
11373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
11383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
11393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
11403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29>
11413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray29 {
11423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
11433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
11503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
11513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
11533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
11543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
11553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
11563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_};
11573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
11583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
11593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
11613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
11623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray29& other);
11633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
11653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
11663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
11673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
11683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
11693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
11703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
11713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
11723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
11733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
11743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
11753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
11763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
11773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
11783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
11793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
11803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
11813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
11823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
11833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
11843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
11853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
11863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
11873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
11883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
11893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
11903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
11913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
11923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
11933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
11943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
11953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
11973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
11983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
11993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
12003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30>
12013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray30 {
12023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
12033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
12073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29_(v29), v30_(v30) {}
12123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
12143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
12153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
12163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
12173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_};
12183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
12193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
12203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
12223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
12233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray30& other);
12243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
12263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
12273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
12283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
12293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
12303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
12313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
12323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
12333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
12343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
12353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
12363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
12373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
12383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
12393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
12403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
12413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
12423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
12433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
12443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
12453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
12463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
12473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
12483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
12493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
12503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
12513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
12523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
12533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
12543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
12553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
12563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
12593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
12603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
12613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
12623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
12633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31>
12643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray31 {
12653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
12663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
12703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29_(v29), v30_(v30), v31_(v31) {}
12753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
12773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
12783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
12793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
12803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
12813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
12823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
12833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
12853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
12863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray31& other);
12873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
12883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
12893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
12903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
12913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
12923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
12933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
12943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
12953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
12963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
12973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
12983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
12993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
13003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
13013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
13023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
13033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
13043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
13053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
13063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
13073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
13083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
13093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
13103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
13113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
13123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
13133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
13143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
13153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
13163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
13173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
13183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
13193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
13203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
13233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
13243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
13253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
13263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
13273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32>
13283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray32 {
13293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
13303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
13343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
13353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
13363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
13373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
13383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
13393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
13413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
13423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
13433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
13443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
13453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
13463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
13473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
13493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
13503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray32& other);
13513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
13533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
13543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
13553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
13563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
13573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
13583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
13593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
13603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
13613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
13623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
13633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
13643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
13653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
13663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
13673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
13683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
13693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
13703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
13713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
13723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
13733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
13743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
13753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
13763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
13773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
13783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
13793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
13803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
13813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
13823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
13833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
13843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
13853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
13863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
13883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
13893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
13903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
13913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
13923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33>
13933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray33 {
13943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
13953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
13993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
14003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
14013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
14023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
14033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
14043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33_(v33) {}
14053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
14073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
14083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
14093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
14103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
14113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
14123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
14133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
14153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
14163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray33& other);
14173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
14193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
14203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
14213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
14223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
14233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
14243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
14253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
14263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
14273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
14283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
14293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
14303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
14313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
14323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
14333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
14343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
14353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
14363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
14373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
14383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
14393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
14403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
14413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
14423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
14433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
14443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
14453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
14463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
14473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
14483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
14493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
14503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
14513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
14523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
14553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
14563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
14573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
14583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
14593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34>
14603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray34 {
14613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
14623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
14633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
14643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
14653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
14663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
14673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
14683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
14693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
14703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
14713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33_(v33), v34_(v34) {}
14723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
14743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
14753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
14763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
14773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
14783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
14793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
14803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
14823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
14833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray34& other);
14843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
14853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
14863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
14873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
14883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
14893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
14903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
14913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
14923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
14933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
14943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
14953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
14963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
14973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
14983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
14993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
15003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
15013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
15023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
15033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
15043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
15053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
15063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
15073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
15083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
15093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
15103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
15113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
15123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
15133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
15143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
15153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
15163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
15173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
15183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
15193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
15203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
15213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
15233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
15243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
15253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
15263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
15273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35>
15283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray35 {
15293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
15303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
15323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
15333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
15343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
15353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
15363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
15373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
15383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
15393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
15403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
15413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
15423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
15433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
15443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
15453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
15463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v35_};
15473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
15483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
15493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
15503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
15513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
15523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray35& other);
15533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
15543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
15553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
15563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
15573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
15583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
15593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
15603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
15613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
15623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
15633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
15643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
15653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
15663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
15673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
15683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
15693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
15703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
15713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
15723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
15733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
15743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
15753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
15763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
15773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
15783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
15793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
15803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
15813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
15823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
15833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
15843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
15853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
15863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
15873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
15883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
15893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
15903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
15913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
15933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
15943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
15953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
15963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
15973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
15983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36>
15993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray36 {
16003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
16013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
16063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
16073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
16083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
16093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
16103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
16113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
16133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
16143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
16153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
16163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
16173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_};
16183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
16193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
16203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
16223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
16233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray36& other);
16243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
16263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
16273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
16283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
16293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
16303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
16313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
16323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
16333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
16343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
16353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
16363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
16373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
16383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
16393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
16403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
16413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
16423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
16433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
16443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
16453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
16463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
16473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
16483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
16493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
16503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
16513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
16523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
16533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
16543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
16553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
16563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
16573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
16583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
16593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
16603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
16613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
16623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
16653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
16663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
16673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
16683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
16693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
16703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37>
16713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray37 {
16723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
16733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
16783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
16793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
16803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
16813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
16823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
16833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v36_(v36), v37_(v37) {}
16843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
16863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
16873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
16883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
16893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
16903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_};
16913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
16923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
16933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
16953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
16963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray37& other);
16973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
16983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
16993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
17003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
17013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
17023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
17033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
17043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
17053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
17063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
17073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
17083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
17093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
17103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
17113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
17123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
17133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
17143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
17153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
17163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
17173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
17183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
17193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
17203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
17213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
17223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
17233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
17243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
17253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
17263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
17273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
17283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
17293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
17303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
17313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
17323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
17333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
17343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
17353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
17363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
17373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
17383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
17393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
17403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
17413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
17423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
17433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
17443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38>
17453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray38 {
17463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
17473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
17483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
17493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
17503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
17513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
17523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
17533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
17543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
17553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
17563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
17573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
17583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
17593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
17603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
17613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
17623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
17633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
17643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_};
17653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
17663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
17673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
17683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
17693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
17703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray38& other);
17713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
17723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
17733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
17743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
17753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
17763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
17773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
17783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
17793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
17803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
17813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
17823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
17833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
17843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
17853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
17863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
17873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
17883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
17893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
17903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
17913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
17923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
17933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
17943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
17953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
17963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
17973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
17983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
17993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
18003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
18013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
18023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
18033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
18043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
18053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
18063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
18073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
18083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
18093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
18103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
18113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
18123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
18133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
18143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
18153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
18163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
18173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
18183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
18193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39>
18203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray39 {
18213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
18223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
18233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
18243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
18253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
18263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
18273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
18283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
18293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
18303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
18313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
18323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
18333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
18343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
18353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
18363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
18373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
18383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
18393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_};
18403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
18413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
18423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
18433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
18443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
18453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray39& other);
18463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
18473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
18483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
18493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
18503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
18513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
18523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
18533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
18543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
18553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
18563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
18573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
18583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
18593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
18603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
18613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
18623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
18633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
18643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
18653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
18663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
18673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
18683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
18693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
18703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
18713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
18723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
18733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
18743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
18753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
18763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
18773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
18783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
18793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
18803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
18813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
18823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
18833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
18843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
18853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
18863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
18873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
18883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
18893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
18903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
18913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
18923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
18933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
18943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
18953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40>
18963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray40 {
18973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
18983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
18993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
19003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
19013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
19023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
19033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
19043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
19053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
19063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
19073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
19083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
19093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v40_(v40) {}
19103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
19113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
19123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
19133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
19143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
19153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
19163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_};
19173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
19183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
19193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
19203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
19213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
19223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray40& other);
19233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
19243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
19253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
19263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
19273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
19283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
19293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
19303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
19313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
19323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
19333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
19343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
19353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
19363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
19373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
19383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
19393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
19403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
19413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
19423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
19433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
19443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
19453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
19463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
19473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
19483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
19493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
19503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
19513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
19523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
19533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
19543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
19553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
19563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
19573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
19583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
19593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
19603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
19613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
19623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
19633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
19643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
19653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
19663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
19673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
19683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
19693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
19703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
19713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
19723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
19733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
19743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41>
19753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray41 {
19763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
19773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
19783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
19793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
19803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
19813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
19823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
19833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
19843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
19853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
19863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
19873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
19883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v39_(v39), v40_(v40), v41_(v41) {}
19893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
19903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
19913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
19923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
19933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
19943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
19953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_};
19963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
19973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
19983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
19993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
20003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
20013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray41& other);
20023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
20033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
20043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
20053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
20063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
20073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
20083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
20093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
20103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
20113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
20123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
20133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
20143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
20153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
20163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
20173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
20183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
20193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
20203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
20213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
20223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
20233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
20243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
20253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
20263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
20273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
20283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
20293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
20303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
20313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
20323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
20333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
20343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
20353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
20363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
20373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
20383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
20393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
20403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
20413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
20423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
20433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
20443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
20453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
20463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
20473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
20483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
20493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
20503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
20513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
20523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
20533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
20543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42>
20553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray42 {
20563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
20573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
20583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
20593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
20603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
20613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
20623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
20633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
20643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
20653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
20663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
20673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
20683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
20693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
20703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
20713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
20723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
20733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
20743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
20753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_};
20763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
20773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
20783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
20793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
20803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
20813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray42& other);
20823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
20833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
20843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
20853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
20863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
20873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
20883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
20893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
20903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
20913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
20923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
20933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
20943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
20953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
20963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
20973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
20983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
20993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
21003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
21013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
21023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
21033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
21043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
21053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
21063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
21073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
21083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
21093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
21103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
21113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
21123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
21133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
21143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
21153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
21163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
21173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
21183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
21193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
21203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
21213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
21223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
21233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
21243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
21253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
21263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
21273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
21283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
21293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
21303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
21313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
21323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
21333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
21343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
21353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43>
21363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray43 {
21373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
21383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
21393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
21403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
21413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
21423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
21433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
21443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
21453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
21463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
21473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
21483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
21493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
21503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
21513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
21523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
21533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
21543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
21553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
21563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
21573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
21583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
21593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
21603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
21613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
21623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray43& other);
21633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
21643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
21653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
21663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
21673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
21683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
21693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
21703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
21713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
21723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
21733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
21743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
21753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
21763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
21773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
21783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
21793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
21803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
21813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
21823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
21833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
21843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
21853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
21863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
21873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
21883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
21893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
21903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
21913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
21923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
21933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
21943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
21953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
21963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
21973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
21983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
21993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
22003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
22013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
22023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
22033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
22043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
22053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
22063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
22073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
22083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
22093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
22103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
22113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
22123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
22133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
22143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
22153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
22163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
22173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44>
22183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray44 {
22193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
22203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
22213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
22223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
22233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
22243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
22253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
22263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
22273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
22283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
22293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
22303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
22313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
22323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v43_(v43), v44_(v44) {}
22333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
22343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
22353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
22363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
22373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
22383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
22393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
22403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
22413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
22423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
22433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
22443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
22453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray44& other);
22463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
22473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
22483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
22493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
22503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
22513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
22523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
22533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
22543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
22553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
22563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
22573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
22583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
22593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
22603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
22613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
22623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
22633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
22643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
22653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
22663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
22673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
22683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
22693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
22703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
22713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
22723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
22733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
22743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
22753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
22763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
22773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
22783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
22793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
22803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
22813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
22823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
22833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
22843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
22853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
22863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
22873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
22883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
22893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
22903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
22913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
22923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
22933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
22943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
22953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
22963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
22973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
22983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
22993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
23003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
23013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45>
23023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray45 {
23033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
23043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
23053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
23063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
23073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
23083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
23093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
23103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
23113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
23123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
23133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
23143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
23153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
23163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
23173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
23183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
23193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
23203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
23213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
23223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
23233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
23243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
23253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
23263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
23273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
23283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
23293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray45& other);
23303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
23313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
23323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
23333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
23343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
23353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
23363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
23373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
23383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
23393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
23403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
23413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
23423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
23433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
23443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
23453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
23463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
23473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
23483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
23493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
23503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
23513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
23523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
23533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
23543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
23553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
23563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
23573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
23583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
23593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
23603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
23613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
23623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
23633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
23643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
23653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
23663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
23673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
23683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
23693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
23703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
23713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
23723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
23733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
23743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
23753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T45 v45_;
23763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
23773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
23783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
23793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
23803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
23813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
23823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
23833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
23843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
23853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
23863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
23873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46>
23883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray46 {
23893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
23903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
23913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
23923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
23933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
23943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
23953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
23963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
23973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
23983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
23993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
24003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
24013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
24023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
24033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
24043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
24053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
24063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
24073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
24083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
24093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
24103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
24113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
24123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
24133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
24143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
24153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray46& other);
24163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
24173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
24183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
24193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
24203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
24213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
24223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
24233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
24243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
24253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
24263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
24273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
24283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
24293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
24303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
24313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
24323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
24333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
24343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
24353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
24363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
24373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
24383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
24393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
24403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
24413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
24423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
24433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
24443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
24453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
24463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
24473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
24483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
24493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
24503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
24513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
24523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
24533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
24543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
24553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
24563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
24573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
24583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
24593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
24603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
24613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T45 v45_;
24623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T46 v46_;
24633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
24643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
24653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
24663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
24673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
24683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
24693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
24703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
24713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
24723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
24733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
24743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47>
24753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray47 {
24763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
24773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
24783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
24793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
24803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
24813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
24823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
24833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
24843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
24853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
24863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
24873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
24883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
24893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
24903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v47_(v47) {}
24913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
24923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
24933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
24943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
24953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
24963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
24973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
24983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v47_};
24993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
25003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
25013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
25023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
25033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
25043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray47& other);
25053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
25063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
25073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
25083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
25093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
25103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
25113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
25123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
25133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
25143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
25153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
25163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
25173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
25183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
25193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
25203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
25213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
25223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
25233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
25243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
25253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
25263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
25273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
25283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
25293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
25303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
25313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
25323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
25333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
25343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
25353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
25363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
25373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
25383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
25393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
25403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
25413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
25423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
25433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
25443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
25453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
25463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
25473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
25483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
25493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
25503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T45 v45_;
25513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T46 v46_;
25523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T47 v47_;
25533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
25543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
25553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
25563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
25573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
25583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
25593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
25603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
25613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
25623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
25633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
25643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47, typename T48>
25653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray48 {
25663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
25673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
25683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
25693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
25703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
25713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
25723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
25733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
25743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
25753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
25763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
25773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
25783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
25793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
25803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v46_(v46), v47_(v47), v48_(v48) {}
25813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
25823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
25833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
25843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
25853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
25863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
25873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
25883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v48_};
25893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
25903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
25913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
25923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
25933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
25943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray48& other);
25953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
25963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
25973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
25983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
25993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
26003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
26013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
26023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
26033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
26043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
26053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
26063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
26073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
26083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
26093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
26103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
26113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
26123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
26133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
26143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
26153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
26163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
26173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
26183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
26193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
26203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
26213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
26223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
26233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
26243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
26253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
26263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
26273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
26283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
26293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
26303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
26313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
26323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
26333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
26343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
26353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
26363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
26373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
26383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
26393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
26403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T45 v45_;
26413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T46 v46_;
26423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T47 v47_;
26433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T48 v48_;
26443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
26453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
26463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
26473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
26483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
26493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
26503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
26513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
26523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
26533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
26543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
26553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47, typename T48, typename T49>
26563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray49 {
26573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
26583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
26593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
26603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
26613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
26623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
26633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
26643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
26653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
26663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
26673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
26683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
26693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
26703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
26713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
26723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
26733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
26743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
26753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
26763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
26773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
26783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
26793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v48_, v49_};
26803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
26813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
26823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
26833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
26843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
26853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray49& other);
26863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
26873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
26883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
26893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
26903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
26913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
26923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
26933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
26943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
26953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
26963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
26973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
26983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
26993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
27003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
27013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
27023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
27033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
27043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
27053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
27063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
27073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
27083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
27093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
27103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
27113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
27123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
27133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
27143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
27153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
27163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
27173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
27183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
27193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
27203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
27213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
27223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
27233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
27243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
27253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
27263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
27273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
27283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
27293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
27303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
27313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T45 v45_;
27323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T46 v46_;
27333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T47 v47_;
27343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T48 v48_;
27353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T49 v49_;
27363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
27373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
27383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
27393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10,
27403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T11, typename T12, typename T13, typename T14, typename T15,
27413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T16, typename T17, typename T18, typename T19, typename T20,
27423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T21, typename T22, typename T23, typename T24, typename T25,
27433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T26, typename T27, typename T28, typename T29, typename T30,
27443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T31, typename T32, typename T33, typename T34, typename T35,
27453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T36, typename T37, typename T38, typename T39, typename T40,
27463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T41, typename T42, typename T43, typename T44, typename T45,
27473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T46, typename T47, typename T48, typename T49, typename T50>
27483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass ValueArray50 {
27493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
27503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
27513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
27523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
27533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
27543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
27553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
27563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
27573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
27583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
27593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
27603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
27613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
27623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
27633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
27643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
27653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T>
27663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator<T>() const {
27673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
27683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
27693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
27703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
27713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        v48_, v49_, v50_};
27723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ValuesIn(array);
27733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
27743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
27753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
27763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
27773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const ValueArray50& other);
27783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
27793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T1 v1_;
27803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T2 v2_;
27813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T3 v3_;
27823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T4 v4_;
27833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T5 v5_;
27843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T6 v6_;
27853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T7 v7_;
27863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T8 v8_;
27873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T9 v9_;
27883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T10 v10_;
27893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T11 v11_;
27903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T12 v12_;
27913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T13 v13_;
27923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T14 v14_;
27933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T15 v15_;
27943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T16 v16_;
27953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T17 v17_;
27963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T18 v18_;
27973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T19 v19_;
27983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T20 v20_;
27993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T21 v21_;
28003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T22 v22_;
28013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T23 v23_;
28023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T24 v24_;
28033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T25 v25_;
28043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T26 v26_;
28053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T27 v27_;
28063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T28 v28_;
28073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T29 v29_;
28083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T30 v30_;
28093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T31 v31_;
28103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T32 v32_;
28113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T33 v33_;
28123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T34 v34_;
28133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T35 v35_;
28143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T36 v36_;
28153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T37 v37_;
28163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T38 v38_;
28173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T39 v39_;
28183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T40 v40_;
28193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T41 v41_;
28203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T42 v42_;
28213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T43 v43_;
28223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T44 v44_;
28233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T45 v45_;
28243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T46 v46_;
28253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T47 v47_;
28263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T48 v48_;
28273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T49 v49_;
28283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const T50 v50_;
28293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
28303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
28313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# if GTEST_HAS_COMBINE
28323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
28333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
28343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Generates values from the Cartesian product of values produced
28353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// by the argument generators.
28363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
28373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2>
28383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator2
28393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
28403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
28413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2> ParamType;
28423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
28433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
28443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2)
28453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2) {}
28463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator2() {}
28473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
28483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
28493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
28503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
28513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
28523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
28533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
28543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
28553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
28563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
28573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
28583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
28593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
28603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
28613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
28623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2)
28633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
28643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
28653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
28663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
28673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
28683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
28693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
28703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
28713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
28723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
28733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
28743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
28753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
28763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
28773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current2_;
28783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
28793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
28803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
28813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
28823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
28833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
28843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
28853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
28863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
28873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
28883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
28893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
28903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
28913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
28923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
28933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
28943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
28953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
28963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
28973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
28983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
28993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
29003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
29013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
29023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_);
29033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
29043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
29063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
29073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
29083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
29093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
29103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
29113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
29123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
29133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_) {
29143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
29153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
29163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
29183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
29193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_);
29203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
29213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
29223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
29233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
29243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
29253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
29263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_;
29273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
29283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
29303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
29313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
29333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
29343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
29353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
29363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
29373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
29383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
29393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
29403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
29413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
29423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator2::Iterator
29433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
29453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator2& other);
29463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
29483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
29493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator2
29503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3>
29533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator3
29543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
29553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
29563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
29573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
29593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
29603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3) {}
29613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator3() {}
29623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
29643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
29653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin());
29663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
29673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
29683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
29693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
29703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
29723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
29733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
29743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
29753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
29763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
29773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
29783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
29793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
29803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3)
29813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
29823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
29833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
29843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
29853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
29863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
29873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
29883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
29893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
29903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
29913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
29923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
29933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
29943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
29953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
29963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current3_;
29973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
29983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
29993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
30003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
30013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
30023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
30033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
30043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
30053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
30063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
30073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
30083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
30093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
30103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
30113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
30123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
30133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
30143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
30153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
30163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
30173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
30183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
30193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
30203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
30213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
30223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
30233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
30243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
30253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
30263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_);
30273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
30283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
30303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
30313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
30323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
30333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
30343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
30353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
30363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
30373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
30383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
30393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
30403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_) {
30413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
30423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
30433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
30453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
30463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_);
30473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
30483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
30493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
30503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
30513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
30523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
30533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
30543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_;
30553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
30563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
30583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
30593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
30613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
30623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
30633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
30643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
30653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
30663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
30673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
30683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
30693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
30703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
30713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
30723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
30733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator3::Iterator
30743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
30763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator3& other);
30773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
30793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
30803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
30813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator3
30823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4>
30853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator4
30863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
30873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
30883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
30893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
30913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
30923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4)
30933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
30943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator4() {}
30953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
30963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
30973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
30983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin());
30993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
31003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
31013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
31023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end());
31033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
31043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
31053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
31063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
31073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
31083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
31093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
31103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
31113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
31123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
31133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
31143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
31153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
31163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4)
31173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
31183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
31193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
31203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
31213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
31223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
31233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
31253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
31263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
31273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
31283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
31303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
31313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
31323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
31333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current4_;
31343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
31353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
31363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
31373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
31383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
31393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
31403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
31413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
31423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
31433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
31443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
31453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
31463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
31473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
31493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
31503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
31523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
31533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
31543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
31553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
31563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
31573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
31583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
31593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
31603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
31613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
31623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
31633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
31643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
31653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
31663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
31673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
31683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_);
31693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
31713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
31723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
31733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
31743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
31753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
31763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
31773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
31783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
31793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
31803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
31813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
31823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
31833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
31843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
31853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_) {
31863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
31873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
31893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
31903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
31913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
31923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_);
31933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
31943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
31953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
31963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
31973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
31983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
31993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
32003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
32013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_;
32023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
32033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
32053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
32063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
32083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
32093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
32103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
32113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
32123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
32133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
32143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
32153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
32163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
32173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
32183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
32193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
32203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
32213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
32223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
32233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator4::Iterator
32243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
32263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator4& other);
32273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
32293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
32303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
32313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
32323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator4
32333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
32363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator5
32373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
32383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
32393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
32403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
32423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
32433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
32443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
32453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator5() {}
32463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
32483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
32493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
32503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
32513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
32523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
32533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end(), g5_, g5_.end());
32543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
32553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
32573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
32583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
32593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
32603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
32613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
32623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
32633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
32643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
32653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
32663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
32673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4,
32683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T5>& g5,
32693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T5>::iterator& current5)
32703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
32713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
32723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
32733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
32743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
32753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
32763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
32773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
32783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
32793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
32803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
32813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
32823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
32833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
32843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
32853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
32863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
32873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current5_;
32883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current5_ == end5_) {
32893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_ = begin5_;
32903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current4_;
32913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
32923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
32933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
32943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
32953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
32963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
32973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
32983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
32993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
33003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
33013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
33023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
33033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
33043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
33053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
33063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
33073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
33083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
33093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
33103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
33113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
33123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
33133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
33143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
33153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
33163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
33173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
33183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
33193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
33203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
33213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
33223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
33233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
33243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
33253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
33263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_ &&
33273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == typed_other->current5_);
33283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
33293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
33313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
33323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
33333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
33343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
33353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
33363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
33373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
33383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
33393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
33403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
33413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
33423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
33433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
33443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_),
33453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin5_(other.begin5_),
33463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end5_(other.end5_),
33473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_(other.current5_) {
33483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
33493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
33503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
33523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
33533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
33543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_, *current5_);
33553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
33563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
33573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
33583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
33593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
33603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
33613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
33623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
33633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_ ||
33643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == end5_;
33653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
33663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
33683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
33693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
33713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
33723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
33733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
33743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
33753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
33763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
33773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
33783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
33793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
33803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
33813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
33823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
33833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
33843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
33853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator begin5_;
33863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator end5_;
33873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T5>::iterator current5_;
33883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
33893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator5::Iterator
33903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
33923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator5& other);
33933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
33953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
33963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
33973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
33983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T5> g5_;
33993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator5
34003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
34013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
34023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
34033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6>
34043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator6
34053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
34063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T6> > {
34073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
34083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
34093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
34103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
34113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
34123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
34133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6)
34143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
34153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator6() {}
34163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
34173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
34183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
34193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
34203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
34213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
34223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
34233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
34243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
34253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
34263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
34273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
34283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
34293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
34303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
34313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
34323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
34333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
34343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
34353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
34363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
34373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4,
34383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T5>& g5,
34393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T5>::iterator& current5,
34403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6,
34413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T6>::iterator& current6)
34423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
34433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
34443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
34453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
34463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
34473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
34483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
34493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
34503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
34513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
34523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
34533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
34543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
34553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
34563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
34573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
34583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
34593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
34603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current6_;
34613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current6_ == end6_) {
34623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_ = begin6_;
34633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current5_;
34643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
34653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current5_ == end5_) {
34663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_ = begin5_;
34673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current4_;
34683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
34693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
34703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
34713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
34723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
34733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
34743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
34753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
34763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
34773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
34783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
34793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
34803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
34813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
34823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
34833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
34843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
34853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
34863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
34873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
34883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
34893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
34903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
34913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
34923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
34933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
34943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
34953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
34963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
34973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
34983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
34993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
35003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
35013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
35023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
35033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_ &&
35043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == typed_other->current5_ &&
35053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == typed_other->current6_);
35063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
35073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
35093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
35103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
35113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
35123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
35133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
35143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
35153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
35163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
35173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
35183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
35193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
35203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
35213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
35223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_),
35233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin5_(other.begin5_),
35243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end5_(other.end5_),
35253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_(other.current5_),
35263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin6_(other.begin6_),
35273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end6_(other.end6_),
35283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_(other.current6_) {
35293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
35303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
35313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
35333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
35343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
35353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_, *current5_, *current6_);
35363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
35373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
35383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
35393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
35403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
35413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
35423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
35433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
35443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_ ||
35453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == end5_ ||
35463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == end6_;
35473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
35483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
35503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
35513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
35533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
35543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
35553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
35563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
35573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
35583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
35593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
35603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
35613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
35623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
35633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
35643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
35653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
35663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
35673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator begin5_;
35683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator end5_;
35693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T5>::iterator current5_;
35703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator begin6_;
35713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator end6_;
35723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T6>::iterator current6_;
35733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
35743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator6::Iterator
35753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
35773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator6& other);
35783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
35803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
35813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
35823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
35833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T5> g5_;
35843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T6> g6_;
35853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator6
35863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
35893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7>
35903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator7
35913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
35923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T7> > {
35933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
35943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
35953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
35963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
35973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
35983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
35993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
36003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
36013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator7() {}
36023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
36033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
36043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
36053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
36063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g7_.begin());
36073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
36083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
36093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
36103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
36113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
36123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
36133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
36143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
36153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
36163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
36173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
36183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
36193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
36203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
36213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
36223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
36233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
36243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4,
36253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T5>& g5,
36263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T5>::iterator& current5,
36273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6,
36283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T6>::iterator& current6,
36293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T7>& g7,
36303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T7>::iterator& current7)
36313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
36323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
36333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
36343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
36353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
36363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
36373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
36383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
36393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
36403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
36413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
36423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
36433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
36443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
36453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
36463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
36473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
36483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
36493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
36503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current7_;
36513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current7_ == end7_) {
36523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_ = begin7_;
36533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current6_;
36543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
36553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current6_ == end6_) {
36563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_ = begin6_;
36573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current5_;
36583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
36593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current5_ == end5_) {
36603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_ = begin5_;
36613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current4_;
36623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
36633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
36643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
36653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
36663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
36673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
36683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
36693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
36703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
36713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
36723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
36733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
36743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
36753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
36763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
36773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
36783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
36793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
36803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
36813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
36823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
36833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
36843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
36853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
36863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
36873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
36883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
36893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
36903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
36913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
36923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
36933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
36943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
36953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
36963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
36973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_ &&
36983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == typed_other->current5_ &&
36993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == typed_other->current6_ &&
37003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == typed_other->current7_);
37013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
37023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
37043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
37053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
37063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
37073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
37083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
37093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
37103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
37113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
37123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
37133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
37143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
37153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
37163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
37173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_),
37183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin5_(other.begin5_),
37193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end5_(other.end5_),
37203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_(other.current5_),
37213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin6_(other.begin6_),
37223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end6_(other.end6_),
37233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_(other.current6_),
37243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin7_(other.begin7_),
37253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end7_(other.end7_),
37263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_(other.current7_) {
37273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
37283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
37293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
37313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
37323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
37333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_, *current5_, *current6_, *current7_);
37343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
37353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
37363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
37373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
37383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
37393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
37403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
37413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
37423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_ ||
37433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == end5_ ||
37443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == end6_ ||
37453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == end7_;
37463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
37473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
37493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
37503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
37523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
37533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
37543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
37553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
37563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
37573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
37583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
37593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
37603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
37613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
37623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
37633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
37643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
37653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
37663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator begin5_;
37673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator end5_;
37683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T5>::iterator current5_;
37693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator begin6_;
37703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator end6_;
37713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T6>::iterator current6_;
37723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator begin7_;
37733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator end7_;
37743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T7>::iterator current7_;
37753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
37763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator7::Iterator
37773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
37793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator7& other);
37803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
37823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
37833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
37843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
37853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T5> g5_;
37863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T6> g6_;
37873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T7> g7_;
37883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator7
37893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
37923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8>
37933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator8
37943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
37953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T7, T8> > {
37963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
37973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
37983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
37993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
38003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
38013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
38023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
38033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T8>& g8)
38043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
38053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          g8_(g8) {}
38063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator8() {}
38073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
38083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
38093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
38103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
38113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g7_.begin(), g8_, g8_.begin());
38123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
38133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
38143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
38153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
38163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g8_.end());
38173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
38183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
38193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
38203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
38213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
38223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
38233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
38243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
38253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
38263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
38273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
38283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
38293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
38303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4,
38313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T5>& g5,
38323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T5>::iterator& current5,
38333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6,
38343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T6>::iterator& current6,
38353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T7>& g7,
38363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T7>::iterator& current7,
38373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T8>& g8,
38383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T8>::iterator& current8)
38393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
38403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
38413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
38423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
38433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
38443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
38453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
38463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
38473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
38483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
38493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
38503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
38513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
38523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
38533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
38543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
38553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
38563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
38573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
38583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
38593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current8_;
38603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current8_ == end8_) {
38613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current8_ = begin8_;
38623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current7_;
38633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current7_ == end7_) {
38653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_ = begin7_;
38663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current6_;
38673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current6_ == end6_) {
38693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_ = begin6_;
38703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current5_;
38713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current5_ == end5_) {
38733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_ = begin5_;
38743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current4_;
38753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
38773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
38783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
38793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
38813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
38823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
38833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
38853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
38863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
38873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
38883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
38893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
38903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
38913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
38923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
38933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
38943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
38953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
38963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
38973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
38983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
38993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
39003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
39013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
39023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
39033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
39043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
39053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
39063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
39073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
39083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
39093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
39103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_ &&
39113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == typed_other->current5_ &&
39123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == typed_other->current6_ &&
39133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == typed_other->current7_ &&
39143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current8_ == typed_other->current8_);
39153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
39163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
39173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
39183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
39193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
39203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
39213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
39223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
39233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
39243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
39253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
39263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
39273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
39283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
39293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
39303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
39313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_),
39323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin5_(other.begin5_),
39333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end5_(other.end5_),
39343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_(other.current5_),
39353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin6_(other.begin6_),
39363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end6_(other.end6_),
39373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_(other.current6_),
39383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin7_(other.begin7_),
39393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end7_(other.end7_),
39403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_(other.current7_),
39413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin8_(other.begin8_),
39423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end8_(other.end8_),
39433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current8_(other.current8_) {
39443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
39453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
39463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
39473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
39483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
39493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
39503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_, *current5_, *current6_, *current7_, *current8_);
39513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
39523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
39533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
39543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
39553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
39563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
39573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
39583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
39593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_ ||
39603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == end5_ ||
39613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == end6_ ||
39623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == end7_ ||
39633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current8_ == end8_;
39643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
39653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
39663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
39673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
39683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
39693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
39703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
39713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
39723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
39733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
39743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
39753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
39763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
39773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
39783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
39793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
39803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
39813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
39823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
39833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
39843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator begin5_;
39853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator end5_;
39863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T5>::iterator current5_;
39873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator begin6_;
39883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator end6_;
39893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T6>::iterator current6_;
39903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator begin7_;
39913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator end7_;
39923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T7>::iterator current7_;
39933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T8>::iterator begin8_;
39943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T8>::iterator end8_;
39953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T8>::iterator current8_;
39963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
39973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator8::Iterator
39983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
39993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
40003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator8& other);
40013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
40033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
40043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
40053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
40063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T5> g5_;
40073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T6> g6_;
40083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T7> g7_;
40093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T8> g8_;
40103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator8
40113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9>
40153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator9
40163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
40173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T7, T8, T9> > {
40183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
40193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
40203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
40223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
40233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
40243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
40253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
40263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
40273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          g9_(g9) {}
40283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator9() {}
40293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
40313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
40323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
40333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
40343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
40353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
40363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
40373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
40383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g8_.end(), g9_, g9_.end());
40393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
40403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
40423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
40433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
40443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
40453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
40463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
40473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
40483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
40493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
40503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
40513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
40523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4,
40533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T5>& g5,
40543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T5>::iterator& current5,
40553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6,
40563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T6>::iterator& current6,
40573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T7>& g7,
40583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T7>::iterator& current7,
40593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T8>& g8,
40603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T8>::iterator& current8,
40613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T9>& g9,
40623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T9>::iterator& current9)
40633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
40643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
40653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
40663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
40673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
40683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
40693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
40703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
40713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
40723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
40733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
40743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
40753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
40763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
40773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
40783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
40793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
40803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
40813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
40823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
40833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
40843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current9_;
40853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current9_ == end9_) {
40863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current9_ = begin9_;
40873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current8_;
40883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
40893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current8_ == end8_) {
40903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current8_ = begin8_;
40913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current7_;
40923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
40933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current7_ == end7_) {
40943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_ = begin7_;
40953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current6_;
40963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
40973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current6_ == end6_) {
40983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_ = begin6_;
40993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current5_;
41003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
41013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current5_ == end5_) {
41023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_ = begin5_;
41033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current4_;
41043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
41053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
41063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
41073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
41083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
41093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
41103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
41113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
41123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
41133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
41143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
41153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
41163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
41173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
41183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
41193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
41203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
41213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
41223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
41233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
41243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
41253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
41263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
41273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
41283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
41293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
41303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
41313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
41323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
41333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
41343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
41353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
41363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
41373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
41383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
41393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_ &&
41403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == typed_other->current5_ &&
41413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == typed_other->current6_ &&
41423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == typed_other->current7_ &&
41433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current8_ == typed_other->current8_ &&
41443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current9_ == typed_other->current9_);
41453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
41463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
41473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
41483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
41493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
41503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
41513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
41523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
41533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
41543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
41553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
41563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
41573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
41583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
41593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
41603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
41613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_),
41623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin5_(other.begin5_),
41633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end5_(other.end5_),
41643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_(other.current5_),
41653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin6_(other.begin6_),
41663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end6_(other.end6_),
41673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_(other.current6_),
41683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin7_(other.begin7_),
41693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end7_(other.end7_),
41703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_(other.current7_),
41713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin8_(other.begin8_),
41723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end8_(other.end8_),
41733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current8_(other.current8_),
41743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin9_(other.begin9_),
41753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end9_(other.end9_),
41763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current9_(other.current9_) {
41773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
41783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
41793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
41803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
41813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
41823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
41833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_, *current5_, *current6_, *current7_, *current8_,
41843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current9_);
41853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
41863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
41873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
41883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
41893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
41903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
41913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
41923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
41933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_ ||
41943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == end5_ ||
41953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == end6_ ||
41963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == end7_ ||
41973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current8_ == end8_ ||
41983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current9_ == end9_;
41993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
42003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
42023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
42033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
42053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
42063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
42073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
42083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
42093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
42103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
42113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
42123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
42133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
42143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
42153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
42163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
42173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
42183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
42193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator begin5_;
42203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator end5_;
42213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T5>::iterator current5_;
42223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator begin6_;
42233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator end6_;
42243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T6>::iterator current6_;
42253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator begin7_;
42263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator end7_;
42273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T7>::iterator current7_;
42283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T8>::iterator begin8_;
42293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T8>::iterator end8_;
42303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T8>::iterator current8_;
42313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T9>::iterator begin9_;
42323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T9>::iterator end9_;
42333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T9>::iterator current9_;
42343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
42353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator9::Iterator
42363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
42383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator9& other);
42393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
42413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
42423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
42433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
42443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T5> g5_;
42453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T6> g6_;
42463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T7> g7_;
42473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T8> g8_;
42483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T9> g9_;
42493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator9
42503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6, typename T7, typename T8, typename T9, typename T10>
42543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductGenerator10
42553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
42563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T7, T8, T9, T10> > {
42573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
42583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
42593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
42613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
42623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
42633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
42643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
42653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T10>& g10)
42663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
42673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          g9_(g9), g10_(g10) {}
42683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~CartesianProductGenerator10() {}
42693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* Begin() const {
42713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
42723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
42733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
42743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
42753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ParamIteratorInterface<ParamType>* End() const {
42763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
42773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
42783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
42793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
42803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
42813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
42823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  class Iterator : public ParamIteratorInterface<ParamType> {
42833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   public:
42843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const ParamGeneratorInterface<ParamType>* base,
42853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T1>& g1,
42863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T1>::iterator& current1,
42873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T2>& g2,
42883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T2>::iterator& current2,
42893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T3>& g3,
42903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T3>::iterator& current3,
42913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T4>& g4,
42923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T4>::iterator& current4,
42933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T5>& g5,
42943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T5>::iterator& current5,
42953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T6>& g6,
42963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T6>::iterator& current6,
42973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T7>& g7,
42983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T7>::iterator& current7,
42993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T8>& g8,
43003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T8>::iterator& current8,
43013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T9>& g9,
43023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T9>::iterator& current9,
43033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const ParamGenerator<T10>& g10,
43043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const typename ParamGenerator<T10>::iterator& current10)
43053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(base),
43063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
43073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
43083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
43093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
43103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
43113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
43123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
43133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
43143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
43153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
43163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
43173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
43183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ~Iterator() {}
43193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
43203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
43213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return base_;
43223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
43233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // Advance should not be called on beyond-of-range iterators
43243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // so no component iterators must be beyond end of range, either.
43253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual void Advance() {
43263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      assert(!AtEnd());
43273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ++current10_;
43283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current10_ == end10_) {
43293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current10_ = begin10_;
43303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current9_;
43313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current9_ == end9_) {
43333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current9_ = begin9_;
43343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current8_;
43353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current8_ == end8_) {
43373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current8_ = begin8_;
43383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current7_;
43393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current7_ == end7_) {
43413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_ = begin7_;
43423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current6_;
43433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current6_ == end6_) {
43453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_ = begin6_;
43463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current5_;
43473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current5_ == end5_) {
43493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_ = begin5_;
43503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current4_;
43513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current4_ == end4_) {
43533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_ = begin4_;
43543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current3_;
43553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current3_ == end3_) {
43573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_ = begin3_;
43583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current2_;
43593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (current2_ == end2_) {
43613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_ = begin2_;
43623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ++current1_;
43633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      }
43643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
43653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
43663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual ParamIteratorInterface<ParamType>* Clone() const {
43673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return new Iterator(*this);
43683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
43693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual const ParamType* Current() const { return &current_value_; }
43703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
43713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // Having the same base generator guarantees that the other
43723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // iterator is of the same type and we can downcast.
43733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
43743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "The program attempted to compare iterators "
43753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          << "from different generators." << std::endl;
43763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      const Iterator* typed_other =
43773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          CheckedDowncastToActualType<const Iterator>(&other);
43783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterators equal if they both point beyond their
43793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // respective ranges. That can happen in a variety of fashions,
43803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // so we have to consult AtEnd().
43813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return (AtEnd() && typed_other->AtEnd()) ||
43823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick         (
43833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == typed_other->current1_ &&
43843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == typed_other->current2_ &&
43853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == typed_other->current3_ &&
43863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == typed_other->current4_ &&
43873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == typed_other->current5_ &&
43883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == typed_other->current6_ &&
43893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == typed_other->current7_ &&
43903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current8_ == typed_other->current8_ &&
43913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current9_ == typed_other->current9_ &&
43923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current10_ == typed_other->current10_);
43933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
43943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
43953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
43963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    Iterator(const Iterator& other)
43973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        : base_(other.base_),
43983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin1_(other.begin1_),
43993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end1_(other.end1_),
44003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current1_(other.current1_),
44013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin2_(other.begin2_),
44023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end2_(other.end2_),
44033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current2_(other.current2_),
44043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin3_(other.begin3_),
44053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end3_(other.end3_),
44063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current3_(other.current3_),
44073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin4_(other.begin4_),
44083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end4_(other.end4_),
44093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current4_(other.current4_),
44103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin5_(other.begin5_),
44113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end5_(other.end5_),
44123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current5_(other.current5_),
44133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin6_(other.begin6_),
44143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end6_(other.end6_),
44153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current6_(other.current6_),
44163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin7_(other.begin7_),
44173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end7_(other.end7_),
44183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current7_(other.current7_),
44193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin8_(other.begin8_),
44203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end8_(other.end8_),
44213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current8_(other.current8_),
44223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin9_(other.begin9_),
44233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end9_(other.end9_),
44243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current9_(other.current9_),
44253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        begin10_(other.begin10_),
44263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        end10_(other.end10_),
44273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current10_(other.current10_) {
44283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      ComputeCurrentValue();
44293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
44303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
44313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void ComputeCurrentValue() {
44323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      if (!AtEnd())
44333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        current_value_ = ParamType(*current1_, *current2_, *current3_,
44343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current4_, *current5_, *current6_, *current7_, *current8_,
44353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            *current9_, *current10_);
44363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
44373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    bool AtEnd() const {
44383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // We must report iterator past the end of the range when either of the
44393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      // component iterators has reached the end of its range.
44403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      return
44413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current1_ == end1_ ||
44423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current2_ == end2_ ||
44433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current3_ == end3_ ||
44443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current4_ == end4_ ||
44453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current5_ == end5_ ||
44463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current6_ == end6_ ||
44473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current7_ == end7_ ||
44483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current8_ == end8_ ||
44493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current9_ == end9_ ||
44503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          current10_ == end10_;
44513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    }
44523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
44533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // No implementation - assignment is unsupported.
44543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void operator=(const Iterator& other);
44553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
44563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const ParamGeneratorInterface<ParamType>* const base_;
44573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
44583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    // current[i]_ is the actual traversing iterator.
44593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator begin1_;
44603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T1>::iterator end1_;
44613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T1>::iterator current1_;
44623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator begin2_;
44633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T2>::iterator end2_;
44643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T2>::iterator current2_;
44653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator begin3_;
44663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T3>::iterator end3_;
44673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T3>::iterator current3_;
44683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator begin4_;
44693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T4>::iterator end4_;
44703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T4>::iterator current4_;
44713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator begin5_;
44723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T5>::iterator end5_;
44733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T5>::iterator current5_;
44743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator begin6_;
44753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T6>::iterator end6_;
44763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T6>::iterator current6_;
44773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator begin7_;
44783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T7>::iterator end7_;
44793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T7>::iterator current7_;
44803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T8>::iterator begin8_;
44813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T8>::iterator end8_;
44823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T8>::iterator current8_;
44833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T9>::iterator begin9_;
44843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T9>::iterator end9_;
44853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T9>::iterator current9_;
44863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T10>::iterator begin10_;
44873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const typename ParamGenerator<T10>::iterator end10_;
44883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename ParamGenerator<T10>::iterator current10_;
44893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    ParamType current_value_;
44903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };  // class CartesianProductGenerator10::Iterator
44913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
44923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
44933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductGenerator10& other);
44943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
44953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T1> g1_;
44963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T2> g2_;
44973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T3> g3_;
44983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T4> g4_;
44993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T5> g5_;
45003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T6> g6_;
45013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T7> g7_;
45023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T8> g8_;
45033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T9> g9_;
45043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const ParamGenerator<T10> g10_;
45053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductGenerator10
45063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
45093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
45103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Helper classes providing Combine() with polymorphic features. They allow
45113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
45123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// convertible to U.
45133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
45143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2>
45153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder2 {
45163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
45173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
45183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2) {}
45193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2>
45203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
45213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
45223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator2<T1, T2>(
45233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
45243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_)));
45253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
45263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
45283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
45293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder2& other);
45303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
45323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
45333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder2
45343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3>
45363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder3 {
45373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
45383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
45393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3)
45403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3) {}
45413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3>
45423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
45433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
45443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator3<T1, T2, T3>(
45453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
45463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
45473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_)));
45483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
45493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
45513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
45523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder3& other);
45533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
45553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
45563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
45573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder3
45583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
45603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4>
45613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder4 {
45623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
45633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
45643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4)
45653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
45663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4>
45673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
45683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
45693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator4<T1, T2, T3, T4>(
45703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
45713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
45723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
45733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_)));
45743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
45753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
45773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
45783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder4& other);
45793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
45813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
45823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
45833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
45843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder4
45853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
45863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
45873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4, class Generator5>
45883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder5 {
45893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
45903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
45913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4, const Generator5& g5)
45923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
45933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4, typename T5>
45943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
45953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
45963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
45973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
45983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
45993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
46003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_),
46013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T5> >(g5_)));
46023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
46033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
46053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
46063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder5& other);
46073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
46093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
46103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
46113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
46123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator5 g5_;
46133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder5
46143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
46163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4, class Generator5, class Generator6>
46173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder6 {
46183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
46193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
46203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4, const Generator5& g5,
46213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator6& g6)
46223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
46233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4, typename T5,
46243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      typename T6>
46253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
46263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
46273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
46283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
46293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
46303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
46313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_),
46323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T5> >(g5_),
46333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T6> >(g6_)));
46343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
46353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
46373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
46383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder6& other);
46393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
46413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
46423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
46433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
46443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator5 g5_;
46453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator6 g6_;
46463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder6
46473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
46493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4, class Generator5, class Generator6, class Generator7>
46503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder7 {
46513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
46523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
46533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4, const Generator5& g5,
46543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator6& g6, const Generator7& g7)
46553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
46563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4, typename T5,
46573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      typename T6, typename T7>
46583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
46593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T7> >() const {
46603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
46613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
46623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
46633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
46643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
46653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_),
46663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T5> >(g5_),
46673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T6> >(g6_),
46683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T7> >(g7_)));
46693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
46703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
46723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
46733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder7& other);
46743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
46763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
46773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
46783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
46793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator5 g5_;
46803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator6 g6_;
46813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator7 g7_;
46823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder7
46833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
46843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
46853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4, class Generator5, class Generator6, class Generator7,
46863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator8>
46873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder8 {
46883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
46893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
46903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4, const Generator5& g5,
46913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator6& g6, const Generator7& g7, const Generator8& g8)
46923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
46933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          g8_(g8) {}
46943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4, typename T5,
46953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      typename T6, typename T7, typename T8>
46963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
46973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T8> >() const {
46983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
46993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
47003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
47013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
47023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
47033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_),
47043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T5> >(g5_),
47053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T6> >(g6_),
47063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T7> >(g7_),
47073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T8> >(g8_)));
47083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
47093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
47113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
47123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder8& other);
47133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
47153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
47163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
47173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
47183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator5 g5_;
47193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator6 g6_;
47203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator7 g7_;
47213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator8 g8_;
47223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder8
47233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
47253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4, class Generator5, class Generator6, class Generator7,
47263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator8, class Generator9>
47273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder9 {
47283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
47293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
47303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4, const Generator5& g5,
47313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator6& g6, const Generator7& g7, const Generator8& g8,
47323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator9& g9)
47333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
47343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          g9_(g9) {}
47353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4, typename T5,
47363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      typename T6, typename T7, typename T8, typename T9>
47373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
47383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T9> >() const {
47393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
47403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T9> >(
47413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
47423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
47433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
47443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
47453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_),
47463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T5> >(g5_),
47473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T6> >(g6_),
47483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T7> >(g7_),
47493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T8> >(g8_),
47503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T9> >(g9_)));
47513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
47523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
47543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
47553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder9& other);
47563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
47583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
47593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
47603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
47613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator5 g5_;
47623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator6 g6_;
47633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator7 g7_;
47643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator8 g8_;
47653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator9 g9_;
47663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder9
47673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <class Generator1, class Generator2, class Generator3,
47693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator4, class Generator5, class Generator6, class Generator7,
47703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    class Generator8, class Generator9, class Generator10>
47713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass CartesianProductHolder10 {
47723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
47733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
47743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator3& g3, const Generator4& g4, const Generator5& g5,
47753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator6& g6, const Generator7& g7, const Generator8& g8,
47763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const Generator9& g9, const Generator10& g10)
47773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
47783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick          g9_(g9), g10_(g10) {}
47793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename T1, typename T2, typename T3, typename T4, typename T5,
47803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      typename T6, typename T7, typename T8, typename T9, typename T10>
47813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
47823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      T9, T10> >() const {
47833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
47843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        T9, T10> >(
47853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
47863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick            T10>(
47873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T1> >(g1_),
47883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T2> >(g2_),
47893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T3> >(g3_),
47903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T4> >(g4_),
47913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T5> >(g5_),
47923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T6> >(g6_),
47933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T7> >(g7_),
47943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T8> >(g8_),
47953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T9> >(g9_),
47963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        static_cast<ParamGenerator<T10> >(g10_)));
47973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
47983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
47993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
48003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // No implementation - assignment is unsupported.
48013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void operator=(const CartesianProductHolder10& other);
48023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
48033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator1 g1_;
48043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator2 g2_;
48053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator3 g3_;
48063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator4 g4_;
48073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator5 g5_;
48083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator6 g6_;
48093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator7 g7_;
48103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator8 g8_;
48113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator9 g9_;
48123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const Generator10 g10_;
48133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};  // class CartesianProductHolder10
48143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
48153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# endif  // GTEST_HAS_COMBINE
48163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
48173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace internal
48183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace testing
48193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
48203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  //  GTEST_HAS_PARAM_TEST
48213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
48223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
4823