113481Sgiacomo.travaglini@arm.com// This file was GENERATED by command:
213481Sgiacomo.travaglini@arm.com//     pump.py gtest-param-util-generated.h.pump
313481Sgiacomo.travaglini@arm.com// DO NOT EDIT BY HAND!!!
413481Sgiacomo.travaglini@arm.com
513481Sgiacomo.travaglini@arm.com// Copyright 2008 Google Inc.
613481Sgiacomo.travaglini@arm.com// All Rights Reserved.
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
913481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
1013481Sgiacomo.travaglini@arm.com// met:
1113481Sgiacomo.travaglini@arm.com//
1213481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
1313481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1413481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1513481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1613481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1713481Sgiacomo.travaglini@arm.com// distribution.
1813481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1913481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
2013481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
2113481Sgiacomo.travaglini@arm.com//
2213481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2313481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2513481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2613481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2713481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2813481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2913481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3013481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3113481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3213481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// Author: vladl@google.com (Vlad Losev)
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com// Type and function utilities for implementing parameterized tests.
3713481Sgiacomo.travaglini@arm.com// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
3813481Sgiacomo.travaglini@arm.com//
3913481Sgiacomo.travaglini@arm.com// Currently Google Test supports at most 50 arguments in Values,
4013481Sgiacomo.travaglini@arm.com// and at most 10 arguments in Combine. Please contact
4113481Sgiacomo.travaglini@arm.com// googletestframework@googlegroups.com if you need more.
4213481Sgiacomo.travaglini@arm.com// Please note that the number of arguments to Combine is limited
4313481Sgiacomo.travaglini@arm.com// by the maximum arity of the implementation of tuple which is
4413481Sgiacomo.travaglini@arm.com// currently set at 10.
4513481Sgiacomo.travaglini@arm.com
4613481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
4713481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
4813481Sgiacomo.travaglini@arm.com
4913481Sgiacomo.travaglini@arm.com// scripts/fuse_gtest.py depends on gtest's own header being #included
5013481Sgiacomo.travaglini@arm.com// *unconditionally*.  Therefore these #includes cannot be moved
5113481Sgiacomo.travaglini@arm.com// inside #if GTEST_HAS_PARAM_TEST.
5213481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-param-util.h"
5313481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-port.h"
5413481Sgiacomo.travaglini@arm.com
5513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
5613481Sgiacomo.travaglini@arm.com
5713481Sgiacomo.travaglini@arm.comnamespace testing {
5813481Sgiacomo.travaglini@arm.com
5913481Sgiacomo.travaglini@arm.com// Forward declarations of ValuesIn(), which is implemented in
6013481Sgiacomo.travaglini@arm.com// include/gtest/gtest-param-test.h.
6113481Sgiacomo.travaglini@arm.comtemplate <typename ForwardIterator>
6213481Sgiacomo.travaglini@arm.cominternal::ParamGenerator<
6313481Sgiacomo.travaglini@arm.com  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
6413481Sgiacomo.travaglini@arm.comValuesIn(ForwardIterator begin, ForwardIterator end);
6513481Sgiacomo.travaglini@arm.com
6613481Sgiacomo.travaglini@arm.comtemplate <typename T, size_t N>
6713481Sgiacomo.travaglini@arm.cominternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.comtemplate <class Container>
7013481Sgiacomo.travaglini@arm.cominternal::ParamGenerator<typename Container::value_type> ValuesIn(
7113481Sgiacomo.travaglini@arm.com    const Container& container);
7213481Sgiacomo.travaglini@arm.com
7313481Sgiacomo.travaglini@arm.comnamespace internal {
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com// Used in the Values() function to provide polymorphic capabilities.
7613481Sgiacomo.travaglini@arm.comtemplate <typename T1>
7713481Sgiacomo.travaglini@arm.comclass ValueArray1 {
7813481Sgiacomo.travaglini@arm.com public:
7913481Sgiacomo.travaglini@arm.com  explicit ValueArray1(T1 v1) : v1_(v1) {}
8013481Sgiacomo.travaglini@arm.com
8113481Sgiacomo.travaglini@arm.com  template <typename T>
8213481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
8313481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_)};
8413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
8513481Sgiacomo.travaglini@arm.com  }
8613481Sgiacomo.travaglini@arm.com
8713481Sgiacomo.travaglini@arm.com private:
8813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
8913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray1& other);
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.com  const T1 v1_;
9213481Sgiacomo.travaglini@arm.com};
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
9513481Sgiacomo.travaglini@arm.comclass ValueArray2 {
9613481Sgiacomo.travaglini@arm.com public:
9713481Sgiacomo.travaglini@arm.com  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
9813481Sgiacomo.travaglini@arm.com
9913481Sgiacomo.travaglini@arm.com  template <typename T>
10013481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
10113481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
10213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
10313481Sgiacomo.travaglini@arm.com  }
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.com private:
10613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
10713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray2& other);
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com  const T1 v1_;
11013481Sgiacomo.travaglini@arm.com  const T2 v2_;
11113481Sgiacomo.travaglini@arm.com};
11213481Sgiacomo.travaglini@arm.com
11313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3>
11413481Sgiacomo.travaglini@arm.comclass ValueArray3 {
11513481Sgiacomo.travaglini@arm.com public:
11613481Sgiacomo.travaglini@arm.com  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com  template <typename T>
11913481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
12013481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12113481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_)};
12213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
12313481Sgiacomo.travaglini@arm.com  }
12413481Sgiacomo.travaglini@arm.com
12513481Sgiacomo.travaglini@arm.com private:
12613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
12713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray3& other);
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com  const T1 v1_;
13013481Sgiacomo.travaglini@arm.com  const T2 v2_;
13113481Sgiacomo.travaglini@arm.com  const T3 v3_;
13213481Sgiacomo.travaglini@arm.com};
13313481Sgiacomo.travaglini@arm.com
13413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4>
13513481Sgiacomo.travaglini@arm.comclass ValueArray4 {
13613481Sgiacomo.travaglini@arm.com public:
13713481Sgiacomo.travaglini@arm.com  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
13813481Sgiacomo.travaglini@arm.com      v4_(v4) {}
13913481Sgiacomo.travaglini@arm.com
14013481Sgiacomo.travaglini@arm.com  template <typename T>
14113481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
14213481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
14313481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_)};
14413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
14513481Sgiacomo.travaglini@arm.com  }
14613481Sgiacomo.travaglini@arm.com
14713481Sgiacomo.travaglini@arm.com private:
14813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
14913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray4& other);
15013481Sgiacomo.travaglini@arm.com
15113481Sgiacomo.travaglini@arm.com  const T1 v1_;
15213481Sgiacomo.travaglini@arm.com  const T2 v2_;
15313481Sgiacomo.travaglini@arm.com  const T3 v3_;
15413481Sgiacomo.travaglini@arm.com  const T4 v4_;
15513481Sgiacomo.travaglini@arm.com};
15613481Sgiacomo.travaglini@arm.com
15713481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
15813481Sgiacomo.travaglini@arm.comclass ValueArray5 {
15913481Sgiacomo.travaglini@arm.com public:
16013481Sgiacomo.travaglini@arm.com  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
16113481Sgiacomo.travaglini@arm.com      v4_(v4), v5_(v5) {}
16213481Sgiacomo.travaglini@arm.com
16313481Sgiacomo.travaglini@arm.com  template <typename T>
16413481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
16513481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
16613481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
16713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
16813481Sgiacomo.travaglini@arm.com  }
16913481Sgiacomo.travaglini@arm.com
17013481Sgiacomo.travaglini@arm.com private:
17113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
17213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray5& other);
17313481Sgiacomo.travaglini@arm.com
17413481Sgiacomo.travaglini@arm.com  const T1 v1_;
17513481Sgiacomo.travaglini@arm.com  const T2 v2_;
17613481Sgiacomo.travaglini@arm.com  const T3 v3_;
17713481Sgiacomo.travaglini@arm.com  const T4 v4_;
17813481Sgiacomo.travaglini@arm.com  const T5 v5_;
17913481Sgiacomo.travaglini@arm.com};
18013481Sgiacomo.travaglini@arm.com
18113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
18213481Sgiacomo.travaglini@arm.com    typename T6>
18313481Sgiacomo.travaglini@arm.comclass ValueArray6 {
18413481Sgiacomo.travaglini@arm.com public:
18513481Sgiacomo.travaglini@arm.com  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
18613481Sgiacomo.travaglini@arm.com      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
18713481Sgiacomo.travaglini@arm.com
18813481Sgiacomo.travaglini@arm.com  template <typename T>
18913481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
19013481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
19113481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
19213481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_)};
19313481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
19413481Sgiacomo.travaglini@arm.com  }
19513481Sgiacomo.travaglini@arm.com
19613481Sgiacomo.travaglini@arm.com private:
19713481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
19813481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray6& other);
19913481Sgiacomo.travaglini@arm.com
20013481Sgiacomo.travaglini@arm.com  const T1 v1_;
20113481Sgiacomo.travaglini@arm.com  const T2 v2_;
20213481Sgiacomo.travaglini@arm.com  const T3 v3_;
20313481Sgiacomo.travaglini@arm.com  const T4 v4_;
20413481Sgiacomo.travaglini@arm.com  const T5 v5_;
20513481Sgiacomo.travaglini@arm.com  const T6 v6_;
20613481Sgiacomo.travaglini@arm.com};
20713481Sgiacomo.travaglini@arm.com
20813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
20913481Sgiacomo.travaglini@arm.com    typename T6, typename T7>
21013481Sgiacomo.travaglini@arm.comclass ValueArray7 {
21113481Sgiacomo.travaglini@arm.com public:
21213481Sgiacomo.travaglini@arm.com  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
21313481Sgiacomo.travaglini@arm.com      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com  template <typename T>
21613481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
21713481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
21813481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
21913481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_)};
22013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
22113481Sgiacomo.travaglini@arm.com  }
22213481Sgiacomo.travaglini@arm.com
22313481Sgiacomo.travaglini@arm.com private:
22413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
22513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray7& other);
22613481Sgiacomo.travaglini@arm.com
22713481Sgiacomo.travaglini@arm.com  const T1 v1_;
22813481Sgiacomo.travaglini@arm.com  const T2 v2_;
22913481Sgiacomo.travaglini@arm.com  const T3 v3_;
23013481Sgiacomo.travaglini@arm.com  const T4 v4_;
23113481Sgiacomo.travaglini@arm.com  const T5 v5_;
23213481Sgiacomo.travaglini@arm.com  const T6 v6_;
23313481Sgiacomo.travaglini@arm.com  const T7 v7_;
23413481Sgiacomo.travaglini@arm.com};
23513481Sgiacomo.travaglini@arm.com
23613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
23713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8>
23813481Sgiacomo.travaglini@arm.comclass ValueArray8 {
23913481Sgiacomo.travaglini@arm.com public:
24013481Sgiacomo.travaglini@arm.com  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
24113481Sgiacomo.travaglini@arm.com      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
24213481Sgiacomo.travaglini@arm.com      v8_(v8) {}
24313481Sgiacomo.travaglini@arm.com
24413481Sgiacomo.travaglini@arm.com  template <typename T>
24513481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
24613481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
24713481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
24813481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
24913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
25013481Sgiacomo.travaglini@arm.com  }
25113481Sgiacomo.travaglini@arm.com
25213481Sgiacomo.travaglini@arm.com private:
25313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
25413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray8& other);
25513481Sgiacomo.travaglini@arm.com
25613481Sgiacomo.travaglini@arm.com  const T1 v1_;
25713481Sgiacomo.travaglini@arm.com  const T2 v2_;
25813481Sgiacomo.travaglini@arm.com  const T3 v3_;
25913481Sgiacomo.travaglini@arm.com  const T4 v4_;
26013481Sgiacomo.travaglini@arm.com  const T5 v5_;
26113481Sgiacomo.travaglini@arm.com  const T6 v6_;
26213481Sgiacomo.travaglini@arm.com  const T7 v7_;
26313481Sgiacomo.travaglini@arm.com  const T8 v8_;
26413481Sgiacomo.travaglini@arm.com};
26513481Sgiacomo.travaglini@arm.com
26613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
26713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9>
26813481Sgiacomo.travaglini@arm.comclass ValueArray9 {
26913481Sgiacomo.travaglini@arm.com public:
27013481Sgiacomo.travaglini@arm.com  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
27113481Sgiacomo.travaglini@arm.com      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
27213481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9) {}
27313481Sgiacomo.travaglini@arm.com
27413481Sgiacomo.travaglini@arm.com  template <typename T>
27513481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
27613481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
27713481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
27813481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
27913481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_)};
28013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
28113481Sgiacomo.travaglini@arm.com  }
28213481Sgiacomo.travaglini@arm.com
28313481Sgiacomo.travaglini@arm.com private:
28413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
28513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray9& other);
28613481Sgiacomo.travaglini@arm.com
28713481Sgiacomo.travaglini@arm.com  const T1 v1_;
28813481Sgiacomo.travaglini@arm.com  const T2 v2_;
28913481Sgiacomo.travaglini@arm.com  const T3 v3_;
29013481Sgiacomo.travaglini@arm.com  const T4 v4_;
29113481Sgiacomo.travaglini@arm.com  const T5 v5_;
29213481Sgiacomo.travaglini@arm.com  const T6 v6_;
29313481Sgiacomo.travaglini@arm.com  const T7 v7_;
29413481Sgiacomo.travaglini@arm.com  const T8 v8_;
29513481Sgiacomo.travaglini@arm.com  const T9 v9_;
29613481Sgiacomo.travaglini@arm.com};
29713481Sgiacomo.travaglini@arm.com
29813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
29913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10>
30013481Sgiacomo.travaglini@arm.comclass ValueArray10 {
30113481Sgiacomo.travaglini@arm.com public:
30213481Sgiacomo.travaglini@arm.com  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
30313481Sgiacomo.travaglini@arm.com      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
30413481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10) {}
30513481Sgiacomo.travaglini@arm.com
30613481Sgiacomo.travaglini@arm.com  template <typename T>
30713481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
30813481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
30913481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
31013481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
31113481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_)};
31213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
31313481Sgiacomo.travaglini@arm.com  }
31413481Sgiacomo.travaglini@arm.com
31513481Sgiacomo.travaglini@arm.com private:
31613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
31713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray10& other);
31813481Sgiacomo.travaglini@arm.com
31913481Sgiacomo.travaglini@arm.com  const T1 v1_;
32013481Sgiacomo.travaglini@arm.com  const T2 v2_;
32113481Sgiacomo.travaglini@arm.com  const T3 v3_;
32213481Sgiacomo.travaglini@arm.com  const T4 v4_;
32313481Sgiacomo.travaglini@arm.com  const T5 v5_;
32413481Sgiacomo.travaglini@arm.com  const T6 v6_;
32513481Sgiacomo.travaglini@arm.com  const T7 v7_;
32613481Sgiacomo.travaglini@arm.com  const T8 v8_;
32713481Sgiacomo.travaglini@arm.com  const T9 v9_;
32813481Sgiacomo.travaglini@arm.com  const T10 v10_;
32913481Sgiacomo.travaglini@arm.com};
33013481Sgiacomo.travaglini@arm.com
33113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
33213481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
33313481Sgiacomo.travaglini@arm.com    typename T11>
33413481Sgiacomo.travaglini@arm.comclass ValueArray11 {
33513481Sgiacomo.travaglini@arm.com public:
33613481Sgiacomo.travaglini@arm.com  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
33713481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
33813481Sgiacomo.travaglini@arm.com      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
33913481Sgiacomo.travaglini@arm.com
34013481Sgiacomo.travaglini@arm.com  template <typename T>
34113481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
34213481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
34313481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
34413481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
34513481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
34613481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
34713481Sgiacomo.travaglini@arm.com  }
34813481Sgiacomo.travaglini@arm.com
34913481Sgiacomo.travaglini@arm.com private:
35013481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
35113481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray11& other);
35213481Sgiacomo.travaglini@arm.com
35313481Sgiacomo.travaglini@arm.com  const T1 v1_;
35413481Sgiacomo.travaglini@arm.com  const T2 v2_;
35513481Sgiacomo.travaglini@arm.com  const T3 v3_;
35613481Sgiacomo.travaglini@arm.com  const T4 v4_;
35713481Sgiacomo.travaglini@arm.com  const T5 v5_;
35813481Sgiacomo.travaglini@arm.com  const T6 v6_;
35913481Sgiacomo.travaglini@arm.com  const T7 v7_;
36013481Sgiacomo.travaglini@arm.com  const T8 v8_;
36113481Sgiacomo.travaglini@arm.com  const T9 v9_;
36213481Sgiacomo.travaglini@arm.com  const T10 v10_;
36313481Sgiacomo.travaglini@arm.com  const T11 v11_;
36413481Sgiacomo.travaglini@arm.com};
36513481Sgiacomo.travaglini@arm.com
36613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
36713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
36813481Sgiacomo.travaglini@arm.com    typename T11, typename T12>
36913481Sgiacomo.travaglini@arm.comclass ValueArray12 {
37013481Sgiacomo.travaglini@arm.com public:
37113481Sgiacomo.travaglini@arm.com  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
37213481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
37313481Sgiacomo.travaglini@arm.com      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
37413481Sgiacomo.travaglini@arm.com
37513481Sgiacomo.travaglini@arm.com  template <typename T>
37613481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
37713481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
37813481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
37913481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
38013481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
38113481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_)};
38213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
38313481Sgiacomo.travaglini@arm.com  }
38413481Sgiacomo.travaglini@arm.com
38513481Sgiacomo.travaglini@arm.com private:
38613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
38713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray12& other);
38813481Sgiacomo.travaglini@arm.com
38913481Sgiacomo.travaglini@arm.com  const T1 v1_;
39013481Sgiacomo.travaglini@arm.com  const T2 v2_;
39113481Sgiacomo.travaglini@arm.com  const T3 v3_;
39213481Sgiacomo.travaglini@arm.com  const T4 v4_;
39313481Sgiacomo.travaglini@arm.com  const T5 v5_;
39413481Sgiacomo.travaglini@arm.com  const T6 v6_;
39513481Sgiacomo.travaglini@arm.com  const T7 v7_;
39613481Sgiacomo.travaglini@arm.com  const T8 v8_;
39713481Sgiacomo.travaglini@arm.com  const T9 v9_;
39813481Sgiacomo.travaglini@arm.com  const T10 v10_;
39913481Sgiacomo.travaglini@arm.com  const T11 v11_;
40013481Sgiacomo.travaglini@arm.com  const T12 v12_;
40113481Sgiacomo.travaglini@arm.com};
40213481Sgiacomo.travaglini@arm.com
40313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40413481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
40513481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13>
40613481Sgiacomo.travaglini@arm.comclass ValueArray13 {
40713481Sgiacomo.travaglini@arm.com public:
40813481Sgiacomo.travaglini@arm.com  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
40913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
41013481Sgiacomo.travaglini@arm.com      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
41113481Sgiacomo.travaglini@arm.com      v12_(v12), v13_(v13) {}
41213481Sgiacomo.travaglini@arm.com
41313481Sgiacomo.travaglini@arm.com  template <typename T>
41413481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
41513481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
41613481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
41713481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
41813481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
41913481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_)};
42013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
42113481Sgiacomo.travaglini@arm.com  }
42213481Sgiacomo.travaglini@arm.com
42313481Sgiacomo.travaglini@arm.com private:
42413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
42513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray13& other);
42613481Sgiacomo.travaglini@arm.com
42713481Sgiacomo.travaglini@arm.com  const T1 v1_;
42813481Sgiacomo.travaglini@arm.com  const T2 v2_;
42913481Sgiacomo.travaglini@arm.com  const T3 v3_;
43013481Sgiacomo.travaglini@arm.com  const T4 v4_;
43113481Sgiacomo.travaglini@arm.com  const T5 v5_;
43213481Sgiacomo.travaglini@arm.com  const T6 v6_;
43313481Sgiacomo.travaglini@arm.com  const T7 v7_;
43413481Sgiacomo.travaglini@arm.com  const T8 v8_;
43513481Sgiacomo.travaglini@arm.com  const T9 v9_;
43613481Sgiacomo.travaglini@arm.com  const T10 v10_;
43713481Sgiacomo.travaglini@arm.com  const T11 v11_;
43813481Sgiacomo.travaglini@arm.com  const T12 v12_;
43913481Sgiacomo.travaglini@arm.com  const T13 v13_;
44013481Sgiacomo.travaglini@arm.com};
44113481Sgiacomo.travaglini@arm.com
44213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
44313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
44413481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14>
44513481Sgiacomo.travaglini@arm.comclass ValueArray14 {
44613481Sgiacomo.travaglini@arm.com public:
44713481Sgiacomo.travaglini@arm.com  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
44813481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
44913481Sgiacomo.travaglini@arm.com      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
45013481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
45113481Sgiacomo.travaglini@arm.com
45213481Sgiacomo.travaglini@arm.com  template <typename T>
45313481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
45413481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
45513481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
45613481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
45713481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
45813481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
45913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
46013481Sgiacomo.travaglini@arm.com  }
46113481Sgiacomo.travaglini@arm.com
46213481Sgiacomo.travaglini@arm.com private:
46313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
46413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray14& other);
46513481Sgiacomo.travaglini@arm.com
46613481Sgiacomo.travaglini@arm.com  const T1 v1_;
46713481Sgiacomo.travaglini@arm.com  const T2 v2_;
46813481Sgiacomo.travaglini@arm.com  const T3 v3_;
46913481Sgiacomo.travaglini@arm.com  const T4 v4_;
47013481Sgiacomo.travaglini@arm.com  const T5 v5_;
47113481Sgiacomo.travaglini@arm.com  const T6 v6_;
47213481Sgiacomo.travaglini@arm.com  const T7 v7_;
47313481Sgiacomo.travaglini@arm.com  const T8 v8_;
47413481Sgiacomo.travaglini@arm.com  const T9 v9_;
47513481Sgiacomo.travaglini@arm.com  const T10 v10_;
47613481Sgiacomo.travaglini@arm.com  const T11 v11_;
47713481Sgiacomo.travaglini@arm.com  const T12 v12_;
47813481Sgiacomo.travaglini@arm.com  const T13 v13_;
47913481Sgiacomo.travaglini@arm.com  const T14 v14_;
48013481Sgiacomo.travaglini@arm.com};
48113481Sgiacomo.travaglini@arm.com
48213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
48413481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15>
48513481Sgiacomo.travaglini@arm.comclass ValueArray15 {
48613481Sgiacomo.travaglini@arm.com public:
48713481Sgiacomo.travaglini@arm.com  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
48813481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
48913481Sgiacomo.travaglini@arm.com      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
49013481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
49113481Sgiacomo.travaglini@arm.com
49213481Sgiacomo.travaglini@arm.com  template <typename T>
49313481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
49413481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
49513481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
49613481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
49713481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
49813481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
49913481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_)};
50013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
50113481Sgiacomo.travaglini@arm.com  }
50213481Sgiacomo.travaglini@arm.com
50313481Sgiacomo.travaglini@arm.com private:
50413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
50513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray15& other);
50613481Sgiacomo.travaglini@arm.com
50713481Sgiacomo.travaglini@arm.com  const T1 v1_;
50813481Sgiacomo.travaglini@arm.com  const T2 v2_;
50913481Sgiacomo.travaglini@arm.com  const T3 v3_;
51013481Sgiacomo.travaglini@arm.com  const T4 v4_;
51113481Sgiacomo.travaglini@arm.com  const T5 v5_;
51213481Sgiacomo.travaglini@arm.com  const T6 v6_;
51313481Sgiacomo.travaglini@arm.com  const T7 v7_;
51413481Sgiacomo.travaglini@arm.com  const T8 v8_;
51513481Sgiacomo.travaglini@arm.com  const T9 v9_;
51613481Sgiacomo.travaglini@arm.com  const T10 v10_;
51713481Sgiacomo.travaglini@arm.com  const T11 v11_;
51813481Sgiacomo.travaglini@arm.com  const T12 v12_;
51913481Sgiacomo.travaglini@arm.com  const T13 v13_;
52013481Sgiacomo.travaglini@arm.com  const T14 v14_;
52113481Sgiacomo.travaglini@arm.com  const T15 v15_;
52213481Sgiacomo.travaglini@arm.com};
52313481Sgiacomo.travaglini@arm.com
52413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52513481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
52613481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
52713481Sgiacomo.travaglini@arm.com    typename T16>
52813481Sgiacomo.travaglini@arm.comclass ValueArray16 {
52913481Sgiacomo.travaglini@arm.com public:
53013481Sgiacomo.travaglini@arm.com  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
53113481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
53213481Sgiacomo.travaglini@arm.com      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
53313481Sgiacomo.travaglini@arm.com      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
53413481Sgiacomo.travaglini@arm.com      v16_(v16) {}
53513481Sgiacomo.travaglini@arm.com
53613481Sgiacomo.travaglini@arm.com  template <typename T>
53713481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
53813481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
53913481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
54013481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
54113481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
54213481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
54313481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_)};
54413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
54513481Sgiacomo.travaglini@arm.com  }
54613481Sgiacomo.travaglini@arm.com
54713481Sgiacomo.travaglini@arm.com private:
54813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
54913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray16& other);
55013481Sgiacomo.travaglini@arm.com
55113481Sgiacomo.travaglini@arm.com  const T1 v1_;
55213481Sgiacomo.travaglini@arm.com  const T2 v2_;
55313481Sgiacomo.travaglini@arm.com  const T3 v3_;
55413481Sgiacomo.travaglini@arm.com  const T4 v4_;
55513481Sgiacomo.travaglini@arm.com  const T5 v5_;
55613481Sgiacomo.travaglini@arm.com  const T6 v6_;
55713481Sgiacomo.travaglini@arm.com  const T7 v7_;
55813481Sgiacomo.travaglini@arm.com  const T8 v8_;
55913481Sgiacomo.travaglini@arm.com  const T9 v9_;
56013481Sgiacomo.travaglini@arm.com  const T10 v10_;
56113481Sgiacomo.travaglini@arm.com  const T11 v11_;
56213481Sgiacomo.travaglini@arm.com  const T12 v12_;
56313481Sgiacomo.travaglini@arm.com  const T13 v13_;
56413481Sgiacomo.travaglini@arm.com  const T14 v14_;
56513481Sgiacomo.travaglini@arm.com  const T15 v15_;
56613481Sgiacomo.travaglini@arm.com  const T16 v16_;
56713481Sgiacomo.travaglini@arm.com};
56813481Sgiacomo.travaglini@arm.com
56913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
57013481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
57113481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
57213481Sgiacomo.travaglini@arm.com    typename T16, typename T17>
57313481Sgiacomo.travaglini@arm.comclass ValueArray17 {
57413481Sgiacomo.travaglini@arm.com public:
57513481Sgiacomo.travaglini@arm.com  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
57613481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
57713481Sgiacomo.travaglini@arm.com      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
57813481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
57913481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17) {}
58013481Sgiacomo.travaglini@arm.com
58113481Sgiacomo.travaglini@arm.com  template <typename T>
58213481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
58313481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
58413481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
58513481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
58613481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
58713481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
58813481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
58913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
59013481Sgiacomo.travaglini@arm.com  }
59113481Sgiacomo.travaglini@arm.com
59213481Sgiacomo.travaglini@arm.com private:
59313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
59413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray17& other);
59513481Sgiacomo.travaglini@arm.com
59613481Sgiacomo.travaglini@arm.com  const T1 v1_;
59713481Sgiacomo.travaglini@arm.com  const T2 v2_;
59813481Sgiacomo.travaglini@arm.com  const T3 v3_;
59913481Sgiacomo.travaglini@arm.com  const T4 v4_;
60013481Sgiacomo.travaglini@arm.com  const T5 v5_;
60113481Sgiacomo.travaglini@arm.com  const T6 v6_;
60213481Sgiacomo.travaglini@arm.com  const T7 v7_;
60313481Sgiacomo.travaglini@arm.com  const T8 v8_;
60413481Sgiacomo.travaglini@arm.com  const T9 v9_;
60513481Sgiacomo.travaglini@arm.com  const T10 v10_;
60613481Sgiacomo.travaglini@arm.com  const T11 v11_;
60713481Sgiacomo.travaglini@arm.com  const T12 v12_;
60813481Sgiacomo.travaglini@arm.com  const T13 v13_;
60913481Sgiacomo.travaglini@arm.com  const T14 v14_;
61013481Sgiacomo.travaglini@arm.com  const T15 v15_;
61113481Sgiacomo.travaglini@arm.com  const T16 v16_;
61213481Sgiacomo.travaglini@arm.com  const T17 v17_;
61313481Sgiacomo.travaglini@arm.com};
61413481Sgiacomo.travaglini@arm.com
61513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
61613481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
61713481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
61813481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18>
61913481Sgiacomo.travaglini@arm.comclass ValueArray18 {
62013481Sgiacomo.travaglini@arm.com public:
62113481Sgiacomo.travaglini@arm.com  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
62213481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
62313481Sgiacomo.travaglini@arm.com      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
62413481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
62513481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
62613481Sgiacomo.travaglini@arm.com
62713481Sgiacomo.travaglini@arm.com  template <typename T>
62813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
62913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
63013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
63113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
63213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
63313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
63413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
63513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_)};
63613481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
63713481Sgiacomo.travaglini@arm.com  }
63813481Sgiacomo.travaglini@arm.com
63913481Sgiacomo.travaglini@arm.com private:
64013481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
64113481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray18& other);
64213481Sgiacomo.travaglini@arm.com
64313481Sgiacomo.travaglini@arm.com  const T1 v1_;
64413481Sgiacomo.travaglini@arm.com  const T2 v2_;
64513481Sgiacomo.travaglini@arm.com  const T3 v3_;
64613481Sgiacomo.travaglini@arm.com  const T4 v4_;
64713481Sgiacomo.travaglini@arm.com  const T5 v5_;
64813481Sgiacomo.travaglini@arm.com  const T6 v6_;
64913481Sgiacomo.travaglini@arm.com  const T7 v7_;
65013481Sgiacomo.travaglini@arm.com  const T8 v8_;
65113481Sgiacomo.travaglini@arm.com  const T9 v9_;
65213481Sgiacomo.travaglini@arm.com  const T10 v10_;
65313481Sgiacomo.travaglini@arm.com  const T11 v11_;
65413481Sgiacomo.travaglini@arm.com  const T12 v12_;
65513481Sgiacomo.travaglini@arm.com  const T13 v13_;
65613481Sgiacomo.travaglini@arm.com  const T14 v14_;
65713481Sgiacomo.travaglini@arm.com  const T15 v15_;
65813481Sgiacomo.travaglini@arm.com  const T16 v16_;
65913481Sgiacomo.travaglini@arm.com  const T17 v17_;
66013481Sgiacomo.travaglini@arm.com  const T18 v18_;
66113481Sgiacomo.travaglini@arm.com};
66213481Sgiacomo.travaglini@arm.com
66313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
66413481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
66513481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
66613481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19>
66713481Sgiacomo.travaglini@arm.comclass ValueArray19 {
66813481Sgiacomo.travaglini@arm.com public:
66913481Sgiacomo.travaglini@arm.com  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
67013481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
67113481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
67213481Sgiacomo.travaglini@arm.com      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
67313481Sgiacomo.travaglini@arm.com      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
67413481Sgiacomo.travaglini@arm.com
67513481Sgiacomo.travaglini@arm.com  template <typename T>
67613481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
67713481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
67813481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
67913481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
68013481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
68113481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
68213481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
68313481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_)};
68413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
68513481Sgiacomo.travaglini@arm.com  }
68613481Sgiacomo.travaglini@arm.com
68713481Sgiacomo.travaglini@arm.com private:
68813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
68913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray19& other);
69013481Sgiacomo.travaglini@arm.com
69113481Sgiacomo.travaglini@arm.com  const T1 v1_;
69213481Sgiacomo.travaglini@arm.com  const T2 v2_;
69313481Sgiacomo.travaglini@arm.com  const T3 v3_;
69413481Sgiacomo.travaglini@arm.com  const T4 v4_;
69513481Sgiacomo.travaglini@arm.com  const T5 v5_;
69613481Sgiacomo.travaglini@arm.com  const T6 v6_;
69713481Sgiacomo.travaglini@arm.com  const T7 v7_;
69813481Sgiacomo.travaglini@arm.com  const T8 v8_;
69913481Sgiacomo.travaglini@arm.com  const T9 v9_;
70013481Sgiacomo.travaglini@arm.com  const T10 v10_;
70113481Sgiacomo.travaglini@arm.com  const T11 v11_;
70213481Sgiacomo.travaglini@arm.com  const T12 v12_;
70313481Sgiacomo.travaglini@arm.com  const T13 v13_;
70413481Sgiacomo.travaglini@arm.com  const T14 v14_;
70513481Sgiacomo.travaglini@arm.com  const T15 v15_;
70613481Sgiacomo.travaglini@arm.com  const T16 v16_;
70713481Sgiacomo.travaglini@arm.com  const T17 v17_;
70813481Sgiacomo.travaglini@arm.com  const T18 v18_;
70913481Sgiacomo.travaglini@arm.com  const T19 v19_;
71013481Sgiacomo.travaglini@arm.com};
71113481Sgiacomo.travaglini@arm.com
71213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
71313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
71413481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
71513481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20>
71613481Sgiacomo.travaglini@arm.comclass ValueArray20 {
71713481Sgiacomo.travaglini@arm.com public:
71813481Sgiacomo.travaglini@arm.com  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
71913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
72013481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
72113481Sgiacomo.travaglini@arm.com      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
72213481Sgiacomo.travaglini@arm.com      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
72313481Sgiacomo.travaglini@arm.com      v19_(v19), v20_(v20) {}
72413481Sgiacomo.travaglini@arm.com
72513481Sgiacomo.travaglini@arm.com  template <typename T>
72613481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
72713481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
72813481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
72913481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
73013481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
73113481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
73213481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
73313481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
73413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
73513481Sgiacomo.travaglini@arm.com  }
73613481Sgiacomo.travaglini@arm.com
73713481Sgiacomo.travaglini@arm.com private:
73813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
73913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray20& other);
74013481Sgiacomo.travaglini@arm.com
74113481Sgiacomo.travaglini@arm.com  const T1 v1_;
74213481Sgiacomo.travaglini@arm.com  const T2 v2_;
74313481Sgiacomo.travaglini@arm.com  const T3 v3_;
74413481Sgiacomo.travaglini@arm.com  const T4 v4_;
74513481Sgiacomo.travaglini@arm.com  const T5 v5_;
74613481Sgiacomo.travaglini@arm.com  const T6 v6_;
74713481Sgiacomo.travaglini@arm.com  const T7 v7_;
74813481Sgiacomo.travaglini@arm.com  const T8 v8_;
74913481Sgiacomo.travaglini@arm.com  const T9 v9_;
75013481Sgiacomo.travaglini@arm.com  const T10 v10_;
75113481Sgiacomo.travaglini@arm.com  const T11 v11_;
75213481Sgiacomo.travaglini@arm.com  const T12 v12_;
75313481Sgiacomo.travaglini@arm.com  const T13 v13_;
75413481Sgiacomo.travaglini@arm.com  const T14 v14_;
75513481Sgiacomo.travaglini@arm.com  const T15 v15_;
75613481Sgiacomo.travaglini@arm.com  const T16 v16_;
75713481Sgiacomo.travaglini@arm.com  const T17 v17_;
75813481Sgiacomo.travaglini@arm.com  const T18 v18_;
75913481Sgiacomo.travaglini@arm.com  const T19 v19_;
76013481Sgiacomo.travaglini@arm.com  const T20 v20_;
76113481Sgiacomo.travaglini@arm.com};
76213481Sgiacomo.travaglini@arm.com
76313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
76413481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
76513481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
76613481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
76713481Sgiacomo.travaglini@arm.com    typename T21>
76813481Sgiacomo.travaglini@arm.comclass ValueArray21 {
76913481Sgiacomo.travaglini@arm.com public:
77013481Sgiacomo.travaglini@arm.com  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
77113481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
77213481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
77313481Sgiacomo.travaglini@arm.com      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
77413481Sgiacomo.travaglini@arm.com      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
77513481Sgiacomo.travaglini@arm.com      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
77613481Sgiacomo.travaglini@arm.com
77713481Sgiacomo.travaglini@arm.com  template <typename T>
77813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
77913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
78013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
78113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
78213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
78313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
78413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
78513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
78613481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_)};
78713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
78813481Sgiacomo.travaglini@arm.com  }
78913481Sgiacomo.travaglini@arm.com
79013481Sgiacomo.travaglini@arm.com private:
79113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
79213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray21& other);
79313481Sgiacomo.travaglini@arm.com
79413481Sgiacomo.travaglini@arm.com  const T1 v1_;
79513481Sgiacomo.travaglini@arm.com  const T2 v2_;
79613481Sgiacomo.travaglini@arm.com  const T3 v3_;
79713481Sgiacomo.travaglini@arm.com  const T4 v4_;
79813481Sgiacomo.travaglini@arm.com  const T5 v5_;
79913481Sgiacomo.travaglini@arm.com  const T6 v6_;
80013481Sgiacomo.travaglini@arm.com  const T7 v7_;
80113481Sgiacomo.travaglini@arm.com  const T8 v8_;
80213481Sgiacomo.travaglini@arm.com  const T9 v9_;
80313481Sgiacomo.travaglini@arm.com  const T10 v10_;
80413481Sgiacomo.travaglini@arm.com  const T11 v11_;
80513481Sgiacomo.travaglini@arm.com  const T12 v12_;
80613481Sgiacomo.travaglini@arm.com  const T13 v13_;
80713481Sgiacomo.travaglini@arm.com  const T14 v14_;
80813481Sgiacomo.travaglini@arm.com  const T15 v15_;
80913481Sgiacomo.travaglini@arm.com  const T16 v16_;
81013481Sgiacomo.travaglini@arm.com  const T17 v17_;
81113481Sgiacomo.travaglini@arm.com  const T18 v18_;
81213481Sgiacomo.travaglini@arm.com  const T19 v19_;
81313481Sgiacomo.travaglini@arm.com  const T20 v20_;
81413481Sgiacomo.travaglini@arm.com  const T21 v21_;
81513481Sgiacomo.travaglini@arm.com};
81613481Sgiacomo.travaglini@arm.com
81713481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
81813481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
81913481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
82013481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
82113481Sgiacomo.travaglini@arm.com    typename T21, typename T22>
82213481Sgiacomo.travaglini@arm.comclass ValueArray22 {
82313481Sgiacomo.travaglini@arm.com public:
82413481Sgiacomo.travaglini@arm.com  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
82513481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
82613481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
82713481Sgiacomo.travaglini@arm.com      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
82813481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
82913481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
83013481Sgiacomo.travaglini@arm.com
83113481Sgiacomo.travaglini@arm.com  template <typename T>
83213481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
83313481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
83413481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
83513481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
83613481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
83713481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
83813481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
83913481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
84013481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_)};
84113481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
84213481Sgiacomo.travaglini@arm.com  }
84313481Sgiacomo.travaglini@arm.com
84413481Sgiacomo.travaglini@arm.com private:
84513481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
84613481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray22& other);
84713481Sgiacomo.travaglini@arm.com
84813481Sgiacomo.travaglini@arm.com  const T1 v1_;
84913481Sgiacomo.travaglini@arm.com  const T2 v2_;
85013481Sgiacomo.travaglini@arm.com  const T3 v3_;
85113481Sgiacomo.travaglini@arm.com  const T4 v4_;
85213481Sgiacomo.travaglini@arm.com  const T5 v5_;
85313481Sgiacomo.travaglini@arm.com  const T6 v6_;
85413481Sgiacomo.travaglini@arm.com  const T7 v7_;
85513481Sgiacomo.travaglini@arm.com  const T8 v8_;
85613481Sgiacomo.travaglini@arm.com  const T9 v9_;
85713481Sgiacomo.travaglini@arm.com  const T10 v10_;
85813481Sgiacomo.travaglini@arm.com  const T11 v11_;
85913481Sgiacomo.travaglini@arm.com  const T12 v12_;
86013481Sgiacomo.travaglini@arm.com  const T13 v13_;
86113481Sgiacomo.travaglini@arm.com  const T14 v14_;
86213481Sgiacomo.travaglini@arm.com  const T15 v15_;
86313481Sgiacomo.travaglini@arm.com  const T16 v16_;
86413481Sgiacomo.travaglini@arm.com  const T17 v17_;
86513481Sgiacomo.travaglini@arm.com  const T18 v18_;
86613481Sgiacomo.travaglini@arm.com  const T19 v19_;
86713481Sgiacomo.travaglini@arm.com  const T20 v20_;
86813481Sgiacomo.travaglini@arm.com  const T21 v21_;
86913481Sgiacomo.travaglini@arm.com  const T22 v22_;
87013481Sgiacomo.travaglini@arm.com};
87113481Sgiacomo.travaglini@arm.com
87213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
87313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
87413481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
87513481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
87613481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23>
87713481Sgiacomo.travaglini@arm.comclass ValueArray23 {
87813481Sgiacomo.travaglini@arm.com public:
87913481Sgiacomo.travaglini@arm.com  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
88013481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
88113481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
88213481Sgiacomo.travaglini@arm.com      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
88313481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
88413481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
88513481Sgiacomo.travaglini@arm.com      v23_(v23) {}
88613481Sgiacomo.travaglini@arm.com
88713481Sgiacomo.travaglini@arm.com  template <typename T>
88813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
88913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
89013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
89113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
89213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
89313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
89413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
89513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
89613481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
89713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
89813481Sgiacomo.travaglini@arm.com  }
89913481Sgiacomo.travaglini@arm.com
90013481Sgiacomo.travaglini@arm.com private:
90113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
90213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray23& other);
90313481Sgiacomo.travaglini@arm.com
90413481Sgiacomo.travaglini@arm.com  const T1 v1_;
90513481Sgiacomo.travaglini@arm.com  const T2 v2_;
90613481Sgiacomo.travaglini@arm.com  const T3 v3_;
90713481Sgiacomo.travaglini@arm.com  const T4 v4_;
90813481Sgiacomo.travaglini@arm.com  const T5 v5_;
90913481Sgiacomo.travaglini@arm.com  const T6 v6_;
91013481Sgiacomo.travaglini@arm.com  const T7 v7_;
91113481Sgiacomo.travaglini@arm.com  const T8 v8_;
91213481Sgiacomo.travaglini@arm.com  const T9 v9_;
91313481Sgiacomo.travaglini@arm.com  const T10 v10_;
91413481Sgiacomo.travaglini@arm.com  const T11 v11_;
91513481Sgiacomo.travaglini@arm.com  const T12 v12_;
91613481Sgiacomo.travaglini@arm.com  const T13 v13_;
91713481Sgiacomo.travaglini@arm.com  const T14 v14_;
91813481Sgiacomo.travaglini@arm.com  const T15 v15_;
91913481Sgiacomo.travaglini@arm.com  const T16 v16_;
92013481Sgiacomo.travaglini@arm.com  const T17 v17_;
92113481Sgiacomo.travaglini@arm.com  const T18 v18_;
92213481Sgiacomo.travaglini@arm.com  const T19 v19_;
92313481Sgiacomo.travaglini@arm.com  const T20 v20_;
92413481Sgiacomo.travaglini@arm.com  const T21 v21_;
92513481Sgiacomo.travaglini@arm.com  const T22 v22_;
92613481Sgiacomo.travaglini@arm.com  const T23 v23_;
92713481Sgiacomo.travaglini@arm.com};
92813481Sgiacomo.travaglini@arm.com
92913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
93013481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
93113481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
93213481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
93313481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24>
93413481Sgiacomo.travaglini@arm.comclass ValueArray24 {
93513481Sgiacomo.travaglini@arm.com public:
93613481Sgiacomo.travaglini@arm.com  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
93713481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
93813481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
93913481Sgiacomo.travaglini@arm.com      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
94013481Sgiacomo.travaglini@arm.com      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
94113481Sgiacomo.travaglini@arm.com      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
94213481Sgiacomo.travaglini@arm.com      v22_(v22), v23_(v23), v24_(v24) {}
94313481Sgiacomo.travaglini@arm.com
94413481Sgiacomo.travaglini@arm.com  template <typename T>
94513481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
94613481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
94713481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
94813481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
94913481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
95013481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
95113481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
95213481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
95313481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
95413481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_)};
95513481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
95613481Sgiacomo.travaglini@arm.com  }
95713481Sgiacomo.travaglini@arm.com
95813481Sgiacomo.travaglini@arm.com private:
95913481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
96013481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray24& other);
96113481Sgiacomo.travaglini@arm.com
96213481Sgiacomo.travaglini@arm.com  const T1 v1_;
96313481Sgiacomo.travaglini@arm.com  const T2 v2_;
96413481Sgiacomo.travaglini@arm.com  const T3 v3_;
96513481Sgiacomo.travaglini@arm.com  const T4 v4_;
96613481Sgiacomo.travaglini@arm.com  const T5 v5_;
96713481Sgiacomo.travaglini@arm.com  const T6 v6_;
96813481Sgiacomo.travaglini@arm.com  const T7 v7_;
96913481Sgiacomo.travaglini@arm.com  const T8 v8_;
97013481Sgiacomo.travaglini@arm.com  const T9 v9_;
97113481Sgiacomo.travaglini@arm.com  const T10 v10_;
97213481Sgiacomo.travaglini@arm.com  const T11 v11_;
97313481Sgiacomo.travaglini@arm.com  const T12 v12_;
97413481Sgiacomo.travaglini@arm.com  const T13 v13_;
97513481Sgiacomo.travaglini@arm.com  const T14 v14_;
97613481Sgiacomo.travaglini@arm.com  const T15 v15_;
97713481Sgiacomo.travaglini@arm.com  const T16 v16_;
97813481Sgiacomo.travaglini@arm.com  const T17 v17_;
97913481Sgiacomo.travaglini@arm.com  const T18 v18_;
98013481Sgiacomo.travaglini@arm.com  const T19 v19_;
98113481Sgiacomo.travaglini@arm.com  const T20 v20_;
98213481Sgiacomo.travaglini@arm.com  const T21 v21_;
98313481Sgiacomo.travaglini@arm.com  const T22 v22_;
98413481Sgiacomo.travaglini@arm.com  const T23 v23_;
98513481Sgiacomo.travaglini@arm.com  const T24 v24_;
98613481Sgiacomo.travaglini@arm.com};
98713481Sgiacomo.travaglini@arm.com
98813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
98913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
99013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
99113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
99213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25>
99313481Sgiacomo.travaglini@arm.comclass ValueArray25 {
99413481Sgiacomo.travaglini@arm.com public:
99513481Sgiacomo.travaglini@arm.com  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
99613481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
99713481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
99813481Sgiacomo.travaglini@arm.com      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
99913481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
100013481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
100113481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
100213481Sgiacomo.travaglini@arm.com
100313481Sgiacomo.travaglini@arm.com  template <typename T>
100413481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
100513481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
100613481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
100713481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
100813481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
100913481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
101013481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
101113481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
101213481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
101313481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_)};
101413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
101513481Sgiacomo.travaglini@arm.com  }
101613481Sgiacomo.travaglini@arm.com
101713481Sgiacomo.travaglini@arm.com private:
101813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
101913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray25& other);
102013481Sgiacomo.travaglini@arm.com
102113481Sgiacomo.travaglini@arm.com  const T1 v1_;
102213481Sgiacomo.travaglini@arm.com  const T2 v2_;
102313481Sgiacomo.travaglini@arm.com  const T3 v3_;
102413481Sgiacomo.travaglini@arm.com  const T4 v4_;
102513481Sgiacomo.travaglini@arm.com  const T5 v5_;
102613481Sgiacomo.travaglini@arm.com  const T6 v6_;
102713481Sgiacomo.travaglini@arm.com  const T7 v7_;
102813481Sgiacomo.travaglini@arm.com  const T8 v8_;
102913481Sgiacomo.travaglini@arm.com  const T9 v9_;
103013481Sgiacomo.travaglini@arm.com  const T10 v10_;
103113481Sgiacomo.travaglini@arm.com  const T11 v11_;
103213481Sgiacomo.travaglini@arm.com  const T12 v12_;
103313481Sgiacomo.travaglini@arm.com  const T13 v13_;
103413481Sgiacomo.travaglini@arm.com  const T14 v14_;
103513481Sgiacomo.travaglini@arm.com  const T15 v15_;
103613481Sgiacomo.travaglini@arm.com  const T16 v16_;
103713481Sgiacomo.travaglini@arm.com  const T17 v17_;
103813481Sgiacomo.travaglini@arm.com  const T18 v18_;
103913481Sgiacomo.travaglini@arm.com  const T19 v19_;
104013481Sgiacomo.travaglini@arm.com  const T20 v20_;
104113481Sgiacomo.travaglini@arm.com  const T21 v21_;
104213481Sgiacomo.travaglini@arm.com  const T22 v22_;
104313481Sgiacomo.travaglini@arm.com  const T23 v23_;
104413481Sgiacomo.travaglini@arm.com  const T24 v24_;
104513481Sgiacomo.travaglini@arm.com  const T25 v25_;
104613481Sgiacomo.travaglini@arm.com};
104713481Sgiacomo.travaglini@arm.com
104813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
104913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
105013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
105113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
105213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
105313481Sgiacomo.travaglini@arm.com    typename T26>
105413481Sgiacomo.travaglini@arm.comclass ValueArray26 {
105513481Sgiacomo.travaglini@arm.com public:
105613481Sgiacomo.travaglini@arm.com  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
105713481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
105813481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
105913481Sgiacomo.travaglini@arm.com      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
106013481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
106113481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
106213481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
106313481Sgiacomo.travaglini@arm.com
106413481Sgiacomo.travaglini@arm.com  template <typename T>
106513481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
106613481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
106713481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
106813481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
106913481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
107013481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
107113481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
107213481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
107313481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
107413481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
107513481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
107613481Sgiacomo.travaglini@arm.com  }
107713481Sgiacomo.travaglini@arm.com
107813481Sgiacomo.travaglini@arm.com private:
107913481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
108013481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray26& other);
108113481Sgiacomo.travaglini@arm.com
108213481Sgiacomo.travaglini@arm.com  const T1 v1_;
108313481Sgiacomo.travaglini@arm.com  const T2 v2_;
108413481Sgiacomo.travaglini@arm.com  const T3 v3_;
108513481Sgiacomo.travaglini@arm.com  const T4 v4_;
108613481Sgiacomo.travaglini@arm.com  const T5 v5_;
108713481Sgiacomo.travaglini@arm.com  const T6 v6_;
108813481Sgiacomo.travaglini@arm.com  const T7 v7_;
108913481Sgiacomo.travaglini@arm.com  const T8 v8_;
109013481Sgiacomo.travaglini@arm.com  const T9 v9_;
109113481Sgiacomo.travaglini@arm.com  const T10 v10_;
109213481Sgiacomo.travaglini@arm.com  const T11 v11_;
109313481Sgiacomo.travaglini@arm.com  const T12 v12_;
109413481Sgiacomo.travaglini@arm.com  const T13 v13_;
109513481Sgiacomo.travaglini@arm.com  const T14 v14_;
109613481Sgiacomo.travaglini@arm.com  const T15 v15_;
109713481Sgiacomo.travaglini@arm.com  const T16 v16_;
109813481Sgiacomo.travaglini@arm.com  const T17 v17_;
109913481Sgiacomo.travaglini@arm.com  const T18 v18_;
110013481Sgiacomo.travaglini@arm.com  const T19 v19_;
110113481Sgiacomo.travaglini@arm.com  const T20 v20_;
110213481Sgiacomo.travaglini@arm.com  const T21 v21_;
110313481Sgiacomo.travaglini@arm.com  const T22 v22_;
110413481Sgiacomo.travaglini@arm.com  const T23 v23_;
110513481Sgiacomo.travaglini@arm.com  const T24 v24_;
110613481Sgiacomo.travaglini@arm.com  const T25 v25_;
110713481Sgiacomo.travaglini@arm.com  const T26 v26_;
110813481Sgiacomo.travaglini@arm.com};
110913481Sgiacomo.travaglini@arm.com
111013481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
111113481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
111213481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
111313481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
111413481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
111513481Sgiacomo.travaglini@arm.com    typename T26, typename T27>
111613481Sgiacomo.travaglini@arm.comclass ValueArray27 {
111713481Sgiacomo.travaglini@arm.com public:
111813481Sgiacomo.travaglini@arm.com  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
111913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
112013481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
112113481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
112213481Sgiacomo.travaglini@arm.com      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
112313481Sgiacomo.travaglini@arm.com      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
112413481Sgiacomo.travaglini@arm.com      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
112513481Sgiacomo.travaglini@arm.com      v26_(v26), v27_(v27) {}
112613481Sgiacomo.travaglini@arm.com
112713481Sgiacomo.travaglini@arm.com  template <typename T>
112813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
112913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
113013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
113113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
113213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
113313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
113413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
113513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
113613481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
113713481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
113813481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_)};
113913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
114013481Sgiacomo.travaglini@arm.com  }
114113481Sgiacomo.travaglini@arm.com
114213481Sgiacomo.travaglini@arm.com private:
114313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
114413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray27& other);
114513481Sgiacomo.travaglini@arm.com
114613481Sgiacomo.travaglini@arm.com  const T1 v1_;
114713481Sgiacomo.travaglini@arm.com  const T2 v2_;
114813481Sgiacomo.travaglini@arm.com  const T3 v3_;
114913481Sgiacomo.travaglini@arm.com  const T4 v4_;
115013481Sgiacomo.travaglini@arm.com  const T5 v5_;
115113481Sgiacomo.travaglini@arm.com  const T6 v6_;
115213481Sgiacomo.travaglini@arm.com  const T7 v7_;
115313481Sgiacomo.travaglini@arm.com  const T8 v8_;
115413481Sgiacomo.travaglini@arm.com  const T9 v9_;
115513481Sgiacomo.travaglini@arm.com  const T10 v10_;
115613481Sgiacomo.travaglini@arm.com  const T11 v11_;
115713481Sgiacomo.travaglini@arm.com  const T12 v12_;
115813481Sgiacomo.travaglini@arm.com  const T13 v13_;
115913481Sgiacomo.travaglini@arm.com  const T14 v14_;
116013481Sgiacomo.travaglini@arm.com  const T15 v15_;
116113481Sgiacomo.travaglini@arm.com  const T16 v16_;
116213481Sgiacomo.travaglini@arm.com  const T17 v17_;
116313481Sgiacomo.travaglini@arm.com  const T18 v18_;
116413481Sgiacomo.travaglini@arm.com  const T19 v19_;
116513481Sgiacomo.travaglini@arm.com  const T20 v20_;
116613481Sgiacomo.travaglini@arm.com  const T21 v21_;
116713481Sgiacomo.travaglini@arm.com  const T22 v22_;
116813481Sgiacomo.travaglini@arm.com  const T23 v23_;
116913481Sgiacomo.travaglini@arm.com  const T24 v24_;
117013481Sgiacomo.travaglini@arm.com  const T25 v25_;
117113481Sgiacomo.travaglini@arm.com  const T26 v26_;
117213481Sgiacomo.travaglini@arm.com  const T27 v27_;
117313481Sgiacomo.travaglini@arm.com};
117413481Sgiacomo.travaglini@arm.com
117513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
117613481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
117713481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
117813481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
117913481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
118013481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28>
118113481Sgiacomo.travaglini@arm.comclass ValueArray28 {
118213481Sgiacomo.travaglini@arm.com public:
118313481Sgiacomo.travaglini@arm.com  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
118413481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
118513481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
118613481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
118713481Sgiacomo.travaglini@arm.com      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
118813481Sgiacomo.travaglini@arm.com      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
118913481Sgiacomo.travaglini@arm.com      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
119013481Sgiacomo.travaglini@arm.com      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
119113481Sgiacomo.travaglini@arm.com
119213481Sgiacomo.travaglini@arm.com  template <typename T>
119313481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
119413481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
119513481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
119613481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
119713481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
119813481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
119913481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
120013481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
120113481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
120213481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
120313481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_)};
120413481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
120513481Sgiacomo.travaglini@arm.com  }
120613481Sgiacomo.travaglini@arm.com
120713481Sgiacomo.travaglini@arm.com private:
120813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
120913481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray28& other);
121013481Sgiacomo.travaglini@arm.com
121113481Sgiacomo.travaglini@arm.com  const T1 v1_;
121213481Sgiacomo.travaglini@arm.com  const T2 v2_;
121313481Sgiacomo.travaglini@arm.com  const T3 v3_;
121413481Sgiacomo.travaglini@arm.com  const T4 v4_;
121513481Sgiacomo.travaglini@arm.com  const T5 v5_;
121613481Sgiacomo.travaglini@arm.com  const T6 v6_;
121713481Sgiacomo.travaglini@arm.com  const T7 v7_;
121813481Sgiacomo.travaglini@arm.com  const T8 v8_;
121913481Sgiacomo.travaglini@arm.com  const T9 v9_;
122013481Sgiacomo.travaglini@arm.com  const T10 v10_;
122113481Sgiacomo.travaglini@arm.com  const T11 v11_;
122213481Sgiacomo.travaglini@arm.com  const T12 v12_;
122313481Sgiacomo.travaglini@arm.com  const T13 v13_;
122413481Sgiacomo.travaglini@arm.com  const T14 v14_;
122513481Sgiacomo.travaglini@arm.com  const T15 v15_;
122613481Sgiacomo.travaglini@arm.com  const T16 v16_;
122713481Sgiacomo.travaglini@arm.com  const T17 v17_;
122813481Sgiacomo.travaglini@arm.com  const T18 v18_;
122913481Sgiacomo.travaglini@arm.com  const T19 v19_;
123013481Sgiacomo.travaglini@arm.com  const T20 v20_;
123113481Sgiacomo.travaglini@arm.com  const T21 v21_;
123213481Sgiacomo.travaglini@arm.com  const T22 v22_;
123313481Sgiacomo.travaglini@arm.com  const T23 v23_;
123413481Sgiacomo.travaglini@arm.com  const T24 v24_;
123513481Sgiacomo.travaglini@arm.com  const T25 v25_;
123613481Sgiacomo.travaglini@arm.com  const T26 v26_;
123713481Sgiacomo.travaglini@arm.com  const T27 v27_;
123813481Sgiacomo.travaglini@arm.com  const T28 v28_;
123913481Sgiacomo.travaglini@arm.com};
124013481Sgiacomo.travaglini@arm.com
124113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
124213481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
124313481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
124413481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
124513481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
124613481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29>
124713481Sgiacomo.travaglini@arm.comclass ValueArray29 {
124813481Sgiacomo.travaglini@arm.com public:
124913481Sgiacomo.travaglini@arm.com  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
125013481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
125113481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
125213481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
125313481Sgiacomo.travaglini@arm.com      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
125413481Sgiacomo.travaglini@arm.com      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
125513481Sgiacomo.travaglini@arm.com      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
125613481Sgiacomo.travaglini@arm.com      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
125713481Sgiacomo.travaglini@arm.com
125813481Sgiacomo.travaglini@arm.com  template <typename T>
125913481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
126013481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
126113481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
126213481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
126313481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
126413481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
126513481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
126613481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
126713481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
126813481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
126913481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
127013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
127113481Sgiacomo.travaglini@arm.com  }
127213481Sgiacomo.travaglini@arm.com
127313481Sgiacomo.travaglini@arm.com private:
127413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
127513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray29& other);
127613481Sgiacomo.travaglini@arm.com
127713481Sgiacomo.travaglini@arm.com  const T1 v1_;
127813481Sgiacomo.travaglini@arm.com  const T2 v2_;
127913481Sgiacomo.travaglini@arm.com  const T3 v3_;
128013481Sgiacomo.travaglini@arm.com  const T4 v4_;
128113481Sgiacomo.travaglini@arm.com  const T5 v5_;
128213481Sgiacomo.travaglini@arm.com  const T6 v6_;
128313481Sgiacomo.travaglini@arm.com  const T7 v7_;
128413481Sgiacomo.travaglini@arm.com  const T8 v8_;
128513481Sgiacomo.travaglini@arm.com  const T9 v9_;
128613481Sgiacomo.travaglini@arm.com  const T10 v10_;
128713481Sgiacomo.travaglini@arm.com  const T11 v11_;
128813481Sgiacomo.travaglini@arm.com  const T12 v12_;
128913481Sgiacomo.travaglini@arm.com  const T13 v13_;
129013481Sgiacomo.travaglini@arm.com  const T14 v14_;
129113481Sgiacomo.travaglini@arm.com  const T15 v15_;
129213481Sgiacomo.travaglini@arm.com  const T16 v16_;
129313481Sgiacomo.travaglini@arm.com  const T17 v17_;
129413481Sgiacomo.travaglini@arm.com  const T18 v18_;
129513481Sgiacomo.travaglini@arm.com  const T19 v19_;
129613481Sgiacomo.travaglini@arm.com  const T20 v20_;
129713481Sgiacomo.travaglini@arm.com  const T21 v21_;
129813481Sgiacomo.travaglini@arm.com  const T22 v22_;
129913481Sgiacomo.travaglini@arm.com  const T23 v23_;
130013481Sgiacomo.travaglini@arm.com  const T24 v24_;
130113481Sgiacomo.travaglini@arm.com  const T25 v25_;
130213481Sgiacomo.travaglini@arm.com  const T26 v26_;
130313481Sgiacomo.travaglini@arm.com  const T27 v27_;
130413481Sgiacomo.travaglini@arm.com  const T28 v28_;
130513481Sgiacomo.travaglini@arm.com  const T29 v29_;
130613481Sgiacomo.travaglini@arm.com};
130713481Sgiacomo.travaglini@arm.com
130813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
130913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
131013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
131113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
131213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
131313481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30>
131413481Sgiacomo.travaglini@arm.comclass ValueArray30 {
131513481Sgiacomo.travaglini@arm.com public:
131613481Sgiacomo.travaglini@arm.com  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
131713481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
131813481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
131913481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
132013481Sgiacomo.travaglini@arm.com      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
132113481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
132213481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
132313481Sgiacomo.travaglini@arm.com      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
132413481Sgiacomo.travaglini@arm.com      v29_(v29), v30_(v30) {}
132513481Sgiacomo.travaglini@arm.com
132613481Sgiacomo.travaglini@arm.com  template <typename T>
132713481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
132813481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
132913481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
133013481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
133113481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
133213481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
133313481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
133413481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
133513481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
133613481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
133713481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
133813481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_)};
133913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
134013481Sgiacomo.travaglini@arm.com  }
134113481Sgiacomo.travaglini@arm.com
134213481Sgiacomo.travaglini@arm.com private:
134313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
134413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray30& other);
134513481Sgiacomo.travaglini@arm.com
134613481Sgiacomo.travaglini@arm.com  const T1 v1_;
134713481Sgiacomo.travaglini@arm.com  const T2 v2_;
134813481Sgiacomo.travaglini@arm.com  const T3 v3_;
134913481Sgiacomo.travaglini@arm.com  const T4 v4_;
135013481Sgiacomo.travaglini@arm.com  const T5 v5_;
135113481Sgiacomo.travaglini@arm.com  const T6 v6_;
135213481Sgiacomo.travaglini@arm.com  const T7 v7_;
135313481Sgiacomo.travaglini@arm.com  const T8 v8_;
135413481Sgiacomo.travaglini@arm.com  const T9 v9_;
135513481Sgiacomo.travaglini@arm.com  const T10 v10_;
135613481Sgiacomo.travaglini@arm.com  const T11 v11_;
135713481Sgiacomo.travaglini@arm.com  const T12 v12_;
135813481Sgiacomo.travaglini@arm.com  const T13 v13_;
135913481Sgiacomo.travaglini@arm.com  const T14 v14_;
136013481Sgiacomo.travaglini@arm.com  const T15 v15_;
136113481Sgiacomo.travaglini@arm.com  const T16 v16_;
136213481Sgiacomo.travaglini@arm.com  const T17 v17_;
136313481Sgiacomo.travaglini@arm.com  const T18 v18_;
136413481Sgiacomo.travaglini@arm.com  const T19 v19_;
136513481Sgiacomo.travaglini@arm.com  const T20 v20_;
136613481Sgiacomo.travaglini@arm.com  const T21 v21_;
136713481Sgiacomo.travaglini@arm.com  const T22 v22_;
136813481Sgiacomo.travaglini@arm.com  const T23 v23_;
136913481Sgiacomo.travaglini@arm.com  const T24 v24_;
137013481Sgiacomo.travaglini@arm.com  const T25 v25_;
137113481Sgiacomo.travaglini@arm.com  const T26 v26_;
137213481Sgiacomo.travaglini@arm.com  const T27 v27_;
137313481Sgiacomo.travaglini@arm.com  const T28 v28_;
137413481Sgiacomo.travaglini@arm.com  const T29 v29_;
137513481Sgiacomo.travaglini@arm.com  const T30 v30_;
137613481Sgiacomo.travaglini@arm.com};
137713481Sgiacomo.travaglini@arm.com
137813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
137913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
138013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
138113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
138213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
138313481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
138413481Sgiacomo.travaglini@arm.com    typename T31>
138513481Sgiacomo.travaglini@arm.comclass ValueArray31 {
138613481Sgiacomo.travaglini@arm.com public:
138713481Sgiacomo.travaglini@arm.com  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
138813481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
138913481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
139013481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
139113481Sgiacomo.travaglini@arm.com      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
139213481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
139313481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
139413481Sgiacomo.travaglini@arm.com      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
139513481Sgiacomo.travaglini@arm.com      v29_(v29), v30_(v30), v31_(v31) {}
139613481Sgiacomo.travaglini@arm.com
139713481Sgiacomo.travaglini@arm.com  template <typename T>
139813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
139913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
140013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
140113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
140213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
140313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
140413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
140513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
140613481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
140713481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
140813481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
140913481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_)};
141013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
141113481Sgiacomo.travaglini@arm.com  }
141213481Sgiacomo.travaglini@arm.com
141313481Sgiacomo.travaglini@arm.com private:
141413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
141513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray31& other);
141613481Sgiacomo.travaglini@arm.com
141713481Sgiacomo.travaglini@arm.com  const T1 v1_;
141813481Sgiacomo.travaglini@arm.com  const T2 v2_;
141913481Sgiacomo.travaglini@arm.com  const T3 v3_;
142013481Sgiacomo.travaglini@arm.com  const T4 v4_;
142113481Sgiacomo.travaglini@arm.com  const T5 v5_;
142213481Sgiacomo.travaglini@arm.com  const T6 v6_;
142313481Sgiacomo.travaglini@arm.com  const T7 v7_;
142413481Sgiacomo.travaglini@arm.com  const T8 v8_;
142513481Sgiacomo.travaglini@arm.com  const T9 v9_;
142613481Sgiacomo.travaglini@arm.com  const T10 v10_;
142713481Sgiacomo.travaglini@arm.com  const T11 v11_;
142813481Sgiacomo.travaglini@arm.com  const T12 v12_;
142913481Sgiacomo.travaglini@arm.com  const T13 v13_;
143013481Sgiacomo.travaglini@arm.com  const T14 v14_;
143113481Sgiacomo.travaglini@arm.com  const T15 v15_;
143213481Sgiacomo.travaglini@arm.com  const T16 v16_;
143313481Sgiacomo.travaglini@arm.com  const T17 v17_;
143413481Sgiacomo.travaglini@arm.com  const T18 v18_;
143513481Sgiacomo.travaglini@arm.com  const T19 v19_;
143613481Sgiacomo.travaglini@arm.com  const T20 v20_;
143713481Sgiacomo.travaglini@arm.com  const T21 v21_;
143813481Sgiacomo.travaglini@arm.com  const T22 v22_;
143913481Sgiacomo.travaglini@arm.com  const T23 v23_;
144013481Sgiacomo.travaglini@arm.com  const T24 v24_;
144113481Sgiacomo.travaglini@arm.com  const T25 v25_;
144213481Sgiacomo.travaglini@arm.com  const T26 v26_;
144313481Sgiacomo.travaglini@arm.com  const T27 v27_;
144413481Sgiacomo.travaglini@arm.com  const T28 v28_;
144513481Sgiacomo.travaglini@arm.com  const T29 v29_;
144613481Sgiacomo.travaglini@arm.com  const T30 v30_;
144713481Sgiacomo.travaglini@arm.com  const T31 v31_;
144813481Sgiacomo.travaglini@arm.com};
144913481Sgiacomo.travaglini@arm.com
145013481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
145113481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
145213481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
145313481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
145413481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
145513481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
145613481Sgiacomo.travaglini@arm.com    typename T31, typename T32>
145713481Sgiacomo.travaglini@arm.comclass ValueArray32 {
145813481Sgiacomo.travaglini@arm.com public:
145913481Sgiacomo.travaglini@arm.com  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
146013481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
146113481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
146213481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
146313481Sgiacomo.travaglini@arm.com      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
146413481Sgiacomo.travaglini@arm.com      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
146513481Sgiacomo.travaglini@arm.com      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
146613481Sgiacomo.travaglini@arm.com      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
146713481Sgiacomo.travaglini@arm.com      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
146813481Sgiacomo.travaglini@arm.com
146913481Sgiacomo.travaglini@arm.com  template <typename T>
147013481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
147113481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
147213481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
147313481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
147413481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
147513481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
147613481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
147713481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
147813481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
147913481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
148013481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
148113481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
148213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
148313481Sgiacomo.travaglini@arm.com  }
148413481Sgiacomo.travaglini@arm.com
148513481Sgiacomo.travaglini@arm.com private:
148613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
148713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray32& other);
148813481Sgiacomo.travaglini@arm.com
148913481Sgiacomo.travaglini@arm.com  const T1 v1_;
149013481Sgiacomo.travaglini@arm.com  const T2 v2_;
149113481Sgiacomo.travaglini@arm.com  const T3 v3_;
149213481Sgiacomo.travaglini@arm.com  const T4 v4_;
149313481Sgiacomo.travaglini@arm.com  const T5 v5_;
149413481Sgiacomo.travaglini@arm.com  const T6 v6_;
149513481Sgiacomo.travaglini@arm.com  const T7 v7_;
149613481Sgiacomo.travaglini@arm.com  const T8 v8_;
149713481Sgiacomo.travaglini@arm.com  const T9 v9_;
149813481Sgiacomo.travaglini@arm.com  const T10 v10_;
149913481Sgiacomo.travaglini@arm.com  const T11 v11_;
150013481Sgiacomo.travaglini@arm.com  const T12 v12_;
150113481Sgiacomo.travaglini@arm.com  const T13 v13_;
150213481Sgiacomo.travaglini@arm.com  const T14 v14_;
150313481Sgiacomo.travaglini@arm.com  const T15 v15_;
150413481Sgiacomo.travaglini@arm.com  const T16 v16_;
150513481Sgiacomo.travaglini@arm.com  const T17 v17_;
150613481Sgiacomo.travaglini@arm.com  const T18 v18_;
150713481Sgiacomo.travaglini@arm.com  const T19 v19_;
150813481Sgiacomo.travaglini@arm.com  const T20 v20_;
150913481Sgiacomo.travaglini@arm.com  const T21 v21_;
151013481Sgiacomo.travaglini@arm.com  const T22 v22_;
151113481Sgiacomo.travaglini@arm.com  const T23 v23_;
151213481Sgiacomo.travaglini@arm.com  const T24 v24_;
151313481Sgiacomo.travaglini@arm.com  const T25 v25_;
151413481Sgiacomo.travaglini@arm.com  const T26 v26_;
151513481Sgiacomo.travaglini@arm.com  const T27 v27_;
151613481Sgiacomo.travaglini@arm.com  const T28 v28_;
151713481Sgiacomo.travaglini@arm.com  const T29 v29_;
151813481Sgiacomo.travaglini@arm.com  const T30 v30_;
151913481Sgiacomo.travaglini@arm.com  const T31 v31_;
152013481Sgiacomo.travaglini@arm.com  const T32 v32_;
152113481Sgiacomo.travaglini@arm.com};
152213481Sgiacomo.travaglini@arm.com
152313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
152413481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
152513481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
152613481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
152713481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
152813481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
152913481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33>
153013481Sgiacomo.travaglini@arm.comclass ValueArray33 {
153113481Sgiacomo.travaglini@arm.com public:
153213481Sgiacomo.travaglini@arm.com  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
153313481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
153413481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
153513481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
153613481Sgiacomo.travaglini@arm.com      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
153713481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
153813481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
153913481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
154013481Sgiacomo.travaglini@arm.com      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
154113481Sgiacomo.travaglini@arm.com      v33_(v33) {}
154213481Sgiacomo.travaglini@arm.com
154313481Sgiacomo.travaglini@arm.com  template <typename T>
154413481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
154513481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
154613481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
154713481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
154813481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
154913481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
155013481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
155113481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
155213481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
155313481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
155413481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
155513481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
155613481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_)};
155713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
155813481Sgiacomo.travaglini@arm.com  }
155913481Sgiacomo.travaglini@arm.com
156013481Sgiacomo.travaglini@arm.com private:
156113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
156213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray33& other);
156313481Sgiacomo.travaglini@arm.com
156413481Sgiacomo.travaglini@arm.com  const T1 v1_;
156513481Sgiacomo.travaglini@arm.com  const T2 v2_;
156613481Sgiacomo.travaglini@arm.com  const T3 v3_;
156713481Sgiacomo.travaglini@arm.com  const T4 v4_;
156813481Sgiacomo.travaglini@arm.com  const T5 v5_;
156913481Sgiacomo.travaglini@arm.com  const T6 v6_;
157013481Sgiacomo.travaglini@arm.com  const T7 v7_;
157113481Sgiacomo.travaglini@arm.com  const T8 v8_;
157213481Sgiacomo.travaglini@arm.com  const T9 v9_;
157313481Sgiacomo.travaglini@arm.com  const T10 v10_;
157413481Sgiacomo.travaglini@arm.com  const T11 v11_;
157513481Sgiacomo.travaglini@arm.com  const T12 v12_;
157613481Sgiacomo.travaglini@arm.com  const T13 v13_;
157713481Sgiacomo.travaglini@arm.com  const T14 v14_;
157813481Sgiacomo.travaglini@arm.com  const T15 v15_;
157913481Sgiacomo.travaglini@arm.com  const T16 v16_;
158013481Sgiacomo.travaglini@arm.com  const T17 v17_;
158113481Sgiacomo.travaglini@arm.com  const T18 v18_;
158213481Sgiacomo.travaglini@arm.com  const T19 v19_;
158313481Sgiacomo.travaglini@arm.com  const T20 v20_;
158413481Sgiacomo.travaglini@arm.com  const T21 v21_;
158513481Sgiacomo.travaglini@arm.com  const T22 v22_;
158613481Sgiacomo.travaglini@arm.com  const T23 v23_;
158713481Sgiacomo.travaglini@arm.com  const T24 v24_;
158813481Sgiacomo.travaglini@arm.com  const T25 v25_;
158913481Sgiacomo.travaglini@arm.com  const T26 v26_;
159013481Sgiacomo.travaglini@arm.com  const T27 v27_;
159113481Sgiacomo.travaglini@arm.com  const T28 v28_;
159213481Sgiacomo.travaglini@arm.com  const T29 v29_;
159313481Sgiacomo.travaglini@arm.com  const T30 v30_;
159413481Sgiacomo.travaglini@arm.com  const T31 v31_;
159513481Sgiacomo.travaglini@arm.com  const T32 v32_;
159613481Sgiacomo.travaglini@arm.com  const T33 v33_;
159713481Sgiacomo.travaglini@arm.com};
159813481Sgiacomo.travaglini@arm.com
159913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160013481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
160113481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
160213481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
160313481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
160413481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
160513481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34>
160613481Sgiacomo.travaglini@arm.comclass ValueArray34 {
160713481Sgiacomo.travaglini@arm.com public:
160813481Sgiacomo.travaglini@arm.com  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
160913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
161013481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
161113481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
161213481Sgiacomo.travaglini@arm.com      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
161313481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
161413481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
161513481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
161613481Sgiacomo.travaglini@arm.com      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
161713481Sgiacomo.travaglini@arm.com      v33_(v33), v34_(v34) {}
161813481Sgiacomo.travaglini@arm.com
161913481Sgiacomo.travaglini@arm.com  template <typename T>
162013481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
162113481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
162213481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
162313481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
162413481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
162513481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
162613481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
162713481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
162813481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
162913481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
163013481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
163113481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
163213481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_)};
163313481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
163413481Sgiacomo.travaglini@arm.com  }
163513481Sgiacomo.travaglini@arm.com
163613481Sgiacomo.travaglini@arm.com private:
163713481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
163813481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray34& other);
163913481Sgiacomo.travaglini@arm.com
164013481Sgiacomo.travaglini@arm.com  const T1 v1_;
164113481Sgiacomo.travaglini@arm.com  const T2 v2_;
164213481Sgiacomo.travaglini@arm.com  const T3 v3_;
164313481Sgiacomo.travaglini@arm.com  const T4 v4_;
164413481Sgiacomo.travaglini@arm.com  const T5 v5_;
164513481Sgiacomo.travaglini@arm.com  const T6 v6_;
164613481Sgiacomo.travaglini@arm.com  const T7 v7_;
164713481Sgiacomo.travaglini@arm.com  const T8 v8_;
164813481Sgiacomo.travaglini@arm.com  const T9 v9_;
164913481Sgiacomo.travaglini@arm.com  const T10 v10_;
165013481Sgiacomo.travaglini@arm.com  const T11 v11_;
165113481Sgiacomo.travaglini@arm.com  const T12 v12_;
165213481Sgiacomo.travaglini@arm.com  const T13 v13_;
165313481Sgiacomo.travaglini@arm.com  const T14 v14_;
165413481Sgiacomo.travaglini@arm.com  const T15 v15_;
165513481Sgiacomo.travaglini@arm.com  const T16 v16_;
165613481Sgiacomo.travaglini@arm.com  const T17 v17_;
165713481Sgiacomo.travaglini@arm.com  const T18 v18_;
165813481Sgiacomo.travaglini@arm.com  const T19 v19_;
165913481Sgiacomo.travaglini@arm.com  const T20 v20_;
166013481Sgiacomo.travaglini@arm.com  const T21 v21_;
166113481Sgiacomo.travaglini@arm.com  const T22 v22_;
166213481Sgiacomo.travaglini@arm.com  const T23 v23_;
166313481Sgiacomo.travaglini@arm.com  const T24 v24_;
166413481Sgiacomo.travaglini@arm.com  const T25 v25_;
166513481Sgiacomo.travaglini@arm.com  const T26 v26_;
166613481Sgiacomo.travaglini@arm.com  const T27 v27_;
166713481Sgiacomo.travaglini@arm.com  const T28 v28_;
166813481Sgiacomo.travaglini@arm.com  const T29 v29_;
166913481Sgiacomo.travaglini@arm.com  const T30 v30_;
167013481Sgiacomo.travaglini@arm.com  const T31 v31_;
167113481Sgiacomo.travaglini@arm.com  const T32 v32_;
167213481Sgiacomo.travaglini@arm.com  const T33 v33_;
167313481Sgiacomo.travaglini@arm.com  const T34 v34_;
167413481Sgiacomo.travaglini@arm.com};
167513481Sgiacomo.travaglini@arm.com
167613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
167713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
167813481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
167913481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
168013481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
168113481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
168213481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35>
168313481Sgiacomo.travaglini@arm.comclass ValueArray35 {
168413481Sgiacomo.travaglini@arm.com public:
168513481Sgiacomo.travaglini@arm.com  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
168613481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
168713481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
168813481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
168913481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
169013481Sgiacomo.travaglini@arm.com      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
169113481Sgiacomo.travaglini@arm.com      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
169213481Sgiacomo.travaglini@arm.com      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
169313481Sgiacomo.travaglini@arm.com      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
169413481Sgiacomo.travaglini@arm.com      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
169513481Sgiacomo.travaglini@arm.com
169613481Sgiacomo.travaglini@arm.com  template <typename T>
169713481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
169813481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
169913481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
170013481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
170113481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
170213481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
170313481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
170413481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
170513481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
170613481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
170713481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
170813481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
170913481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
171013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
171113481Sgiacomo.travaglini@arm.com  }
171213481Sgiacomo.travaglini@arm.com
171313481Sgiacomo.travaglini@arm.com private:
171413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
171513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray35& other);
171613481Sgiacomo.travaglini@arm.com
171713481Sgiacomo.travaglini@arm.com  const T1 v1_;
171813481Sgiacomo.travaglini@arm.com  const T2 v2_;
171913481Sgiacomo.travaglini@arm.com  const T3 v3_;
172013481Sgiacomo.travaglini@arm.com  const T4 v4_;
172113481Sgiacomo.travaglini@arm.com  const T5 v5_;
172213481Sgiacomo.travaglini@arm.com  const T6 v6_;
172313481Sgiacomo.travaglini@arm.com  const T7 v7_;
172413481Sgiacomo.travaglini@arm.com  const T8 v8_;
172513481Sgiacomo.travaglini@arm.com  const T9 v9_;
172613481Sgiacomo.travaglini@arm.com  const T10 v10_;
172713481Sgiacomo.travaglini@arm.com  const T11 v11_;
172813481Sgiacomo.travaglini@arm.com  const T12 v12_;
172913481Sgiacomo.travaglini@arm.com  const T13 v13_;
173013481Sgiacomo.travaglini@arm.com  const T14 v14_;
173113481Sgiacomo.travaglini@arm.com  const T15 v15_;
173213481Sgiacomo.travaglini@arm.com  const T16 v16_;
173313481Sgiacomo.travaglini@arm.com  const T17 v17_;
173413481Sgiacomo.travaglini@arm.com  const T18 v18_;
173513481Sgiacomo.travaglini@arm.com  const T19 v19_;
173613481Sgiacomo.travaglini@arm.com  const T20 v20_;
173713481Sgiacomo.travaglini@arm.com  const T21 v21_;
173813481Sgiacomo.travaglini@arm.com  const T22 v22_;
173913481Sgiacomo.travaglini@arm.com  const T23 v23_;
174013481Sgiacomo.travaglini@arm.com  const T24 v24_;
174113481Sgiacomo.travaglini@arm.com  const T25 v25_;
174213481Sgiacomo.travaglini@arm.com  const T26 v26_;
174313481Sgiacomo.travaglini@arm.com  const T27 v27_;
174413481Sgiacomo.travaglini@arm.com  const T28 v28_;
174513481Sgiacomo.travaglini@arm.com  const T29 v29_;
174613481Sgiacomo.travaglini@arm.com  const T30 v30_;
174713481Sgiacomo.travaglini@arm.com  const T31 v31_;
174813481Sgiacomo.travaglini@arm.com  const T32 v32_;
174913481Sgiacomo.travaglini@arm.com  const T33 v33_;
175013481Sgiacomo.travaglini@arm.com  const T34 v34_;
175113481Sgiacomo.travaglini@arm.com  const T35 v35_;
175213481Sgiacomo.travaglini@arm.com};
175313481Sgiacomo.travaglini@arm.com
175413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
175513481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
175613481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
175713481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
175813481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
175913481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
176013481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
176113481Sgiacomo.travaglini@arm.com    typename T36>
176213481Sgiacomo.travaglini@arm.comclass ValueArray36 {
176313481Sgiacomo.travaglini@arm.com public:
176413481Sgiacomo.travaglini@arm.com  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
176513481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
176613481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
176713481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
176813481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
176913481Sgiacomo.travaglini@arm.com      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
177013481Sgiacomo.travaglini@arm.com      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
177113481Sgiacomo.travaglini@arm.com      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
177213481Sgiacomo.travaglini@arm.com      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
177313481Sgiacomo.travaglini@arm.com      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
177413481Sgiacomo.travaglini@arm.com
177513481Sgiacomo.travaglini@arm.com  template <typename T>
177613481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
177713481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
177813481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
177913481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
178013481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
178113481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
178213481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
178313481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
178413481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
178513481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
178613481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
178713481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
178813481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
178913481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_)};
179013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
179113481Sgiacomo.travaglini@arm.com  }
179213481Sgiacomo.travaglini@arm.com
179313481Sgiacomo.travaglini@arm.com private:
179413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
179513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray36& other);
179613481Sgiacomo.travaglini@arm.com
179713481Sgiacomo.travaglini@arm.com  const T1 v1_;
179813481Sgiacomo.travaglini@arm.com  const T2 v2_;
179913481Sgiacomo.travaglini@arm.com  const T3 v3_;
180013481Sgiacomo.travaglini@arm.com  const T4 v4_;
180113481Sgiacomo.travaglini@arm.com  const T5 v5_;
180213481Sgiacomo.travaglini@arm.com  const T6 v6_;
180313481Sgiacomo.travaglini@arm.com  const T7 v7_;
180413481Sgiacomo.travaglini@arm.com  const T8 v8_;
180513481Sgiacomo.travaglini@arm.com  const T9 v9_;
180613481Sgiacomo.travaglini@arm.com  const T10 v10_;
180713481Sgiacomo.travaglini@arm.com  const T11 v11_;
180813481Sgiacomo.travaglini@arm.com  const T12 v12_;
180913481Sgiacomo.travaglini@arm.com  const T13 v13_;
181013481Sgiacomo.travaglini@arm.com  const T14 v14_;
181113481Sgiacomo.travaglini@arm.com  const T15 v15_;
181213481Sgiacomo.travaglini@arm.com  const T16 v16_;
181313481Sgiacomo.travaglini@arm.com  const T17 v17_;
181413481Sgiacomo.travaglini@arm.com  const T18 v18_;
181513481Sgiacomo.travaglini@arm.com  const T19 v19_;
181613481Sgiacomo.travaglini@arm.com  const T20 v20_;
181713481Sgiacomo.travaglini@arm.com  const T21 v21_;
181813481Sgiacomo.travaglini@arm.com  const T22 v22_;
181913481Sgiacomo.travaglini@arm.com  const T23 v23_;
182013481Sgiacomo.travaglini@arm.com  const T24 v24_;
182113481Sgiacomo.travaglini@arm.com  const T25 v25_;
182213481Sgiacomo.travaglini@arm.com  const T26 v26_;
182313481Sgiacomo.travaglini@arm.com  const T27 v27_;
182413481Sgiacomo.travaglini@arm.com  const T28 v28_;
182513481Sgiacomo.travaglini@arm.com  const T29 v29_;
182613481Sgiacomo.travaglini@arm.com  const T30 v30_;
182713481Sgiacomo.travaglini@arm.com  const T31 v31_;
182813481Sgiacomo.travaglini@arm.com  const T32 v32_;
182913481Sgiacomo.travaglini@arm.com  const T33 v33_;
183013481Sgiacomo.travaglini@arm.com  const T34 v34_;
183113481Sgiacomo.travaglini@arm.com  const T35 v35_;
183213481Sgiacomo.travaglini@arm.com  const T36 v36_;
183313481Sgiacomo.travaglini@arm.com};
183413481Sgiacomo.travaglini@arm.com
183513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
183613481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
183713481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
183813481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
183913481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
184013481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
184113481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
184213481Sgiacomo.travaglini@arm.com    typename T36, typename T37>
184313481Sgiacomo.travaglini@arm.comclass ValueArray37 {
184413481Sgiacomo.travaglini@arm.com public:
184513481Sgiacomo.travaglini@arm.com  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
184613481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
184713481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
184813481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
184913481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
185013481Sgiacomo.travaglini@arm.com      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
185113481Sgiacomo.travaglini@arm.com      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
185213481Sgiacomo.travaglini@arm.com      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
185313481Sgiacomo.travaglini@arm.com      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
185413481Sgiacomo.travaglini@arm.com      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
185513481Sgiacomo.travaglini@arm.com      v36_(v36), v37_(v37) {}
185613481Sgiacomo.travaglini@arm.com
185713481Sgiacomo.travaglini@arm.com  template <typename T>
185813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
185913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
186013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
186113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
186213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
186313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
186413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
186513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
186613481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
186713481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
186813481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
186913481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
187013481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
187113481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_)};
187213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
187313481Sgiacomo.travaglini@arm.com  }
187413481Sgiacomo.travaglini@arm.com
187513481Sgiacomo.travaglini@arm.com private:
187613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
187713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray37& other);
187813481Sgiacomo.travaglini@arm.com
187913481Sgiacomo.travaglini@arm.com  const T1 v1_;
188013481Sgiacomo.travaglini@arm.com  const T2 v2_;
188113481Sgiacomo.travaglini@arm.com  const T3 v3_;
188213481Sgiacomo.travaglini@arm.com  const T4 v4_;
188313481Sgiacomo.travaglini@arm.com  const T5 v5_;
188413481Sgiacomo.travaglini@arm.com  const T6 v6_;
188513481Sgiacomo.travaglini@arm.com  const T7 v7_;
188613481Sgiacomo.travaglini@arm.com  const T8 v8_;
188713481Sgiacomo.travaglini@arm.com  const T9 v9_;
188813481Sgiacomo.travaglini@arm.com  const T10 v10_;
188913481Sgiacomo.travaglini@arm.com  const T11 v11_;
189013481Sgiacomo.travaglini@arm.com  const T12 v12_;
189113481Sgiacomo.travaglini@arm.com  const T13 v13_;
189213481Sgiacomo.travaglini@arm.com  const T14 v14_;
189313481Sgiacomo.travaglini@arm.com  const T15 v15_;
189413481Sgiacomo.travaglini@arm.com  const T16 v16_;
189513481Sgiacomo.travaglini@arm.com  const T17 v17_;
189613481Sgiacomo.travaglini@arm.com  const T18 v18_;
189713481Sgiacomo.travaglini@arm.com  const T19 v19_;
189813481Sgiacomo.travaglini@arm.com  const T20 v20_;
189913481Sgiacomo.travaglini@arm.com  const T21 v21_;
190013481Sgiacomo.travaglini@arm.com  const T22 v22_;
190113481Sgiacomo.travaglini@arm.com  const T23 v23_;
190213481Sgiacomo.travaglini@arm.com  const T24 v24_;
190313481Sgiacomo.travaglini@arm.com  const T25 v25_;
190413481Sgiacomo.travaglini@arm.com  const T26 v26_;
190513481Sgiacomo.travaglini@arm.com  const T27 v27_;
190613481Sgiacomo.travaglini@arm.com  const T28 v28_;
190713481Sgiacomo.travaglini@arm.com  const T29 v29_;
190813481Sgiacomo.travaglini@arm.com  const T30 v30_;
190913481Sgiacomo.travaglini@arm.com  const T31 v31_;
191013481Sgiacomo.travaglini@arm.com  const T32 v32_;
191113481Sgiacomo.travaglini@arm.com  const T33 v33_;
191213481Sgiacomo.travaglini@arm.com  const T34 v34_;
191313481Sgiacomo.travaglini@arm.com  const T35 v35_;
191413481Sgiacomo.travaglini@arm.com  const T36 v36_;
191513481Sgiacomo.travaglini@arm.com  const T37 v37_;
191613481Sgiacomo.travaglini@arm.com};
191713481Sgiacomo.travaglini@arm.com
191813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
191913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
192013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
192113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
192213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
192313481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
192413481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
192513481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38>
192613481Sgiacomo.travaglini@arm.comclass ValueArray38 {
192713481Sgiacomo.travaglini@arm.com public:
192813481Sgiacomo.travaglini@arm.com  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
192913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
193013481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
193113481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
193213481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
193313481Sgiacomo.travaglini@arm.com      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
193413481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
193513481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
193613481Sgiacomo.travaglini@arm.com      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
193713481Sgiacomo.travaglini@arm.com      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
193813481Sgiacomo.travaglini@arm.com      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
193913481Sgiacomo.travaglini@arm.com
194013481Sgiacomo.travaglini@arm.com  template <typename T>
194113481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
194213481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
194313481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
194413481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
194513481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
194613481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
194713481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
194813481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
194913481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
195013481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
195113481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
195213481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
195313481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
195413481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
195513481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
195613481Sgiacomo.travaglini@arm.com  }
195713481Sgiacomo.travaglini@arm.com
195813481Sgiacomo.travaglini@arm.com private:
195913481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
196013481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray38& other);
196113481Sgiacomo.travaglini@arm.com
196213481Sgiacomo.travaglini@arm.com  const T1 v1_;
196313481Sgiacomo.travaglini@arm.com  const T2 v2_;
196413481Sgiacomo.travaglini@arm.com  const T3 v3_;
196513481Sgiacomo.travaglini@arm.com  const T4 v4_;
196613481Sgiacomo.travaglini@arm.com  const T5 v5_;
196713481Sgiacomo.travaglini@arm.com  const T6 v6_;
196813481Sgiacomo.travaglini@arm.com  const T7 v7_;
196913481Sgiacomo.travaglini@arm.com  const T8 v8_;
197013481Sgiacomo.travaglini@arm.com  const T9 v9_;
197113481Sgiacomo.travaglini@arm.com  const T10 v10_;
197213481Sgiacomo.travaglini@arm.com  const T11 v11_;
197313481Sgiacomo.travaglini@arm.com  const T12 v12_;
197413481Sgiacomo.travaglini@arm.com  const T13 v13_;
197513481Sgiacomo.travaglini@arm.com  const T14 v14_;
197613481Sgiacomo.travaglini@arm.com  const T15 v15_;
197713481Sgiacomo.travaglini@arm.com  const T16 v16_;
197813481Sgiacomo.travaglini@arm.com  const T17 v17_;
197913481Sgiacomo.travaglini@arm.com  const T18 v18_;
198013481Sgiacomo.travaglini@arm.com  const T19 v19_;
198113481Sgiacomo.travaglini@arm.com  const T20 v20_;
198213481Sgiacomo.travaglini@arm.com  const T21 v21_;
198313481Sgiacomo.travaglini@arm.com  const T22 v22_;
198413481Sgiacomo.travaglini@arm.com  const T23 v23_;
198513481Sgiacomo.travaglini@arm.com  const T24 v24_;
198613481Sgiacomo.travaglini@arm.com  const T25 v25_;
198713481Sgiacomo.travaglini@arm.com  const T26 v26_;
198813481Sgiacomo.travaglini@arm.com  const T27 v27_;
198913481Sgiacomo.travaglini@arm.com  const T28 v28_;
199013481Sgiacomo.travaglini@arm.com  const T29 v29_;
199113481Sgiacomo.travaglini@arm.com  const T30 v30_;
199213481Sgiacomo.travaglini@arm.com  const T31 v31_;
199313481Sgiacomo.travaglini@arm.com  const T32 v32_;
199413481Sgiacomo.travaglini@arm.com  const T33 v33_;
199513481Sgiacomo.travaglini@arm.com  const T34 v34_;
199613481Sgiacomo.travaglini@arm.com  const T35 v35_;
199713481Sgiacomo.travaglini@arm.com  const T36 v36_;
199813481Sgiacomo.travaglini@arm.com  const T37 v37_;
199913481Sgiacomo.travaglini@arm.com  const T38 v38_;
200013481Sgiacomo.travaglini@arm.com};
200113481Sgiacomo.travaglini@arm.com
200213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
200313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
200413481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
200513481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
200613481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
200713481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
200813481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
200913481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39>
201013481Sgiacomo.travaglini@arm.comclass ValueArray39 {
201113481Sgiacomo.travaglini@arm.com public:
201213481Sgiacomo.travaglini@arm.com  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
201313481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
201413481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
201513481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
201613481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
201713481Sgiacomo.travaglini@arm.com      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
201813481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
201913481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
202013481Sgiacomo.travaglini@arm.com      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
202113481Sgiacomo.travaglini@arm.com      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
202213481Sgiacomo.travaglini@arm.com      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
202313481Sgiacomo.travaglini@arm.com
202413481Sgiacomo.travaglini@arm.com  template <typename T>
202513481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
202613481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
202713481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
202813481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
202913481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
203013481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
203113481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
203213481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
203313481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
203413481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
203513481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
203613481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
203713481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
203813481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
203913481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_)};
204013481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
204113481Sgiacomo.travaglini@arm.com  }
204213481Sgiacomo.travaglini@arm.com
204313481Sgiacomo.travaglini@arm.com private:
204413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
204513481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray39& other);
204613481Sgiacomo.travaglini@arm.com
204713481Sgiacomo.travaglini@arm.com  const T1 v1_;
204813481Sgiacomo.travaglini@arm.com  const T2 v2_;
204913481Sgiacomo.travaglini@arm.com  const T3 v3_;
205013481Sgiacomo.travaglini@arm.com  const T4 v4_;
205113481Sgiacomo.travaglini@arm.com  const T5 v5_;
205213481Sgiacomo.travaglini@arm.com  const T6 v6_;
205313481Sgiacomo.travaglini@arm.com  const T7 v7_;
205413481Sgiacomo.travaglini@arm.com  const T8 v8_;
205513481Sgiacomo.travaglini@arm.com  const T9 v9_;
205613481Sgiacomo.travaglini@arm.com  const T10 v10_;
205713481Sgiacomo.travaglini@arm.com  const T11 v11_;
205813481Sgiacomo.travaglini@arm.com  const T12 v12_;
205913481Sgiacomo.travaglini@arm.com  const T13 v13_;
206013481Sgiacomo.travaglini@arm.com  const T14 v14_;
206113481Sgiacomo.travaglini@arm.com  const T15 v15_;
206213481Sgiacomo.travaglini@arm.com  const T16 v16_;
206313481Sgiacomo.travaglini@arm.com  const T17 v17_;
206413481Sgiacomo.travaglini@arm.com  const T18 v18_;
206513481Sgiacomo.travaglini@arm.com  const T19 v19_;
206613481Sgiacomo.travaglini@arm.com  const T20 v20_;
206713481Sgiacomo.travaglini@arm.com  const T21 v21_;
206813481Sgiacomo.travaglini@arm.com  const T22 v22_;
206913481Sgiacomo.travaglini@arm.com  const T23 v23_;
207013481Sgiacomo.travaglini@arm.com  const T24 v24_;
207113481Sgiacomo.travaglini@arm.com  const T25 v25_;
207213481Sgiacomo.travaglini@arm.com  const T26 v26_;
207313481Sgiacomo.travaglini@arm.com  const T27 v27_;
207413481Sgiacomo.travaglini@arm.com  const T28 v28_;
207513481Sgiacomo.travaglini@arm.com  const T29 v29_;
207613481Sgiacomo.travaglini@arm.com  const T30 v30_;
207713481Sgiacomo.travaglini@arm.com  const T31 v31_;
207813481Sgiacomo.travaglini@arm.com  const T32 v32_;
207913481Sgiacomo.travaglini@arm.com  const T33 v33_;
208013481Sgiacomo.travaglini@arm.com  const T34 v34_;
208113481Sgiacomo.travaglini@arm.com  const T35 v35_;
208213481Sgiacomo.travaglini@arm.com  const T36 v36_;
208313481Sgiacomo.travaglini@arm.com  const T37 v37_;
208413481Sgiacomo.travaglini@arm.com  const T38 v38_;
208513481Sgiacomo.travaglini@arm.com  const T39 v39_;
208613481Sgiacomo.travaglini@arm.com};
208713481Sgiacomo.travaglini@arm.com
208813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
208913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
209013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
209113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
209213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
209313481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
209413481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
209513481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40>
209613481Sgiacomo.travaglini@arm.comclass ValueArray40 {
209713481Sgiacomo.travaglini@arm.com public:
209813481Sgiacomo.travaglini@arm.com  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
209913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
210013481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
210113481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
210213481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
210313481Sgiacomo.travaglini@arm.com      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
210413481Sgiacomo.travaglini@arm.com      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
210513481Sgiacomo.travaglini@arm.com      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
210613481Sgiacomo.travaglini@arm.com      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
210713481Sgiacomo.travaglini@arm.com      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
210813481Sgiacomo.travaglini@arm.com      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
210913481Sgiacomo.travaglini@arm.com      v40_(v40) {}
211013481Sgiacomo.travaglini@arm.com
211113481Sgiacomo.travaglini@arm.com  template <typename T>
211213481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
211313481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
211413481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
211513481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
211613481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
211713481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
211813481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
211913481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
212013481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
212113481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
212213481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
212313481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
212413481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
212513481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
212613481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_)};
212713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
212813481Sgiacomo.travaglini@arm.com  }
212913481Sgiacomo.travaglini@arm.com
213013481Sgiacomo.travaglini@arm.com private:
213113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
213213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray40& other);
213313481Sgiacomo.travaglini@arm.com
213413481Sgiacomo.travaglini@arm.com  const T1 v1_;
213513481Sgiacomo.travaglini@arm.com  const T2 v2_;
213613481Sgiacomo.travaglini@arm.com  const T3 v3_;
213713481Sgiacomo.travaglini@arm.com  const T4 v4_;
213813481Sgiacomo.travaglini@arm.com  const T5 v5_;
213913481Sgiacomo.travaglini@arm.com  const T6 v6_;
214013481Sgiacomo.travaglini@arm.com  const T7 v7_;
214113481Sgiacomo.travaglini@arm.com  const T8 v8_;
214213481Sgiacomo.travaglini@arm.com  const T9 v9_;
214313481Sgiacomo.travaglini@arm.com  const T10 v10_;
214413481Sgiacomo.travaglini@arm.com  const T11 v11_;
214513481Sgiacomo.travaglini@arm.com  const T12 v12_;
214613481Sgiacomo.travaglini@arm.com  const T13 v13_;
214713481Sgiacomo.travaglini@arm.com  const T14 v14_;
214813481Sgiacomo.travaglini@arm.com  const T15 v15_;
214913481Sgiacomo.travaglini@arm.com  const T16 v16_;
215013481Sgiacomo.travaglini@arm.com  const T17 v17_;
215113481Sgiacomo.travaglini@arm.com  const T18 v18_;
215213481Sgiacomo.travaglini@arm.com  const T19 v19_;
215313481Sgiacomo.travaglini@arm.com  const T20 v20_;
215413481Sgiacomo.travaglini@arm.com  const T21 v21_;
215513481Sgiacomo.travaglini@arm.com  const T22 v22_;
215613481Sgiacomo.travaglini@arm.com  const T23 v23_;
215713481Sgiacomo.travaglini@arm.com  const T24 v24_;
215813481Sgiacomo.travaglini@arm.com  const T25 v25_;
215913481Sgiacomo.travaglini@arm.com  const T26 v26_;
216013481Sgiacomo.travaglini@arm.com  const T27 v27_;
216113481Sgiacomo.travaglini@arm.com  const T28 v28_;
216213481Sgiacomo.travaglini@arm.com  const T29 v29_;
216313481Sgiacomo.travaglini@arm.com  const T30 v30_;
216413481Sgiacomo.travaglini@arm.com  const T31 v31_;
216513481Sgiacomo.travaglini@arm.com  const T32 v32_;
216613481Sgiacomo.travaglini@arm.com  const T33 v33_;
216713481Sgiacomo.travaglini@arm.com  const T34 v34_;
216813481Sgiacomo.travaglini@arm.com  const T35 v35_;
216913481Sgiacomo.travaglini@arm.com  const T36 v36_;
217013481Sgiacomo.travaglini@arm.com  const T37 v37_;
217113481Sgiacomo.travaglini@arm.com  const T38 v38_;
217213481Sgiacomo.travaglini@arm.com  const T39 v39_;
217313481Sgiacomo.travaglini@arm.com  const T40 v40_;
217413481Sgiacomo.travaglini@arm.com};
217513481Sgiacomo.travaglini@arm.com
217613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
217713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
217813481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
217913481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
218013481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
218113481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
218213481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
218313481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
218413481Sgiacomo.travaglini@arm.com    typename T41>
218513481Sgiacomo.travaglini@arm.comclass ValueArray41 {
218613481Sgiacomo.travaglini@arm.com public:
218713481Sgiacomo.travaglini@arm.com  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
218813481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
218913481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
219013481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
219113481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
219213481Sgiacomo.travaglini@arm.com      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
219313481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
219413481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
219513481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
219613481Sgiacomo.travaglini@arm.com      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
219713481Sgiacomo.travaglini@arm.com      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
219813481Sgiacomo.travaglini@arm.com      v39_(v39), v40_(v40), v41_(v41) {}
219913481Sgiacomo.travaglini@arm.com
220013481Sgiacomo.travaglini@arm.com  template <typename T>
220113481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
220213481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
220313481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
220413481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
220513481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
220613481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
220713481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
220813481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
220913481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
221013481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
221113481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
221213481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
221313481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
221413481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
221513481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
221613481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
221713481Sgiacomo.travaglini@arm.com  }
221813481Sgiacomo.travaglini@arm.com
221913481Sgiacomo.travaglini@arm.com private:
222013481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
222113481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray41& other);
222213481Sgiacomo.travaglini@arm.com
222313481Sgiacomo.travaglini@arm.com  const T1 v1_;
222413481Sgiacomo.travaglini@arm.com  const T2 v2_;
222513481Sgiacomo.travaglini@arm.com  const T3 v3_;
222613481Sgiacomo.travaglini@arm.com  const T4 v4_;
222713481Sgiacomo.travaglini@arm.com  const T5 v5_;
222813481Sgiacomo.travaglini@arm.com  const T6 v6_;
222913481Sgiacomo.travaglini@arm.com  const T7 v7_;
223013481Sgiacomo.travaglini@arm.com  const T8 v8_;
223113481Sgiacomo.travaglini@arm.com  const T9 v9_;
223213481Sgiacomo.travaglini@arm.com  const T10 v10_;
223313481Sgiacomo.travaglini@arm.com  const T11 v11_;
223413481Sgiacomo.travaglini@arm.com  const T12 v12_;
223513481Sgiacomo.travaglini@arm.com  const T13 v13_;
223613481Sgiacomo.travaglini@arm.com  const T14 v14_;
223713481Sgiacomo.travaglini@arm.com  const T15 v15_;
223813481Sgiacomo.travaglini@arm.com  const T16 v16_;
223913481Sgiacomo.travaglini@arm.com  const T17 v17_;
224013481Sgiacomo.travaglini@arm.com  const T18 v18_;
224113481Sgiacomo.travaglini@arm.com  const T19 v19_;
224213481Sgiacomo.travaglini@arm.com  const T20 v20_;
224313481Sgiacomo.travaglini@arm.com  const T21 v21_;
224413481Sgiacomo.travaglini@arm.com  const T22 v22_;
224513481Sgiacomo.travaglini@arm.com  const T23 v23_;
224613481Sgiacomo.travaglini@arm.com  const T24 v24_;
224713481Sgiacomo.travaglini@arm.com  const T25 v25_;
224813481Sgiacomo.travaglini@arm.com  const T26 v26_;
224913481Sgiacomo.travaglini@arm.com  const T27 v27_;
225013481Sgiacomo.travaglini@arm.com  const T28 v28_;
225113481Sgiacomo.travaglini@arm.com  const T29 v29_;
225213481Sgiacomo.travaglini@arm.com  const T30 v30_;
225313481Sgiacomo.travaglini@arm.com  const T31 v31_;
225413481Sgiacomo.travaglini@arm.com  const T32 v32_;
225513481Sgiacomo.travaglini@arm.com  const T33 v33_;
225613481Sgiacomo.travaglini@arm.com  const T34 v34_;
225713481Sgiacomo.travaglini@arm.com  const T35 v35_;
225813481Sgiacomo.travaglini@arm.com  const T36 v36_;
225913481Sgiacomo.travaglini@arm.com  const T37 v37_;
226013481Sgiacomo.travaglini@arm.com  const T38 v38_;
226113481Sgiacomo.travaglini@arm.com  const T39 v39_;
226213481Sgiacomo.travaglini@arm.com  const T40 v40_;
226313481Sgiacomo.travaglini@arm.com  const T41 v41_;
226413481Sgiacomo.travaglini@arm.com};
226513481Sgiacomo.travaglini@arm.com
226613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
226713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
226813481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
226913481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
227013481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
227113481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
227213481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
227313481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
227413481Sgiacomo.travaglini@arm.com    typename T41, typename T42>
227513481Sgiacomo.travaglini@arm.comclass ValueArray42 {
227613481Sgiacomo.travaglini@arm.com public:
227713481Sgiacomo.travaglini@arm.com  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
227813481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
227913481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
228013481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
228113481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
228213481Sgiacomo.travaglini@arm.com      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
228313481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
228413481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
228513481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
228613481Sgiacomo.travaglini@arm.com      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
228713481Sgiacomo.travaglini@arm.com      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
228813481Sgiacomo.travaglini@arm.com      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
228913481Sgiacomo.travaglini@arm.com
229013481Sgiacomo.travaglini@arm.com  template <typename T>
229113481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
229213481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
229313481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
229413481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
229513481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
229613481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
229713481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
229813481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
229913481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
230013481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
230113481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
230213481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
230313481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
230413481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
230513481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
230613481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_)};
230713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
230813481Sgiacomo.travaglini@arm.com  }
230913481Sgiacomo.travaglini@arm.com
231013481Sgiacomo.travaglini@arm.com private:
231113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
231213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray42& other);
231313481Sgiacomo.travaglini@arm.com
231413481Sgiacomo.travaglini@arm.com  const T1 v1_;
231513481Sgiacomo.travaglini@arm.com  const T2 v2_;
231613481Sgiacomo.travaglini@arm.com  const T3 v3_;
231713481Sgiacomo.travaglini@arm.com  const T4 v4_;
231813481Sgiacomo.travaglini@arm.com  const T5 v5_;
231913481Sgiacomo.travaglini@arm.com  const T6 v6_;
232013481Sgiacomo.travaglini@arm.com  const T7 v7_;
232113481Sgiacomo.travaglini@arm.com  const T8 v8_;
232213481Sgiacomo.travaglini@arm.com  const T9 v9_;
232313481Sgiacomo.travaglini@arm.com  const T10 v10_;
232413481Sgiacomo.travaglini@arm.com  const T11 v11_;
232513481Sgiacomo.travaglini@arm.com  const T12 v12_;
232613481Sgiacomo.travaglini@arm.com  const T13 v13_;
232713481Sgiacomo.travaglini@arm.com  const T14 v14_;
232813481Sgiacomo.travaglini@arm.com  const T15 v15_;
232913481Sgiacomo.travaglini@arm.com  const T16 v16_;
233013481Sgiacomo.travaglini@arm.com  const T17 v17_;
233113481Sgiacomo.travaglini@arm.com  const T18 v18_;
233213481Sgiacomo.travaglini@arm.com  const T19 v19_;
233313481Sgiacomo.travaglini@arm.com  const T20 v20_;
233413481Sgiacomo.travaglini@arm.com  const T21 v21_;
233513481Sgiacomo.travaglini@arm.com  const T22 v22_;
233613481Sgiacomo.travaglini@arm.com  const T23 v23_;
233713481Sgiacomo.travaglini@arm.com  const T24 v24_;
233813481Sgiacomo.travaglini@arm.com  const T25 v25_;
233913481Sgiacomo.travaglini@arm.com  const T26 v26_;
234013481Sgiacomo.travaglini@arm.com  const T27 v27_;
234113481Sgiacomo.travaglini@arm.com  const T28 v28_;
234213481Sgiacomo.travaglini@arm.com  const T29 v29_;
234313481Sgiacomo.travaglini@arm.com  const T30 v30_;
234413481Sgiacomo.travaglini@arm.com  const T31 v31_;
234513481Sgiacomo.travaglini@arm.com  const T32 v32_;
234613481Sgiacomo.travaglini@arm.com  const T33 v33_;
234713481Sgiacomo.travaglini@arm.com  const T34 v34_;
234813481Sgiacomo.travaglini@arm.com  const T35 v35_;
234913481Sgiacomo.travaglini@arm.com  const T36 v36_;
235013481Sgiacomo.travaglini@arm.com  const T37 v37_;
235113481Sgiacomo.travaglini@arm.com  const T38 v38_;
235213481Sgiacomo.travaglini@arm.com  const T39 v39_;
235313481Sgiacomo.travaglini@arm.com  const T40 v40_;
235413481Sgiacomo.travaglini@arm.com  const T41 v41_;
235513481Sgiacomo.travaglini@arm.com  const T42 v42_;
235613481Sgiacomo.travaglini@arm.com};
235713481Sgiacomo.travaglini@arm.com
235813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
235913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
236013481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
236113481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
236213481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
236313481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
236413481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
236513481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
236613481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43>
236713481Sgiacomo.travaglini@arm.comclass ValueArray43 {
236813481Sgiacomo.travaglini@arm.com public:
236913481Sgiacomo.travaglini@arm.com  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
237013481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
237113481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
237213481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
237313481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
237413481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
237513481Sgiacomo.travaglini@arm.com      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
237613481Sgiacomo.travaglini@arm.com      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
237713481Sgiacomo.travaglini@arm.com      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
237813481Sgiacomo.travaglini@arm.com      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
237913481Sgiacomo.travaglini@arm.com      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
238013481Sgiacomo.travaglini@arm.com      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
238113481Sgiacomo.travaglini@arm.com
238213481Sgiacomo.travaglini@arm.com  template <typename T>
238313481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
238413481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
238513481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
238613481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
238713481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
238813481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
238913481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
239013481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
239113481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
239213481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
239313481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
239413481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
239513481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
239613481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
239713481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
239813481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_)};
239913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
240013481Sgiacomo.travaglini@arm.com  }
240113481Sgiacomo.travaglini@arm.com
240213481Sgiacomo.travaglini@arm.com private:
240313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
240413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray43& other);
240513481Sgiacomo.travaglini@arm.com
240613481Sgiacomo.travaglini@arm.com  const T1 v1_;
240713481Sgiacomo.travaglini@arm.com  const T2 v2_;
240813481Sgiacomo.travaglini@arm.com  const T3 v3_;
240913481Sgiacomo.travaglini@arm.com  const T4 v4_;
241013481Sgiacomo.travaglini@arm.com  const T5 v5_;
241113481Sgiacomo.travaglini@arm.com  const T6 v6_;
241213481Sgiacomo.travaglini@arm.com  const T7 v7_;
241313481Sgiacomo.travaglini@arm.com  const T8 v8_;
241413481Sgiacomo.travaglini@arm.com  const T9 v9_;
241513481Sgiacomo.travaglini@arm.com  const T10 v10_;
241613481Sgiacomo.travaglini@arm.com  const T11 v11_;
241713481Sgiacomo.travaglini@arm.com  const T12 v12_;
241813481Sgiacomo.travaglini@arm.com  const T13 v13_;
241913481Sgiacomo.travaglini@arm.com  const T14 v14_;
242013481Sgiacomo.travaglini@arm.com  const T15 v15_;
242113481Sgiacomo.travaglini@arm.com  const T16 v16_;
242213481Sgiacomo.travaglini@arm.com  const T17 v17_;
242313481Sgiacomo.travaglini@arm.com  const T18 v18_;
242413481Sgiacomo.travaglini@arm.com  const T19 v19_;
242513481Sgiacomo.travaglini@arm.com  const T20 v20_;
242613481Sgiacomo.travaglini@arm.com  const T21 v21_;
242713481Sgiacomo.travaglini@arm.com  const T22 v22_;
242813481Sgiacomo.travaglini@arm.com  const T23 v23_;
242913481Sgiacomo.travaglini@arm.com  const T24 v24_;
243013481Sgiacomo.travaglini@arm.com  const T25 v25_;
243113481Sgiacomo.travaglini@arm.com  const T26 v26_;
243213481Sgiacomo.travaglini@arm.com  const T27 v27_;
243313481Sgiacomo.travaglini@arm.com  const T28 v28_;
243413481Sgiacomo.travaglini@arm.com  const T29 v29_;
243513481Sgiacomo.travaglini@arm.com  const T30 v30_;
243613481Sgiacomo.travaglini@arm.com  const T31 v31_;
243713481Sgiacomo.travaglini@arm.com  const T32 v32_;
243813481Sgiacomo.travaglini@arm.com  const T33 v33_;
243913481Sgiacomo.travaglini@arm.com  const T34 v34_;
244013481Sgiacomo.travaglini@arm.com  const T35 v35_;
244113481Sgiacomo.travaglini@arm.com  const T36 v36_;
244213481Sgiacomo.travaglini@arm.com  const T37 v37_;
244313481Sgiacomo.travaglini@arm.com  const T38 v38_;
244413481Sgiacomo.travaglini@arm.com  const T39 v39_;
244513481Sgiacomo.travaglini@arm.com  const T40 v40_;
244613481Sgiacomo.travaglini@arm.com  const T41 v41_;
244713481Sgiacomo.travaglini@arm.com  const T42 v42_;
244813481Sgiacomo.travaglini@arm.com  const T43 v43_;
244913481Sgiacomo.travaglini@arm.com};
245013481Sgiacomo.travaglini@arm.com
245113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
245213481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
245313481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
245413481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
245513481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
245613481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
245713481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
245813481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
245913481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44>
246013481Sgiacomo.travaglini@arm.comclass ValueArray44 {
246113481Sgiacomo.travaglini@arm.com public:
246213481Sgiacomo.travaglini@arm.com  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
246313481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
246413481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
246513481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
246613481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
246713481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
246813481Sgiacomo.travaglini@arm.com      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
246913481Sgiacomo.travaglini@arm.com      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
247013481Sgiacomo.travaglini@arm.com      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
247113481Sgiacomo.travaglini@arm.com      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
247213481Sgiacomo.travaglini@arm.com      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
247313481Sgiacomo.travaglini@arm.com      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
247413481Sgiacomo.travaglini@arm.com      v43_(v43), v44_(v44) {}
247513481Sgiacomo.travaglini@arm.com
247613481Sgiacomo.travaglini@arm.com  template <typename T>
247713481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
247813481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
247913481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
248013481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
248113481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
248213481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
248313481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
248413481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
248513481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
248613481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
248713481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
248813481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
248913481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
249013481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
249113481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
249213481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
249313481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
249413481Sgiacomo.travaglini@arm.com  }
249513481Sgiacomo.travaglini@arm.com
249613481Sgiacomo.travaglini@arm.com private:
249713481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
249813481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray44& other);
249913481Sgiacomo.travaglini@arm.com
250013481Sgiacomo.travaglini@arm.com  const T1 v1_;
250113481Sgiacomo.travaglini@arm.com  const T2 v2_;
250213481Sgiacomo.travaglini@arm.com  const T3 v3_;
250313481Sgiacomo.travaglini@arm.com  const T4 v4_;
250413481Sgiacomo.travaglini@arm.com  const T5 v5_;
250513481Sgiacomo.travaglini@arm.com  const T6 v6_;
250613481Sgiacomo.travaglini@arm.com  const T7 v7_;
250713481Sgiacomo.travaglini@arm.com  const T8 v8_;
250813481Sgiacomo.travaglini@arm.com  const T9 v9_;
250913481Sgiacomo.travaglini@arm.com  const T10 v10_;
251013481Sgiacomo.travaglini@arm.com  const T11 v11_;
251113481Sgiacomo.travaglini@arm.com  const T12 v12_;
251213481Sgiacomo.travaglini@arm.com  const T13 v13_;
251313481Sgiacomo.travaglini@arm.com  const T14 v14_;
251413481Sgiacomo.travaglini@arm.com  const T15 v15_;
251513481Sgiacomo.travaglini@arm.com  const T16 v16_;
251613481Sgiacomo.travaglini@arm.com  const T17 v17_;
251713481Sgiacomo.travaglini@arm.com  const T18 v18_;
251813481Sgiacomo.travaglini@arm.com  const T19 v19_;
251913481Sgiacomo.travaglini@arm.com  const T20 v20_;
252013481Sgiacomo.travaglini@arm.com  const T21 v21_;
252113481Sgiacomo.travaglini@arm.com  const T22 v22_;
252213481Sgiacomo.travaglini@arm.com  const T23 v23_;
252313481Sgiacomo.travaglini@arm.com  const T24 v24_;
252413481Sgiacomo.travaglini@arm.com  const T25 v25_;
252513481Sgiacomo.travaglini@arm.com  const T26 v26_;
252613481Sgiacomo.travaglini@arm.com  const T27 v27_;
252713481Sgiacomo.travaglini@arm.com  const T28 v28_;
252813481Sgiacomo.travaglini@arm.com  const T29 v29_;
252913481Sgiacomo.travaglini@arm.com  const T30 v30_;
253013481Sgiacomo.travaglini@arm.com  const T31 v31_;
253113481Sgiacomo.travaglini@arm.com  const T32 v32_;
253213481Sgiacomo.travaglini@arm.com  const T33 v33_;
253313481Sgiacomo.travaglini@arm.com  const T34 v34_;
253413481Sgiacomo.travaglini@arm.com  const T35 v35_;
253513481Sgiacomo.travaglini@arm.com  const T36 v36_;
253613481Sgiacomo.travaglini@arm.com  const T37 v37_;
253713481Sgiacomo.travaglini@arm.com  const T38 v38_;
253813481Sgiacomo.travaglini@arm.com  const T39 v39_;
253913481Sgiacomo.travaglini@arm.com  const T40 v40_;
254013481Sgiacomo.travaglini@arm.com  const T41 v41_;
254113481Sgiacomo.travaglini@arm.com  const T42 v42_;
254213481Sgiacomo.travaglini@arm.com  const T43 v43_;
254313481Sgiacomo.travaglini@arm.com  const T44 v44_;
254413481Sgiacomo.travaglini@arm.com};
254513481Sgiacomo.travaglini@arm.com
254613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
254713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
254813481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
254913481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
255013481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
255113481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
255213481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
255313481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
255413481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44, typename T45>
255513481Sgiacomo.travaglini@arm.comclass ValueArray45 {
255613481Sgiacomo.travaglini@arm.com public:
255713481Sgiacomo.travaglini@arm.com  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
255813481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
255913481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
256013481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
256113481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
256213481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
256313481Sgiacomo.travaglini@arm.com      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
256413481Sgiacomo.travaglini@arm.com      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
256513481Sgiacomo.travaglini@arm.com      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
256613481Sgiacomo.travaglini@arm.com      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
256713481Sgiacomo.travaglini@arm.com      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
256813481Sgiacomo.travaglini@arm.com      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
256913481Sgiacomo.travaglini@arm.com      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
257013481Sgiacomo.travaglini@arm.com
257113481Sgiacomo.travaglini@arm.com  template <typename T>
257213481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
257313481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
257413481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
257513481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
257613481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
257713481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
257813481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
257913481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
258013481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
258113481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
258213481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
258313481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
258413481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
258513481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
258613481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
258713481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
258813481Sgiacomo.travaglini@arm.com        static_cast<T>(v45_)};
258913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
259013481Sgiacomo.travaglini@arm.com  }
259113481Sgiacomo.travaglini@arm.com
259213481Sgiacomo.travaglini@arm.com private:
259313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
259413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray45& other);
259513481Sgiacomo.travaglini@arm.com
259613481Sgiacomo.travaglini@arm.com  const T1 v1_;
259713481Sgiacomo.travaglini@arm.com  const T2 v2_;
259813481Sgiacomo.travaglini@arm.com  const T3 v3_;
259913481Sgiacomo.travaglini@arm.com  const T4 v4_;
260013481Sgiacomo.travaglini@arm.com  const T5 v5_;
260113481Sgiacomo.travaglini@arm.com  const T6 v6_;
260213481Sgiacomo.travaglini@arm.com  const T7 v7_;
260313481Sgiacomo.travaglini@arm.com  const T8 v8_;
260413481Sgiacomo.travaglini@arm.com  const T9 v9_;
260513481Sgiacomo.travaglini@arm.com  const T10 v10_;
260613481Sgiacomo.travaglini@arm.com  const T11 v11_;
260713481Sgiacomo.travaglini@arm.com  const T12 v12_;
260813481Sgiacomo.travaglini@arm.com  const T13 v13_;
260913481Sgiacomo.travaglini@arm.com  const T14 v14_;
261013481Sgiacomo.travaglini@arm.com  const T15 v15_;
261113481Sgiacomo.travaglini@arm.com  const T16 v16_;
261213481Sgiacomo.travaglini@arm.com  const T17 v17_;
261313481Sgiacomo.travaglini@arm.com  const T18 v18_;
261413481Sgiacomo.travaglini@arm.com  const T19 v19_;
261513481Sgiacomo.travaglini@arm.com  const T20 v20_;
261613481Sgiacomo.travaglini@arm.com  const T21 v21_;
261713481Sgiacomo.travaglini@arm.com  const T22 v22_;
261813481Sgiacomo.travaglini@arm.com  const T23 v23_;
261913481Sgiacomo.travaglini@arm.com  const T24 v24_;
262013481Sgiacomo.travaglini@arm.com  const T25 v25_;
262113481Sgiacomo.travaglini@arm.com  const T26 v26_;
262213481Sgiacomo.travaglini@arm.com  const T27 v27_;
262313481Sgiacomo.travaglini@arm.com  const T28 v28_;
262413481Sgiacomo.travaglini@arm.com  const T29 v29_;
262513481Sgiacomo.travaglini@arm.com  const T30 v30_;
262613481Sgiacomo.travaglini@arm.com  const T31 v31_;
262713481Sgiacomo.travaglini@arm.com  const T32 v32_;
262813481Sgiacomo.travaglini@arm.com  const T33 v33_;
262913481Sgiacomo.travaglini@arm.com  const T34 v34_;
263013481Sgiacomo.travaglini@arm.com  const T35 v35_;
263113481Sgiacomo.travaglini@arm.com  const T36 v36_;
263213481Sgiacomo.travaglini@arm.com  const T37 v37_;
263313481Sgiacomo.travaglini@arm.com  const T38 v38_;
263413481Sgiacomo.travaglini@arm.com  const T39 v39_;
263513481Sgiacomo.travaglini@arm.com  const T40 v40_;
263613481Sgiacomo.travaglini@arm.com  const T41 v41_;
263713481Sgiacomo.travaglini@arm.com  const T42 v42_;
263813481Sgiacomo.travaglini@arm.com  const T43 v43_;
263913481Sgiacomo.travaglini@arm.com  const T44 v44_;
264013481Sgiacomo.travaglini@arm.com  const T45 v45_;
264113481Sgiacomo.travaglini@arm.com};
264213481Sgiacomo.travaglini@arm.com
264313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
264413481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
264513481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
264613481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
264713481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
264813481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
264913481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
265013481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
265113481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44, typename T45,
265213481Sgiacomo.travaglini@arm.com    typename T46>
265313481Sgiacomo.travaglini@arm.comclass ValueArray46 {
265413481Sgiacomo.travaglini@arm.com public:
265513481Sgiacomo.travaglini@arm.com  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
265613481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
265713481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
265813481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
265913481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
266013481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
266113481Sgiacomo.travaglini@arm.com      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
266213481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
266313481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
266413481Sgiacomo.travaglini@arm.com      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
266513481Sgiacomo.travaglini@arm.com      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
266613481Sgiacomo.travaglini@arm.com      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
266713481Sgiacomo.travaglini@arm.com      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
266813481Sgiacomo.travaglini@arm.com
266913481Sgiacomo.travaglini@arm.com  template <typename T>
267013481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
267113481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
267213481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
267313481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
267413481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
267513481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
267613481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
267713481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
267813481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
267913481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
268013481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
268113481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
268213481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
268313481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
268413481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
268513481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
268613481Sgiacomo.travaglini@arm.com        static_cast<T>(v45_), static_cast<T>(v46_)};
268713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
268813481Sgiacomo.travaglini@arm.com  }
268913481Sgiacomo.travaglini@arm.com
269013481Sgiacomo.travaglini@arm.com private:
269113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
269213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray46& other);
269313481Sgiacomo.travaglini@arm.com
269413481Sgiacomo.travaglini@arm.com  const T1 v1_;
269513481Sgiacomo.travaglini@arm.com  const T2 v2_;
269613481Sgiacomo.travaglini@arm.com  const T3 v3_;
269713481Sgiacomo.travaglini@arm.com  const T4 v4_;
269813481Sgiacomo.travaglini@arm.com  const T5 v5_;
269913481Sgiacomo.travaglini@arm.com  const T6 v6_;
270013481Sgiacomo.travaglini@arm.com  const T7 v7_;
270113481Sgiacomo.travaglini@arm.com  const T8 v8_;
270213481Sgiacomo.travaglini@arm.com  const T9 v9_;
270313481Sgiacomo.travaglini@arm.com  const T10 v10_;
270413481Sgiacomo.travaglini@arm.com  const T11 v11_;
270513481Sgiacomo.travaglini@arm.com  const T12 v12_;
270613481Sgiacomo.travaglini@arm.com  const T13 v13_;
270713481Sgiacomo.travaglini@arm.com  const T14 v14_;
270813481Sgiacomo.travaglini@arm.com  const T15 v15_;
270913481Sgiacomo.travaglini@arm.com  const T16 v16_;
271013481Sgiacomo.travaglini@arm.com  const T17 v17_;
271113481Sgiacomo.travaglini@arm.com  const T18 v18_;
271213481Sgiacomo.travaglini@arm.com  const T19 v19_;
271313481Sgiacomo.travaglini@arm.com  const T20 v20_;
271413481Sgiacomo.travaglini@arm.com  const T21 v21_;
271513481Sgiacomo.travaglini@arm.com  const T22 v22_;
271613481Sgiacomo.travaglini@arm.com  const T23 v23_;
271713481Sgiacomo.travaglini@arm.com  const T24 v24_;
271813481Sgiacomo.travaglini@arm.com  const T25 v25_;
271913481Sgiacomo.travaglini@arm.com  const T26 v26_;
272013481Sgiacomo.travaglini@arm.com  const T27 v27_;
272113481Sgiacomo.travaglini@arm.com  const T28 v28_;
272213481Sgiacomo.travaglini@arm.com  const T29 v29_;
272313481Sgiacomo.travaglini@arm.com  const T30 v30_;
272413481Sgiacomo.travaglini@arm.com  const T31 v31_;
272513481Sgiacomo.travaglini@arm.com  const T32 v32_;
272613481Sgiacomo.travaglini@arm.com  const T33 v33_;
272713481Sgiacomo.travaglini@arm.com  const T34 v34_;
272813481Sgiacomo.travaglini@arm.com  const T35 v35_;
272913481Sgiacomo.travaglini@arm.com  const T36 v36_;
273013481Sgiacomo.travaglini@arm.com  const T37 v37_;
273113481Sgiacomo.travaglini@arm.com  const T38 v38_;
273213481Sgiacomo.travaglini@arm.com  const T39 v39_;
273313481Sgiacomo.travaglini@arm.com  const T40 v40_;
273413481Sgiacomo.travaglini@arm.com  const T41 v41_;
273513481Sgiacomo.travaglini@arm.com  const T42 v42_;
273613481Sgiacomo.travaglini@arm.com  const T43 v43_;
273713481Sgiacomo.travaglini@arm.com  const T44 v44_;
273813481Sgiacomo.travaglini@arm.com  const T45 v45_;
273913481Sgiacomo.travaglini@arm.com  const T46 v46_;
274013481Sgiacomo.travaglini@arm.com};
274113481Sgiacomo.travaglini@arm.com
274213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
274313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
274413481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
274513481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
274613481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
274713481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
274813481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
274913481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
275013481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44, typename T45,
275113481Sgiacomo.travaglini@arm.com    typename T46, typename T47>
275213481Sgiacomo.travaglini@arm.comclass ValueArray47 {
275313481Sgiacomo.travaglini@arm.com public:
275413481Sgiacomo.travaglini@arm.com  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
275513481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
275613481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
275713481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
275813481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
275913481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
276013481Sgiacomo.travaglini@arm.com      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
276113481Sgiacomo.travaglini@arm.com      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
276213481Sgiacomo.travaglini@arm.com      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
276313481Sgiacomo.travaglini@arm.com      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
276413481Sgiacomo.travaglini@arm.com      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
276513481Sgiacomo.travaglini@arm.com      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
276613481Sgiacomo.travaglini@arm.com      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
276713481Sgiacomo.travaglini@arm.com      v47_(v47) {}
276813481Sgiacomo.travaglini@arm.com
276913481Sgiacomo.travaglini@arm.com  template <typename T>
277013481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
277113481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
277213481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
277313481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
277413481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
277513481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
277613481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
277713481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
277813481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
277913481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
278013481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
278113481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
278213481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
278313481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
278413481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
278513481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
278613481Sgiacomo.travaglini@arm.com        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
278713481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
278813481Sgiacomo.travaglini@arm.com  }
278913481Sgiacomo.travaglini@arm.com
279013481Sgiacomo.travaglini@arm.com private:
279113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
279213481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray47& other);
279313481Sgiacomo.travaglini@arm.com
279413481Sgiacomo.travaglini@arm.com  const T1 v1_;
279513481Sgiacomo.travaglini@arm.com  const T2 v2_;
279613481Sgiacomo.travaglini@arm.com  const T3 v3_;
279713481Sgiacomo.travaglini@arm.com  const T4 v4_;
279813481Sgiacomo.travaglini@arm.com  const T5 v5_;
279913481Sgiacomo.travaglini@arm.com  const T6 v6_;
280013481Sgiacomo.travaglini@arm.com  const T7 v7_;
280113481Sgiacomo.travaglini@arm.com  const T8 v8_;
280213481Sgiacomo.travaglini@arm.com  const T9 v9_;
280313481Sgiacomo.travaglini@arm.com  const T10 v10_;
280413481Sgiacomo.travaglini@arm.com  const T11 v11_;
280513481Sgiacomo.travaglini@arm.com  const T12 v12_;
280613481Sgiacomo.travaglini@arm.com  const T13 v13_;
280713481Sgiacomo.travaglini@arm.com  const T14 v14_;
280813481Sgiacomo.travaglini@arm.com  const T15 v15_;
280913481Sgiacomo.travaglini@arm.com  const T16 v16_;
281013481Sgiacomo.travaglini@arm.com  const T17 v17_;
281113481Sgiacomo.travaglini@arm.com  const T18 v18_;
281213481Sgiacomo.travaglini@arm.com  const T19 v19_;
281313481Sgiacomo.travaglini@arm.com  const T20 v20_;
281413481Sgiacomo.travaglini@arm.com  const T21 v21_;
281513481Sgiacomo.travaglini@arm.com  const T22 v22_;
281613481Sgiacomo.travaglini@arm.com  const T23 v23_;
281713481Sgiacomo.travaglini@arm.com  const T24 v24_;
281813481Sgiacomo.travaglini@arm.com  const T25 v25_;
281913481Sgiacomo.travaglini@arm.com  const T26 v26_;
282013481Sgiacomo.travaglini@arm.com  const T27 v27_;
282113481Sgiacomo.travaglini@arm.com  const T28 v28_;
282213481Sgiacomo.travaglini@arm.com  const T29 v29_;
282313481Sgiacomo.travaglini@arm.com  const T30 v30_;
282413481Sgiacomo.travaglini@arm.com  const T31 v31_;
282513481Sgiacomo.travaglini@arm.com  const T32 v32_;
282613481Sgiacomo.travaglini@arm.com  const T33 v33_;
282713481Sgiacomo.travaglini@arm.com  const T34 v34_;
282813481Sgiacomo.travaglini@arm.com  const T35 v35_;
282913481Sgiacomo.travaglini@arm.com  const T36 v36_;
283013481Sgiacomo.travaglini@arm.com  const T37 v37_;
283113481Sgiacomo.travaglini@arm.com  const T38 v38_;
283213481Sgiacomo.travaglini@arm.com  const T39 v39_;
283313481Sgiacomo.travaglini@arm.com  const T40 v40_;
283413481Sgiacomo.travaglini@arm.com  const T41 v41_;
283513481Sgiacomo.travaglini@arm.com  const T42 v42_;
283613481Sgiacomo.travaglini@arm.com  const T43 v43_;
283713481Sgiacomo.travaglini@arm.com  const T44 v44_;
283813481Sgiacomo.travaglini@arm.com  const T45 v45_;
283913481Sgiacomo.travaglini@arm.com  const T46 v46_;
284013481Sgiacomo.travaglini@arm.com  const T47 v47_;
284113481Sgiacomo.travaglini@arm.com};
284213481Sgiacomo.travaglini@arm.com
284313481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
284413481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
284513481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
284613481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
284713481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
284813481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
284913481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
285013481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
285113481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44, typename T45,
285213481Sgiacomo.travaglini@arm.com    typename T46, typename T47, typename T48>
285313481Sgiacomo.travaglini@arm.comclass ValueArray48 {
285413481Sgiacomo.travaglini@arm.com public:
285513481Sgiacomo.travaglini@arm.com  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
285613481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
285713481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
285813481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
285913481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
286013481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
286113481Sgiacomo.travaglini@arm.com      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
286213481Sgiacomo.travaglini@arm.com      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
286313481Sgiacomo.travaglini@arm.com      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
286413481Sgiacomo.travaglini@arm.com      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
286513481Sgiacomo.travaglini@arm.com      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
286613481Sgiacomo.travaglini@arm.com      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
286713481Sgiacomo.travaglini@arm.com      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
286813481Sgiacomo.travaglini@arm.com      v46_(v46), v47_(v47), v48_(v48) {}
286913481Sgiacomo.travaglini@arm.com
287013481Sgiacomo.travaglini@arm.com  template <typename T>
287113481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
287213481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
287313481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
287413481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
287513481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
287613481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
287713481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
287813481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
287913481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
288013481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
288113481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
288213481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
288313481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
288413481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
288513481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
288613481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
288713481Sgiacomo.travaglini@arm.com        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
288813481Sgiacomo.travaglini@arm.com        static_cast<T>(v48_)};
288913481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
289013481Sgiacomo.travaglini@arm.com  }
289113481Sgiacomo.travaglini@arm.com
289213481Sgiacomo.travaglini@arm.com private:
289313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
289413481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray48& other);
289513481Sgiacomo.travaglini@arm.com
289613481Sgiacomo.travaglini@arm.com  const T1 v1_;
289713481Sgiacomo.travaglini@arm.com  const T2 v2_;
289813481Sgiacomo.travaglini@arm.com  const T3 v3_;
289913481Sgiacomo.travaglini@arm.com  const T4 v4_;
290013481Sgiacomo.travaglini@arm.com  const T5 v5_;
290113481Sgiacomo.travaglini@arm.com  const T6 v6_;
290213481Sgiacomo.travaglini@arm.com  const T7 v7_;
290313481Sgiacomo.travaglini@arm.com  const T8 v8_;
290413481Sgiacomo.travaglini@arm.com  const T9 v9_;
290513481Sgiacomo.travaglini@arm.com  const T10 v10_;
290613481Sgiacomo.travaglini@arm.com  const T11 v11_;
290713481Sgiacomo.travaglini@arm.com  const T12 v12_;
290813481Sgiacomo.travaglini@arm.com  const T13 v13_;
290913481Sgiacomo.travaglini@arm.com  const T14 v14_;
291013481Sgiacomo.travaglini@arm.com  const T15 v15_;
291113481Sgiacomo.travaglini@arm.com  const T16 v16_;
291213481Sgiacomo.travaglini@arm.com  const T17 v17_;
291313481Sgiacomo.travaglini@arm.com  const T18 v18_;
291413481Sgiacomo.travaglini@arm.com  const T19 v19_;
291513481Sgiacomo.travaglini@arm.com  const T20 v20_;
291613481Sgiacomo.travaglini@arm.com  const T21 v21_;
291713481Sgiacomo.travaglini@arm.com  const T22 v22_;
291813481Sgiacomo.travaglini@arm.com  const T23 v23_;
291913481Sgiacomo.travaglini@arm.com  const T24 v24_;
292013481Sgiacomo.travaglini@arm.com  const T25 v25_;
292113481Sgiacomo.travaglini@arm.com  const T26 v26_;
292213481Sgiacomo.travaglini@arm.com  const T27 v27_;
292313481Sgiacomo.travaglini@arm.com  const T28 v28_;
292413481Sgiacomo.travaglini@arm.com  const T29 v29_;
292513481Sgiacomo.travaglini@arm.com  const T30 v30_;
292613481Sgiacomo.travaglini@arm.com  const T31 v31_;
292713481Sgiacomo.travaglini@arm.com  const T32 v32_;
292813481Sgiacomo.travaglini@arm.com  const T33 v33_;
292913481Sgiacomo.travaglini@arm.com  const T34 v34_;
293013481Sgiacomo.travaglini@arm.com  const T35 v35_;
293113481Sgiacomo.travaglini@arm.com  const T36 v36_;
293213481Sgiacomo.travaglini@arm.com  const T37 v37_;
293313481Sgiacomo.travaglini@arm.com  const T38 v38_;
293413481Sgiacomo.travaglini@arm.com  const T39 v39_;
293513481Sgiacomo.travaglini@arm.com  const T40 v40_;
293613481Sgiacomo.travaglini@arm.com  const T41 v41_;
293713481Sgiacomo.travaglini@arm.com  const T42 v42_;
293813481Sgiacomo.travaglini@arm.com  const T43 v43_;
293913481Sgiacomo.travaglini@arm.com  const T44 v44_;
294013481Sgiacomo.travaglini@arm.com  const T45 v45_;
294113481Sgiacomo.travaglini@arm.com  const T46 v46_;
294213481Sgiacomo.travaglini@arm.com  const T47 v47_;
294313481Sgiacomo.travaglini@arm.com  const T48 v48_;
294413481Sgiacomo.travaglini@arm.com};
294513481Sgiacomo.travaglini@arm.com
294613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
294713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
294813481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
294913481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
295013481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
295113481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
295213481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
295313481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
295413481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44, typename T45,
295513481Sgiacomo.travaglini@arm.com    typename T46, typename T47, typename T48, typename T49>
295613481Sgiacomo.travaglini@arm.comclass ValueArray49 {
295713481Sgiacomo.travaglini@arm.com public:
295813481Sgiacomo.travaglini@arm.com  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
295913481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
296013481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
296113481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
296213481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
296313481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
296413481Sgiacomo.travaglini@arm.com      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
296513481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
296613481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
296713481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
296813481Sgiacomo.travaglini@arm.com      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
296913481Sgiacomo.travaglini@arm.com      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
297013481Sgiacomo.travaglini@arm.com      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
297113481Sgiacomo.travaglini@arm.com      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
297213481Sgiacomo.travaglini@arm.com
297313481Sgiacomo.travaglini@arm.com  template <typename T>
297413481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
297513481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
297613481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
297713481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
297813481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
297913481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
298013481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
298113481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
298213481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
298313481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
298413481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
298513481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
298613481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
298713481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
298813481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
298913481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
299013481Sgiacomo.travaglini@arm.com        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
299113481Sgiacomo.travaglini@arm.com        static_cast<T>(v48_), static_cast<T>(v49_)};
299213481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
299313481Sgiacomo.travaglini@arm.com  }
299413481Sgiacomo.travaglini@arm.com
299513481Sgiacomo.travaglini@arm.com private:
299613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
299713481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray49& other);
299813481Sgiacomo.travaglini@arm.com
299913481Sgiacomo.travaglini@arm.com  const T1 v1_;
300013481Sgiacomo.travaglini@arm.com  const T2 v2_;
300113481Sgiacomo.travaglini@arm.com  const T3 v3_;
300213481Sgiacomo.travaglini@arm.com  const T4 v4_;
300313481Sgiacomo.travaglini@arm.com  const T5 v5_;
300413481Sgiacomo.travaglini@arm.com  const T6 v6_;
300513481Sgiacomo.travaglini@arm.com  const T7 v7_;
300613481Sgiacomo.travaglini@arm.com  const T8 v8_;
300713481Sgiacomo.travaglini@arm.com  const T9 v9_;
300813481Sgiacomo.travaglini@arm.com  const T10 v10_;
300913481Sgiacomo.travaglini@arm.com  const T11 v11_;
301013481Sgiacomo.travaglini@arm.com  const T12 v12_;
301113481Sgiacomo.travaglini@arm.com  const T13 v13_;
301213481Sgiacomo.travaglini@arm.com  const T14 v14_;
301313481Sgiacomo.travaglini@arm.com  const T15 v15_;
301413481Sgiacomo.travaglini@arm.com  const T16 v16_;
301513481Sgiacomo.travaglini@arm.com  const T17 v17_;
301613481Sgiacomo.travaglini@arm.com  const T18 v18_;
301713481Sgiacomo.travaglini@arm.com  const T19 v19_;
301813481Sgiacomo.travaglini@arm.com  const T20 v20_;
301913481Sgiacomo.travaglini@arm.com  const T21 v21_;
302013481Sgiacomo.travaglini@arm.com  const T22 v22_;
302113481Sgiacomo.travaglini@arm.com  const T23 v23_;
302213481Sgiacomo.travaglini@arm.com  const T24 v24_;
302313481Sgiacomo.travaglini@arm.com  const T25 v25_;
302413481Sgiacomo.travaglini@arm.com  const T26 v26_;
302513481Sgiacomo.travaglini@arm.com  const T27 v27_;
302613481Sgiacomo.travaglini@arm.com  const T28 v28_;
302713481Sgiacomo.travaglini@arm.com  const T29 v29_;
302813481Sgiacomo.travaglini@arm.com  const T30 v30_;
302913481Sgiacomo.travaglini@arm.com  const T31 v31_;
303013481Sgiacomo.travaglini@arm.com  const T32 v32_;
303113481Sgiacomo.travaglini@arm.com  const T33 v33_;
303213481Sgiacomo.travaglini@arm.com  const T34 v34_;
303313481Sgiacomo.travaglini@arm.com  const T35 v35_;
303413481Sgiacomo.travaglini@arm.com  const T36 v36_;
303513481Sgiacomo.travaglini@arm.com  const T37 v37_;
303613481Sgiacomo.travaglini@arm.com  const T38 v38_;
303713481Sgiacomo.travaglini@arm.com  const T39 v39_;
303813481Sgiacomo.travaglini@arm.com  const T40 v40_;
303913481Sgiacomo.travaglini@arm.com  const T41 v41_;
304013481Sgiacomo.travaglini@arm.com  const T42 v42_;
304113481Sgiacomo.travaglini@arm.com  const T43 v43_;
304213481Sgiacomo.travaglini@arm.com  const T44 v44_;
304313481Sgiacomo.travaglini@arm.com  const T45 v45_;
304413481Sgiacomo.travaglini@arm.com  const T46 v46_;
304513481Sgiacomo.travaglini@arm.com  const T47 v47_;
304613481Sgiacomo.travaglini@arm.com  const T48 v48_;
304713481Sgiacomo.travaglini@arm.com  const T49 v49_;
304813481Sgiacomo.travaglini@arm.com};
304913481Sgiacomo.travaglini@arm.com
305013481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
305113481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10,
305213481Sgiacomo.travaglini@arm.com    typename T11, typename T12, typename T13, typename T14, typename T15,
305313481Sgiacomo.travaglini@arm.com    typename T16, typename T17, typename T18, typename T19, typename T20,
305413481Sgiacomo.travaglini@arm.com    typename T21, typename T22, typename T23, typename T24, typename T25,
305513481Sgiacomo.travaglini@arm.com    typename T26, typename T27, typename T28, typename T29, typename T30,
305613481Sgiacomo.travaglini@arm.com    typename T31, typename T32, typename T33, typename T34, typename T35,
305713481Sgiacomo.travaglini@arm.com    typename T36, typename T37, typename T38, typename T39, typename T40,
305813481Sgiacomo.travaglini@arm.com    typename T41, typename T42, typename T43, typename T44, typename T45,
305913481Sgiacomo.travaglini@arm.com    typename T46, typename T47, typename T48, typename T49, typename T50>
306013481Sgiacomo.travaglini@arm.comclass ValueArray50 {
306113481Sgiacomo.travaglini@arm.com public:
306213481Sgiacomo.travaglini@arm.com  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
306313481Sgiacomo.travaglini@arm.com      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
306413481Sgiacomo.travaglini@arm.com      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
306513481Sgiacomo.travaglini@arm.com      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
306613481Sgiacomo.travaglini@arm.com      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
306713481Sgiacomo.travaglini@arm.com      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
306813481Sgiacomo.travaglini@arm.com      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
306913481Sgiacomo.travaglini@arm.com      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
307013481Sgiacomo.travaglini@arm.com      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
307113481Sgiacomo.travaglini@arm.com      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
307213481Sgiacomo.travaglini@arm.com      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
307313481Sgiacomo.travaglini@arm.com      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
307413481Sgiacomo.travaglini@arm.com      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
307513481Sgiacomo.travaglini@arm.com      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
307613481Sgiacomo.travaglini@arm.com
307713481Sgiacomo.travaglini@arm.com  template <typename T>
307813481Sgiacomo.travaglini@arm.com  operator ParamGenerator<T>() const {
307913481Sgiacomo.travaglini@arm.com    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
308013481Sgiacomo.travaglini@arm.com        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
308113481Sgiacomo.travaglini@arm.com        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
308213481Sgiacomo.travaglini@arm.com        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
308313481Sgiacomo.travaglini@arm.com        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
308413481Sgiacomo.travaglini@arm.com        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
308513481Sgiacomo.travaglini@arm.com        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
308613481Sgiacomo.travaglini@arm.com        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
308713481Sgiacomo.travaglini@arm.com        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
308813481Sgiacomo.travaglini@arm.com        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
308913481Sgiacomo.travaglini@arm.com        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
309013481Sgiacomo.travaglini@arm.com        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
309113481Sgiacomo.travaglini@arm.com        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
309213481Sgiacomo.travaglini@arm.com        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
309313481Sgiacomo.travaglini@arm.com        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
309413481Sgiacomo.travaglini@arm.com        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
309513481Sgiacomo.travaglini@arm.com        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
309613481Sgiacomo.travaglini@arm.com    return ValuesIn(array);
309713481Sgiacomo.travaglini@arm.com  }
309813481Sgiacomo.travaglini@arm.com
309913481Sgiacomo.travaglini@arm.com private:
310013481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
310113481Sgiacomo.travaglini@arm.com  void operator=(const ValueArray50& other);
310213481Sgiacomo.travaglini@arm.com
310313481Sgiacomo.travaglini@arm.com  const T1 v1_;
310413481Sgiacomo.travaglini@arm.com  const T2 v2_;
310513481Sgiacomo.travaglini@arm.com  const T3 v3_;
310613481Sgiacomo.travaglini@arm.com  const T4 v4_;
310713481Sgiacomo.travaglini@arm.com  const T5 v5_;
310813481Sgiacomo.travaglini@arm.com  const T6 v6_;
310913481Sgiacomo.travaglini@arm.com  const T7 v7_;
311013481Sgiacomo.travaglini@arm.com  const T8 v8_;
311113481Sgiacomo.travaglini@arm.com  const T9 v9_;
311213481Sgiacomo.travaglini@arm.com  const T10 v10_;
311313481Sgiacomo.travaglini@arm.com  const T11 v11_;
311413481Sgiacomo.travaglini@arm.com  const T12 v12_;
311513481Sgiacomo.travaglini@arm.com  const T13 v13_;
311613481Sgiacomo.travaglini@arm.com  const T14 v14_;
311713481Sgiacomo.travaglini@arm.com  const T15 v15_;
311813481Sgiacomo.travaglini@arm.com  const T16 v16_;
311913481Sgiacomo.travaglini@arm.com  const T17 v17_;
312013481Sgiacomo.travaglini@arm.com  const T18 v18_;
312113481Sgiacomo.travaglini@arm.com  const T19 v19_;
312213481Sgiacomo.travaglini@arm.com  const T20 v20_;
312313481Sgiacomo.travaglini@arm.com  const T21 v21_;
312413481Sgiacomo.travaglini@arm.com  const T22 v22_;
312513481Sgiacomo.travaglini@arm.com  const T23 v23_;
312613481Sgiacomo.travaglini@arm.com  const T24 v24_;
312713481Sgiacomo.travaglini@arm.com  const T25 v25_;
312813481Sgiacomo.travaglini@arm.com  const T26 v26_;
312913481Sgiacomo.travaglini@arm.com  const T27 v27_;
313013481Sgiacomo.travaglini@arm.com  const T28 v28_;
313113481Sgiacomo.travaglini@arm.com  const T29 v29_;
313213481Sgiacomo.travaglini@arm.com  const T30 v30_;
313313481Sgiacomo.travaglini@arm.com  const T31 v31_;
313413481Sgiacomo.travaglini@arm.com  const T32 v32_;
313513481Sgiacomo.travaglini@arm.com  const T33 v33_;
313613481Sgiacomo.travaglini@arm.com  const T34 v34_;
313713481Sgiacomo.travaglini@arm.com  const T35 v35_;
313813481Sgiacomo.travaglini@arm.com  const T36 v36_;
313913481Sgiacomo.travaglini@arm.com  const T37 v37_;
314013481Sgiacomo.travaglini@arm.com  const T38 v38_;
314113481Sgiacomo.travaglini@arm.com  const T39 v39_;
314213481Sgiacomo.travaglini@arm.com  const T40 v40_;
314313481Sgiacomo.travaglini@arm.com  const T41 v41_;
314413481Sgiacomo.travaglini@arm.com  const T42 v42_;
314513481Sgiacomo.travaglini@arm.com  const T43 v43_;
314613481Sgiacomo.travaglini@arm.com  const T44 v44_;
314713481Sgiacomo.travaglini@arm.com  const T45 v45_;
314813481Sgiacomo.travaglini@arm.com  const T46 v46_;
314913481Sgiacomo.travaglini@arm.com  const T47 v47_;
315013481Sgiacomo.travaglini@arm.com  const T48 v48_;
315113481Sgiacomo.travaglini@arm.com  const T49 v49_;
315213481Sgiacomo.travaglini@arm.com  const T50 v50_;
315313481Sgiacomo.travaglini@arm.com};
315413481Sgiacomo.travaglini@arm.com
315513481Sgiacomo.travaglini@arm.com# if GTEST_HAS_COMBINE
315613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
315713481Sgiacomo.travaglini@arm.com//
315813481Sgiacomo.travaglini@arm.com// Generates values from the Cartesian product of values produced
315913481Sgiacomo.travaglini@arm.com// by the argument generators.
316013481Sgiacomo.travaglini@arm.com//
316113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
316213481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator2
316313481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2> > {
316413481Sgiacomo.travaglini@arm.com public:
316513481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2> ParamType;
316613481Sgiacomo.travaglini@arm.com
316713481Sgiacomo.travaglini@arm.com  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
316813481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2)
316913481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2) {}
317013481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator2() {}
317113481Sgiacomo.travaglini@arm.com
317213481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
317313481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
317413481Sgiacomo.travaglini@arm.com  }
317513481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
317613481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
317713481Sgiacomo.travaglini@arm.com  }
317813481Sgiacomo.travaglini@arm.com
317913481Sgiacomo.travaglini@arm.com private:
318013481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
318113481Sgiacomo.travaglini@arm.com   public:
318213481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
318313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
318413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
318513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
318613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2)
318713481Sgiacomo.travaglini@arm.com        : base_(base),
318813481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
318913481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
319013481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
319113481Sgiacomo.travaglini@arm.com    }
319213481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
319313481Sgiacomo.travaglini@arm.com
319413481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
319513481Sgiacomo.travaglini@arm.com      return base_;
319613481Sgiacomo.travaglini@arm.com    }
319713481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
319813481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
319913481Sgiacomo.travaglini@arm.com    virtual void Advance() {
320013481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
320113481Sgiacomo.travaglini@arm.com      ++current2_;
320213481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
320313481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
320413481Sgiacomo.travaglini@arm.com        ++current1_;
320513481Sgiacomo.travaglini@arm.com      }
320613481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
320713481Sgiacomo.travaglini@arm.com    }
320813481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
320913481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
321013481Sgiacomo.travaglini@arm.com    }
321113481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
321213481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
321313481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
321413481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
321513481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
321613481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
321713481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
321813481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
321913481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
322013481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
322113481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
322213481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
322313481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
322413481Sgiacomo.travaglini@arm.com         (
322513481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
322613481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_);
322713481Sgiacomo.travaglini@arm.com    }
322813481Sgiacomo.travaglini@arm.com
322913481Sgiacomo.travaglini@arm.com   private:
323013481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
323113481Sgiacomo.travaglini@arm.com        : base_(other.base_),
323213481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
323313481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
323413481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
323513481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
323613481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
323713481Sgiacomo.travaglini@arm.com        current2_(other.current2_) {
323813481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
323913481Sgiacomo.travaglini@arm.com    }
324013481Sgiacomo.travaglini@arm.com
324113481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
324213481Sgiacomo.travaglini@arm.com      if (!AtEnd())
324313481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_);
324413481Sgiacomo.travaglini@arm.com    }
324513481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
324613481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
324713481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
324813481Sgiacomo.travaglini@arm.com      return
324913481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
325013481Sgiacomo.travaglini@arm.com          current2_ == end2_;
325113481Sgiacomo.travaglini@arm.com    }
325213481Sgiacomo.travaglini@arm.com
325313481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
325413481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
325513481Sgiacomo.travaglini@arm.com
325613481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
325713481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
325813481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
325913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
326013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
326113481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
326213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
326313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
326413481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
326513481Sgiacomo.travaglini@arm.com    ParamType current_value_;
326613481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator2::Iterator
326713481Sgiacomo.travaglini@arm.com
326813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
326913481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator2& other);
327013481Sgiacomo.travaglini@arm.com
327113481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
327213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
327313481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator2
327413481Sgiacomo.travaglini@arm.com
327513481Sgiacomo.travaglini@arm.com
327613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3>
327713481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator3
327813481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3> > {
327913481Sgiacomo.travaglini@arm.com public:
328013481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3> ParamType;
328113481Sgiacomo.travaglini@arm.com
328213481Sgiacomo.travaglini@arm.com  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
328313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
328413481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3) {}
328513481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator3() {}
328613481Sgiacomo.travaglini@arm.com
328713481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
328813481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
328913481Sgiacomo.travaglini@arm.com        g3_.begin());
329013481Sgiacomo.travaglini@arm.com  }
329113481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
329213481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
329313481Sgiacomo.travaglini@arm.com  }
329413481Sgiacomo.travaglini@arm.com
329513481Sgiacomo.travaglini@arm.com private:
329613481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
329713481Sgiacomo.travaglini@arm.com   public:
329813481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
329913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
330013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
330113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
330213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
330313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
330413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3)
330513481Sgiacomo.travaglini@arm.com        : base_(base),
330613481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
330713481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
330813481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
330913481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
331013481Sgiacomo.travaglini@arm.com    }
331113481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
331213481Sgiacomo.travaglini@arm.com
331313481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
331413481Sgiacomo.travaglini@arm.com      return base_;
331513481Sgiacomo.travaglini@arm.com    }
331613481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
331713481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
331813481Sgiacomo.travaglini@arm.com    virtual void Advance() {
331913481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
332013481Sgiacomo.travaglini@arm.com      ++current3_;
332113481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
332213481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
332313481Sgiacomo.travaglini@arm.com        ++current2_;
332413481Sgiacomo.travaglini@arm.com      }
332513481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
332613481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
332713481Sgiacomo.travaglini@arm.com        ++current1_;
332813481Sgiacomo.travaglini@arm.com      }
332913481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
333013481Sgiacomo.travaglini@arm.com    }
333113481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
333213481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
333313481Sgiacomo.travaglini@arm.com    }
333413481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
333513481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
333613481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
333713481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
333813481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
333913481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
334013481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
334113481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
334213481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
334313481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
334413481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
334513481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
334613481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
334713481Sgiacomo.travaglini@arm.com         (
334813481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
334913481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
335013481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_);
335113481Sgiacomo.travaglini@arm.com    }
335213481Sgiacomo.travaglini@arm.com
335313481Sgiacomo.travaglini@arm.com   private:
335413481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
335513481Sgiacomo.travaglini@arm.com        : base_(other.base_),
335613481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
335713481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
335813481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
335913481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
336013481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
336113481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
336213481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
336313481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
336413481Sgiacomo.travaglini@arm.com        current3_(other.current3_) {
336513481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
336613481Sgiacomo.travaglini@arm.com    }
336713481Sgiacomo.travaglini@arm.com
336813481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
336913481Sgiacomo.travaglini@arm.com      if (!AtEnd())
337013481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_);
337113481Sgiacomo.travaglini@arm.com    }
337213481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
337313481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
337413481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
337513481Sgiacomo.travaglini@arm.com      return
337613481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
337713481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
337813481Sgiacomo.travaglini@arm.com          current3_ == end3_;
337913481Sgiacomo.travaglini@arm.com    }
338013481Sgiacomo.travaglini@arm.com
338113481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
338213481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
338313481Sgiacomo.travaglini@arm.com
338413481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
338513481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
338613481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
338713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
338813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
338913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
339013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
339113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
339213481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
339313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
339413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
339513481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
339613481Sgiacomo.travaglini@arm.com    ParamType current_value_;
339713481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator3::Iterator
339813481Sgiacomo.travaglini@arm.com
339913481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
340013481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator3& other);
340113481Sgiacomo.travaglini@arm.com
340213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
340313481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
340413481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
340513481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator3
340613481Sgiacomo.travaglini@arm.com
340713481Sgiacomo.travaglini@arm.com
340813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4>
340913481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator4
341013481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4> > {
341113481Sgiacomo.travaglini@arm.com public:
341213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4> ParamType;
341313481Sgiacomo.travaglini@arm.com
341413481Sgiacomo.travaglini@arm.com  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
341513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
341613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4)
341713481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
341813481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator4() {}
341913481Sgiacomo.travaglini@arm.com
342013481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
342113481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
342213481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin());
342313481Sgiacomo.travaglini@arm.com  }
342413481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
342513481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
342613481Sgiacomo.travaglini@arm.com        g4_, g4_.end());
342713481Sgiacomo.travaglini@arm.com  }
342813481Sgiacomo.travaglini@arm.com
342913481Sgiacomo.travaglini@arm.com private:
343013481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
343113481Sgiacomo.travaglini@arm.com   public:
343213481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
343313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
343413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
343513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
343613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
343713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
343813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
343913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
344013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4)
344113481Sgiacomo.travaglini@arm.com        : base_(base),
344213481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
344313481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
344413481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
344513481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
344613481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
344713481Sgiacomo.travaglini@arm.com    }
344813481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
344913481Sgiacomo.travaglini@arm.com
345013481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
345113481Sgiacomo.travaglini@arm.com      return base_;
345213481Sgiacomo.travaglini@arm.com    }
345313481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
345413481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
345513481Sgiacomo.travaglini@arm.com    virtual void Advance() {
345613481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
345713481Sgiacomo.travaglini@arm.com      ++current4_;
345813481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
345913481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
346013481Sgiacomo.travaglini@arm.com        ++current3_;
346113481Sgiacomo.travaglini@arm.com      }
346213481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
346313481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
346413481Sgiacomo.travaglini@arm.com        ++current2_;
346513481Sgiacomo.travaglini@arm.com      }
346613481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
346713481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
346813481Sgiacomo.travaglini@arm.com        ++current1_;
346913481Sgiacomo.travaglini@arm.com      }
347013481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
347113481Sgiacomo.travaglini@arm.com    }
347213481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
347313481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
347413481Sgiacomo.travaglini@arm.com    }
347513481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
347613481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
347713481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
347813481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
347913481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
348013481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
348113481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
348213481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
348313481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
348413481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
348513481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
348613481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
348713481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
348813481Sgiacomo.travaglini@arm.com         (
348913481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
349013481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
349113481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
349213481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_);
349313481Sgiacomo.travaglini@arm.com    }
349413481Sgiacomo.travaglini@arm.com
349513481Sgiacomo.travaglini@arm.com   private:
349613481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
349713481Sgiacomo.travaglini@arm.com        : base_(other.base_),
349813481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
349913481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
350013481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
350113481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
350213481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
350313481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
350413481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
350513481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
350613481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
350713481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
350813481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
350913481Sgiacomo.travaglini@arm.com        current4_(other.current4_) {
351013481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
351113481Sgiacomo.travaglini@arm.com    }
351213481Sgiacomo.travaglini@arm.com
351313481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
351413481Sgiacomo.travaglini@arm.com      if (!AtEnd())
351513481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
351613481Sgiacomo.travaglini@arm.com            *current4_);
351713481Sgiacomo.travaglini@arm.com    }
351813481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
351913481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
352013481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
352113481Sgiacomo.travaglini@arm.com      return
352213481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
352313481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
352413481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
352513481Sgiacomo.travaglini@arm.com          current4_ == end4_;
352613481Sgiacomo.travaglini@arm.com    }
352713481Sgiacomo.travaglini@arm.com
352813481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
352913481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
353013481Sgiacomo.travaglini@arm.com
353113481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
353213481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
353313481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
353413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
353513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
353613481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
353713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
353813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
353913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
354013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
354113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
354213481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
354313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
354413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
354513481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
354613481Sgiacomo.travaglini@arm.com    ParamType current_value_;
354713481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator4::Iterator
354813481Sgiacomo.travaglini@arm.com
354913481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
355013481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator4& other);
355113481Sgiacomo.travaglini@arm.com
355213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
355313481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
355413481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
355513481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
355613481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator4
355713481Sgiacomo.travaglini@arm.com
355813481Sgiacomo.travaglini@arm.com
355913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
356013481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator5
356113481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5> > {
356213481Sgiacomo.travaglini@arm.com public:
356313481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4, T5> ParamType;
356413481Sgiacomo.travaglini@arm.com
356513481Sgiacomo.travaglini@arm.com  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
356613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
356713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
356813481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
356913481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator5() {}
357013481Sgiacomo.travaglini@arm.com
357113481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
357213481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
357313481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
357413481Sgiacomo.travaglini@arm.com  }
357513481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
357613481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
357713481Sgiacomo.travaglini@arm.com        g4_, g4_.end(), g5_, g5_.end());
357813481Sgiacomo.travaglini@arm.com  }
357913481Sgiacomo.travaglini@arm.com
358013481Sgiacomo.travaglini@arm.com private:
358113481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
358213481Sgiacomo.travaglini@arm.com   public:
358313481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
358413481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
358513481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
358613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
358713481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
358813481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
358913481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
359013481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
359113481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4,
359213481Sgiacomo.travaglini@arm.com      const ParamGenerator<T5>& g5,
359313481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T5>::iterator& current5)
359413481Sgiacomo.travaglini@arm.com        : base_(base),
359513481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
359613481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
359713481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
359813481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
359913481Sgiacomo.travaglini@arm.com          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
360013481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
360113481Sgiacomo.travaglini@arm.com    }
360213481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
360313481Sgiacomo.travaglini@arm.com
360413481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
360513481Sgiacomo.travaglini@arm.com      return base_;
360613481Sgiacomo.travaglini@arm.com    }
360713481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
360813481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
360913481Sgiacomo.travaglini@arm.com    virtual void Advance() {
361013481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
361113481Sgiacomo.travaglini@arm.com      ++current5_;
361213481Sgiacomo.travaglini@arm.com      if (current5_ == end5_) {
361313481Sgiacomo.travaglini@arm.com        current5_ = begin5_;
361413481Sgiacomo.travaglini@arm.com        ++current4_;
361513481Sgiacomo.travaglini@arm.com      }
361613481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
361713481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
361813481Sgiacomo.travaglini@arm.com        ++current3_;
361913481Sgiacomo.travaglini@arm.com      }
362013481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
362113481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
362213481Sgiacomo.travaglini@arm.com        ++current2_;
362313481Sgiacomo.travaglini@arm.com      }
362413481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
362513481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
362613481Sgiacomo.travaglini@arm.com        ++current1_;
362713481Sgiacomo.travaglini@arm.com      }
362813481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
362913481Sgiacomo.travaglini@arm.com    }
363013481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
363113481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
363213481Sgiacomo.travaglini@arm.com    }
363313481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
363413481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
363513481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
363613481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
363713481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
363813481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
363913481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
364013481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
364113481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
364213481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
364313481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
364413481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
364513481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
364613481Sgiacomo.travaglini@arm.com         (
364713481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
364813481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
364913481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
365013481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_ &&
365113481Sgiacomo.travaglini@arm.com          current5_ == typed_other->current5_);
365213481Sgiacomo.travaglini@arm.com    }
365313481Sgiacomo.travaglini@arm.com
365413481Sgiacomo.travaglini@arm.com   private:
365513481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
365613481Sgiacomo.travaglini@arm.com        : base_(other.base_),
365713481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
365813481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
365913481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
366013481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
366113481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
366213481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
366313481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
366413481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
366513481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
366613481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
366713481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
366813481Sgiacomo.travaglini@arm.com        current4_(other.current4_),
366913481Sgiacomo.travaglini@arm.com        begin5_(other.begin5_),
367013481Sgiacomo.travaglini@arm.com        end5_(other.end5_),
367113481Sgiacomo.travaglini@arm.com        current5_(other.current5_) {
367213481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
367313481Sgiacomo.travaglini@arm.com    }
367413481Sgiacomo.travaglini@arm.com
367513481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
367613481Sgiacomo.travaglini@arm.com      if (!AtEnd())
367713481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
367813481Sgiacomo.travaglini@arm.com            *current4_, *current5_);
367913481Sgiacomo.travaglini@arm.com    }
368013481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
368113481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
368213481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
368313481Sgiacomo.travaglini@arm.com      return
368413481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
368513481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
368613481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
368713481Sgiacomo.travaglini@arm.com          current4_ == end4_ ||
368813481Sgiacomo.travaglini@arm.com          current5_ == end5_;
368913481Sgiacomo.travaglini@arm.com    }
369013481Sgiacomo.travaglini@arm.com
369113481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
369213481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
369313481Sgiacomo.travaglini@arm.com
369413481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
369513481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
369613481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
369713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
369813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
369913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
370013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
370113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
370213481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
370313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
370413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
370513481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
370613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
370713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
370813481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
370913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator begin5_;
371013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator end5_;
371113481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T5>::iterator current5_;
371213481Sgiacomo.travaglini@arm.com    ParamType current_value_;
371313481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator5::Iterator
371413481Sgiacomo.travaglini@arm.com
371513481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
371613481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator5& other);
371713481Sgiacomo.travaglini@arm.com
371813481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
371913481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
372013481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
372113481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
372213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T5> g5_;
372313481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator5
372413481Sgiacomo.travaglini@arm.com
372513481Sgiacomo.travaglini@arm.com
372613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
372713481Sgiacomo.travaglini@arm.com    typename T6>
372813481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator6
372913481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5,
373013481Sgiacomo.travaglini@arm.com        T6> > {
373113481Sgiacomo.travaglini@arm.com public:
373213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6> ParamType;
373313481Sgiacomo.travaglini@arm.com
373413481Sgiacomo.travaglini@arm.com  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
373513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
373613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
373713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6)
373813481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
373913481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator6() {}
374013481Sgiacomo.travaglini@arm.com
374113481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
374213481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
374313481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
374413481Sgiacomo.travaglini@arm.com  }
374513481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
374613481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
374713481Sgiacomo.travaglini@arm.com        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
374813481Sgiacomo.travaglini@arm.com  }
374913481Sgiacomo.travaglini@arm.com
375013481Sgiacomo.travaglini@arm.com private:
375113481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
375213481Sgiacomo.travaglini@arm.com   public:
375313481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
375413481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
375513481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
375613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
375713481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
375813481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
375913481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
376013481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
376113481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4,
376213481Sgiacomo.travaglini@arm.com      const ParamGenerator<T5>& g5,
376313481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T5>::iterator& current5,
376413481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6,
376513481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T6>::iterator& current6)
376613481Sgiacomo.travaglini@arm.com        : base_(base),
376713481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
376813481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
376913481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
377013481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
377113481Sgiacomo.travaglini@arm.com          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
377213481Sgiacomo.travaglini@arm.com          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
377313481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
377413481Sgiacomo.travaglini@arm.com    }
377513481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
377613481Sgiacomo.travaglini@arm.com
377713481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
377813481Sgiacomo.travaglini@arm.com      return base_;
377913481Sgiacomo.travaglini@arm.com    }
378013481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
378113481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
378213481Sgiacomo.travaglini@arm.com    virtual void Advance() {
378313481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
378413481Sgiacomo.travaglini@arm.com      ++current6_;
378513481Sgiacomo.travaglini@arm.com      if (current6_ == end6_) {
378613481Sgiacomo.travaglini@arm.com        current6_ = begin6_;
378713481Sgiacomo.travaglini@arm.com        ++current5_;
378813481Sgiacomo.travaglini@arm.com      }
378913481Sgiacomo.travaglini@arm.com      if (current5_ == end5_) {
379013481Sgiacomo.travaglini@arm.com        current5_ = begin5_;
379113481Sgiacomo.travaglini@arm.com        ++current4_;
379213481Sgiacomo.travaglini@arm.com      }
379313481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
379413481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
379513481Sgiacomo.travaglini@arm.com        ++current3_;
379613481Sgiacomo.travaglini@arm.com      }
379713481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
379813481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
379913481Sgiacomo.travaglini@arm.com        ++current2_;
380013481Sgiacomo.travaglini@arm.com      }
380113481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
380213481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
380313481Sgiacomo.travaglini@arm.com        ++current1_;
380413481Sgiacomo.travaglini@arm.com      }
380513481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
380613481Sgiacomo.travaglini@arm.com    }
380713481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
380813481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
380913481Sgiacomo.travaglini@arm.com    }
381013481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
381113481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
381213481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
381313481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
381413481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
381513481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
381613481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
381713481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
381813481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
381913481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
382013481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
382113481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
382213481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
382313481Sgiacomo.travaglini@arm.com         (
382413481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
382513481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
382613481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
382713481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_ &&
382813481Sgiacomo.travaglini@arm.com          current5_ == typed_other->current5_ &&
382913481Sgiacomo.travaglini@arm.com          current6_ == typed_other->current6_);
383013481Sgiacomo.travaglini@arm.com    }
383113481Sgiacomo.travaglini@arm.com
383213481Sgiacomo.travaglini@arm.com   private:
383313481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
383413481Sgiacomo.travaglini@arm.com        : base_(other.base_),
383513481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
383613481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
383713481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
383813481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
383913481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
384013481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
384113481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
384213481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
384313481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
384413481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
384513481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
384613481Sgiacomo.travaglini@arm.com        current4_(other.current4_),
384713481Sgiacomo.travaglini@arm.com        begin5_(other.begin5_),
384813481Sgiacomo.travaglini@arm.com        end5_(other.end5_),
384913481Sgiacomo.travaglini@arm.com        current5_(other.current5_),
385013481Sgiacomo.travaglini@arm.com        begin6_(other.begin6_),
385113481Sgiacomo.travaglini@arm.com        end6_(other.end6_),
385213481Sgiacomo.travaglini@arm.com        current6_(other.current6_) {
385313481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
385413481Sgiacomo.travaglini@arm.com    }
385513481Sgiacomo.travaglini@arm.com
385613481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
385713481Sgiacomo.travaglini@arm.com      if (!AtEnd())
385813481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
385913481Sgiacomo.travaglini@arm.com            *current4_, *current5_, *current6_);
386013481Sgiacomo.travaglini@arm.com    }
386113481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
386213481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
386313481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
386413481Sgiacomo.travaglini@arm.com      return
386513481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
386613481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
386713481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
386813481Sgiacomo.travaglini@arm.com          current4_ == end4_ ||
386913481Sgiacomo.travaglini@arm.com          current5_ == end5_ ||
387013481Sgiacomo.travaglini@arm.com          current6_ == end6_;
387113481Sgiacomo.travaglini@arm.com    }
387213481Sgiacomo.travaglini@arm.com
387313481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
387413481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
387513481Sgiacomo.travaglini@arm.com
387613481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
387713481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
387813481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
387913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
388013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
388113481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
388213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
388313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
388413481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
388513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
388613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
388713481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
388813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
388913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
389013481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
389113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator begin5_;
389213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator end5_;
389313481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T5>::iterator current5_;
389413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator begin6_;
389513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator end6_;
389613481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T6>::iterator current6_;
389713481Sgiacomo.travaglini@arm.com    ParamType current_value_;
389813481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator6::Iterator
389913481Sgiacomo.travaglini@arm.com
390013481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
390113481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator6& other);
390213481Sgiacomo.travaglini@arm.com
390313481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
390413481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
390513481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
390613481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
390713481Sgiacomo.travaglini@arm.com  const ParamGenerator<T5> g5_;
390813481Sgiacomo.travaglini@arm.com  const ParamGenerator<T6> g6_;
390913481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator6
391013481Sgiacomo.travaglini@arm.com
391113481Sgiacomo.travaglini@arm.com
391213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
391313481Sgiacomo.travaglini@arm.com    typename T6, typename T7>
391413481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator7
391513481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
391613481Sgiacomo.travaglini@arm.com        T7> > {
391713481Sgiacomo.travaglini@arm.com public:
391813481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
391913481Sgiacomo.travaglini@arm.com
392013481Sgiacomo.travaglini@arm.com  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
392113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
392213481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
392313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
392413481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
392513481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator7() {}
392613481Sgiacomo.travaglini@arm.com
392713481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
392813481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
392913481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
393013481Sgiacomo.travaglini@arm.com        g7_.begin());
393113481Sgiacomo.travaglini@arm.com  }
393213481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
393313481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
393413481Sgiacomo.travaglini@arm.com        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
393513481Sgiacomo.travaglini@arm.com  }
393613481Sgiacomo.travaglini@arm.com
393713481Sgiacomo.travaglini@arm.com private:
393813481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
393913481Sgiacomo.travaglini@arm.com   public:
394013481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
394113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
394213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
394313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
394413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
394513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
394613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
394713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
394813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4,
394913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T5>& g5,
395013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T5>::iterator& current5,
395113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6,
395213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T6>::iterator& current6,
395313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T7>& g7,
395413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T7>::iterator& current7)
395513481Sgiacomo.travaglini@arm.com        : base_(base),
395613481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
395713481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
395813481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
395913481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
396013481Sgiacomo.travaglini@arm.com          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
396113481Sgiacomo.travaglini@arm.com          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
396213481Sgiacomo.travaglini@arm.com          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
396313481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
396413481Sgiacomo.travaglini@arm.com    }
396513481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
396613481Sgiacomo.travaglini@arm.com
396713481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
396813481Sgiacomo.travaglini@arm.com      return base_;
396913481Sgiacomo.travaglini@arm.com    }
397013481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
397113481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
397213481Sgiacomo.travaglini@arm.com    virtual void Advance() {
397313481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
397413481Sgiacomo.travaglini@arm.com      ++current7_;
397513481Sgiacomo.travaglini@arm.com      if (current7_ == end7_) {
397613481Sgiacomo.travaglini@arm.com        current7_ = begin7_;
397713481Sgiacomo.travaglini@arm.com        ++current6_;
397813481Sgiacomo.travaglini@arm.com      }
397913481Sgiacomo.travaglini@arm.com      if (current6_ == end6_) {
398013481Sgiacomo.travaglini@arm.com        current6_ = begin6_;
398113481Sgiacomo.travaglini@arm.com        ++current5_;
398213481Sgiacomo.travaglini@arm.com      }
398313481Sgiacomo.travaglini@arm.com      if (current5_ == end5_) {
398413481Sgiacomo.travaglini@arm.com        current5_ = begin5_;
398513481Sgiacomo.travaglini@arm.com        ++current4_;
398613481Sgiacomo.travaglini@arm.com      }
398713481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
398813481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
398913481Sgiacomo.travaglini@arm.com        ++current3_;
399013481Sgiacomo.travaglini@arm.com      }
399113481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
399213481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
399313481Sgiacomo.travaglini@arm.com        ++current2_;
399413481Sgiacomo.travaglini@arm.com      }
399513481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
399613481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
399713481Sgiacomo.travaglini@arm.com        ++current1_;
399813481Sgiacomo.travaglini@arm.com      }
399913481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
400013481Sgiacomo.travaglini@arm.com    }
400113481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
400213481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
400313481Sgiacomo.travaglini@arm.com    }
400413481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
400513481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
400613481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
400713481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
400813481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
400913481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
401013481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
401113481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
401213481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
401313481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
401413481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
401513481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
401613481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
401713481Sgiacomo.travaglini@arm.com         (
401813481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
401913481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
402013481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
402113481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_ &&
402213481Sgiacomo.travaglini@arm.com          current5_ == typed_other->current5_ &&
402313481Sgiacomo.travaglini@arm.com          current6_ == typed_other->current6_ &&
402413481Sgiacomo.travaglini@arm.com          current7_ == typed_other->current7_);
402513481Sgiacomo.travaglini@arm.com    }
402613481Sgiacomo.travaglini@arm.com
402713481Sgiacomo.travaglini@arm.com   private:
402813481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
402913481Sgiacomo.travaglini@arm.com        : base_(other.base_),
403013481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
403113481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
403213481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
403313481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
403413481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
403513481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
403613481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
403713481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
403813481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
403913481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
404013481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
404113481Sgiacomo.travaglini@arm.com        current4_(other.current4_),
404213481Sgiacomo.travaglini@arm.com        begin5_(other.begin5_),
404313481Sgiacomo.travaglini@arm.com        end5_(other.end5_),
404413481Sgiacomo.travaglini@arm.com        current5_(other.current5_),
404513481Sgiacomo.travaglini@arm.com        begin6_(other.begin6_),
404613481Sgiacomo.travaglini@arm.com        end6_(other.end6_),
404713481Sgiacomo.travaglini@arm.com        current6_(other.current6_),
404813481Sgiacomo.travaglini@arm.com        begin7_(other.begin7_),
404913481Sgiacomo.travaglini@arm.com        end7_(other.end7_),
405013481Sgiacomo.travaglini@arm.com        current7_(other.current7_) {
405113481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
405213481Sgiacomo.travaglini@arm.com    }
405313481Sgiacomo.travaglini@arm.com
405413481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
405513481Sgiacomo.travaglini@arm.com      if (!AtEnd())
405613481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
405713481Sgiacomo.travaglini@arm.com            *current4_, *current5_, *current6_, *current7_);
405813481Sgiacomo.travaglini@arm.com    }
405913481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
406013481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
406113481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
406213481Sgiacomo.travaglini@arm.com      return
406313481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
406413481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
406513481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
406613481Sgiacomo.travaglini@arm.com          current4_ == end4_ ||
406713481Sgiacomo.travaglini@arm.com          current5_ == end5_ ||
406813481Sgiacomo.travaglini@arm.com          current6_ == end6_ ||
406913481Sgiacomo.travaglini@arm.com          current7_ == end7_;
407013481Sgiacomo.travaglini@arm.com    }
407113481Sgiacomo.travaglini@arm.com
407213481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
407313481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
407413481Sgiacomo.travaglini@arm.com
407513481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
407613481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
407713481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
407813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
407913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
408013481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
408113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
408213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
408313481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
408413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
408513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
408613481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
408713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
408813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
408913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
409013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator begin5_;
409113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator end5_;
409213481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T5>::iterator current5_;
409313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator begin6_;
409413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator end6_;
409513481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T6>::iterator current6_;
409613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator begin7_;
409713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator end7_;
409813481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T7>::iterator current7_;
409913481Sgiacomo.travaglini@arm.com    ParamType current_value_;
410013481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator7::Iterator
410113481Sgiacomo.travaglini@arm.com
410213481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
410313481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator7& other);
410413481Sgiacomo.travaglini@arm.com
410513481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
410613481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
410713481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
410813481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
410913481Sgiacomo.travaglini@arm.com  const ParamGenerator<T5> g5_;
411013481Sgiacomo.travaglini@arm.com  const ParamGenerator<T6> g6_;
411113481Sgiacomo.travaglini@arm.com  const ParamGenerator<T7> g7_;
411213481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator7
411313481Sgiacomo.travaglini@arm.com
411413481Sgiacomo.travaglini@arm.com
411513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
411613481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8>
411713481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator8
411813481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
411913481Sgiacomo.travaglini@arm.com        T7, T8> > {
412013481Sgiacomo.travaglini@arm.com public:
412113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
412213481Sgiacomo.travaglini@arm.com
412313481Sgiacomo.travaglini@arm.com  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
412413481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
412513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
412613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
412713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T8>& g8)
412813481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
412913481Sgiacomo.travaglini@arm.com          g8_(g8) {}
413013481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator8() {}
413113481Sgiacomo.travaglini@arm.com
413213481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
413313481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
413413481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
413513481Sgiacomo.travaglini@arm.com        g7_.begin(), g8_, g8_.begin());
413613481Sgiacomo.travaglini@arm.com  }
413713481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
413813481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
413913481Sgiacomo.travaglini@arm.com        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
414013481Sgiacomo.travaglini@arm.com        g8_.end());
414113481Sgiacomo.travaglini@arm.com  }
414213481Sgiacomo.travaglini@arm.com
414313481Sgiacomo.travaglini@arm.com private:
414413481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
414513481Sgiacomo.travaglini@arm.com   public:
414613481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
414713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
414813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
414913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
415013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
415113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
415213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
415313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
415413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4,
415513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T5>& g5,
415613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T5>::iterator& current5,
415713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6,
415813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T6>::iterator& current6,
415913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T7>& g7,
416013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T7>::iterator& current7,
416113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T8>& g8,
416213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T8>::iterator& current8)
416313481Sgiacomo.travaglini@arm.com        : base_(base),
416413481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
416513481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
416613481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
416713481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
416813481Sgiacomo.travaglini@arm.com          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
416913481Sgiacomo.travaglini@arm.com          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
417013481Sgiacomo.travaglini@arm.com          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
417113481Sgiacomo.travaglini@arm.com          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
417213481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
417313481Sgiacomo.travaglini@arm.com    }
417413481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
417513481Sgiacomo.travaglini@arm.com
417613481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
417713481Sgiacomo.travaglini@arm.com      return base_;
417813481Sgiacomo.travaglini@arm.com    }
417913481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
418013481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
418113481Sgiacomo.travaglini@arm.com    virtual void Advance() {
418213481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
418313481Sgiacomo.travaglini@arm.com      ++current8_;
418413481Sgiacomo.travaglini@arm.com      if (current8_ == end8_) {
418513481Sgiacomo.travaglini@arm.com        current8_ = begin8_;
418613481Sgiacomo.travaglini@arm.com        ++current7_;
418713481Sgiacomo.travaglini@arm.com      }
418813481Sgiacomo.travaglini@arm.com      if (current7_ == end7_) {
418913481Sgiacomo.travaglini@arm.com        current7_ = begin7_;
419013481Sgiacomo.travaglini@arm.com        ++current6_;
419113481Sgiacomo.travaglini@arm.com      }
419213481Sgiacomo.travaglini@arm.com      if (current6_ == end6_) {
419313481Sgiacomo.travaglini@arm.com        current6_ = begin6_;
419413481Sgiacomo.travaglini@arm.com        ++current5_;
419513481Sgiacomo.travaglini@arm.com      }
419613481Sgiacomo.travaglini@arm.com      if (current5_ == end5_) {
419713481Sgiacomo.travaglini@arm.com        current5_ = begin5_;
419813481Sgiacomo.travaglini@arm.com        ++current4_;
419913481Sgiacomo.travaglini@arm.com      }
420013481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
420113481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
420213481Sgiacomo.travaglini@arm.com        ++current3_;
420313481Sgiacomo.travaglini@arm.com      }
420413481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
420513481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
420613481Sgiacomo.travaglini@arm.com        ++current2_;
420713481Sgiacomo.travaglini@arm.com      }
420813481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
420913481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
421013481Sgiacomo.travaglini@arm.com        ++current1_;
421113481Sgiacomo.travaglini@arm.com      }
421213481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
421313481Sgiacomo.travaglini@arm.com    }
421413481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
421513481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
421613481Sgiacomo.travaglini@arm.com    }
421713481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
421813481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
421913481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
422013481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
422113481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
422213481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
422313481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
422413481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
422513481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
422613481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
422713481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
422813481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
422913481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
423013481Sgiacomo.travaglini@arm.com         (
423113481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
423213481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
423313481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
423413481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_ &&
423513481Sgiacomo.travaglini@arm.com          current5_ == typed_other->current5_ &&
423613481Sgiacomo.travaglini@arm.com          current6_ == typed_other->current6_ &&
423713481Sgiacomo.travaglini@arm.com          current7_ == typed_other->current7_ &&
423813481Sgiacomo.travaglini@arm.com          current8_ == typed_other->current8_);
423913481Sgiacomo.travaglini@arm.com    }
424013481Sgiacomo.travaglini@arm.com
424113481Sgiacomo.travaglini@arm.com   private:
424213481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
424313481Sgiacomo.travaglini@arm.com        : base_(other.base_),
424413481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
424513481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
424613481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
424713481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
424813481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
424913481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
425013481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
425113481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
425213481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
425313481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
425413481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
425513481Sgiacomo.travaglini@arm.com        current4_(other.current4_),
425613481Sgiacomo.travaglini@arm.com        begin5_(other.begin5_),
425713481Sgiacomo.travaglini@arm.com        end5_(other.end5_),
425813481Sgiacomo.travaglini@arm.com        current5_(other.current5_),
425913481Sgiacomo.travaglini@arm.com        begin6_(other.begin6_),
426013481Sgiacomo.travaglini@arm.com        end6_(other.end6_),
426113481Sgiacomo.travaglini@arm.com        current6_(other.current6_),
426213481Sgiacomo.travaglini@arm.com        begin7_(other.begin7_),
426313481Sgiacomo.travaglini@arm.com        end7_(other.end7_),
426413481Sgiacomo.travaglini@arm.com        current7_(other.current7_),
426513481Sgiacomo.travaglini@arm.com        begin8_(other.begin8_),
426613481Sgiacomo.travaglini@arm.com        end8_(other.end8_),
426713481Sgiacomo.travaglini@arm.com        current8_(other.current8_) {
426813481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
426913481Sgiacomo.travaglini@arm.com    }
427013481Sgiacomo.travaglini@arm.com
427113481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
427213481Sgiacomo.travaglini@arm.com      if (!AtEnd())
427313481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
427413481Sgiacomo.travaglini@arm.com            *current4_, *current5_, *current6_, *current7_, *current8_);
427513481Sgiacomo.travaglini@arm.com    }
427613481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
427713481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
427813481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
427913481Sgiacomo.travaglini@arm.com      return
428013481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
428113481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
428213481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
428313481Sgiacomo.travaglini@arm.com          current4_ == end4_ ||
428413481Sgiacomo.travaglini@arm.com          current5_ == end5_ ||
428513481Sgiacomo.travaglini@arm.com          current6_ == end6_ ||
428613481Sgiacomo.travaglini@arm.com          current7_ == end7_ ||
428713481Sgiacomo.travaglini@arm.com          current8_ == end8_;
428813481Sgiacomo.travaglini@arm.com    }
428913481Sgiacomo.travaglini@arm.com
429013481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
429113481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
429213481Sgiacomo.travaglini@arm.com
429313481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
429413481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
429513481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
429613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
429713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
429813481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
429913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
430013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
430113481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
430213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
430313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
430413481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
430513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
430613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
430713481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
430813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator begin5_;
430913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator end5_;
431013481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T5>::iterator current5_;
431113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator begin6_;
431213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator end6_;
431313481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T6>::iterator current6_;
431413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator begin7_;
431513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator end7_;
431613481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T7>::iterator current7_;
431713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T8>::iterator begin8_;
431813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T8>::iterator end8_;
431913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T8>::iterator current8_;
432013481Sgiacomo.travaglini@arm.com    ParamType current_value_;
432113481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator8::Iterator
432213481Sgiacomo.travaglini@arm.com
432313481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
432413481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator8& other);
432513481Sgiacomo.travaglini@arm.com
432613481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
432713481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
432813481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
432913481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
433013481Sgiacomo.travaglini@arm.com  const ParamGenerator<T5> g5_;
433113481Sgiacomo.travaglini@arm.com  const ParamGenerator<T6> g6_;
433213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T7> g7_;
433313481Sgiacomo.travaglini@arm.com  const ParamGenerator<T8> g8_;
433413481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator8
433513481Sgiacomo.travaglini@arm.com
433613481Sgiacomo.travaglini@arm.com
433713481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
433813481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9>
433913481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator9
434013481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
434113481Sgiacomo.travaglini@arm.com        T7, T8, T9> > {
434213481Sgiacomo.travaglini@arm.com public:
434313481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
434413481Sgiacomo.travaglini@arm.com
434513481Sgiacomo.travaglini@arm.com  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
434613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
434713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
434813481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
434913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
435013481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
435113481Sgiacomo.travaglini@arm.com          g9_(g9) {}
435213481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator9() {}
435313481Sgiacomo.travaglini@arm.com
435413481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
435513481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
435613481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
435713481Sgiacomo.travaglini@arm.com        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
435813481Sgiacomo.travaglini@arm.com  }
435913481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
436013481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
436113481Sgiacomo.travaglini@arm.com        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
436213481Sgiacomo.travaglini@arm.com        g8_.end(), g9_, g9_.end());
436313481Sgiacomo.travaglini@arm.com  }
436413481Sgiacomo.travaglini@arm.com
436513481Sgiacomo.travaglini@arm.com private:
436613481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
436713481Sgiacomo.travaglini@arm.com   public:
436813481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
436913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
437013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
437113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
437213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
437313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
437413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
437513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
437613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4,
437713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T5>& g5,
437813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T5>::iterator& current5,
437913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6,
438013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T6>::iterator& current6,
438113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T7>& g7,
438213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T7>::iterator& current7,
438313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T8>& g8,
438413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T8>::iterator& current8,
438513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T9>& g9,
438613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T9>::iterator& current9)
438713481Sgiacomo.travaglini@arm.com        : base_(base),
438813481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
438913481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
439013481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
439113481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
439213481Sgiacomo.travaglini@arm.com          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
439313481Sgiacomo.travaglini@arm.com          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
439413481Sgiacomo.travaglini@arm.com          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
439513481Sgiacomo.travaglini@arm.com          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
439613481Sgiacomo.travaglini@arm.com          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
439713481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
439813481Sgiacomo.travaglini@arm.com    }
439913481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
440013481Sgiacomo.travaglini@arm.com
440113481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
440213481Sgiacomo.travaglini@arm.com      return base_;
440313481Sgiacomo.travaglini@arm.com    }
440413481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
440513481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
440613481Sgiacomo.travaglini@arm.com    virtual void Advance() {
440713481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
440813481Sgiacomo.travaglini@arm.com      ++current9_;
440913481Sgiacomo.travaglini@arm.com      if (current9_ == end9_) {
441013481Sgiacomo.travaglini@arm.com        current9_ = begin9_;
441113481Sgiacomo.travaglini@arm.com        ++current8_;
441213481Sgiacomo.travaglini@arm.com      }
441313481Sgiacomo.travaglini@arm.com      if (current8_ == end8_) {
441413481Sgiacomo.travaglini@arm.com        current8_ = begin8_;
441513481Sgiacomo.travaglini@arm.com        ++current7_;
441613481Sgiacomo.travaglini@arm.com      }
441713481Sgiacomo.travaglini@arm.com      if (current7_ == end7_) {
441813481Sgiacomo.travaglini@arm.com        current7_ = begin7_;
441913481Sgiacomo.travaglini@arm.com        ++current6_;
442013481Sgiacomo.travaglini@arm.com      }
442113481Sgiacomo.travaglini@arm.com      if (current6_ == end6_) {
442213481Sgiacomo.travaglini@arm.com        current6_ = begin6_;
442313481Sgiacomo.travaglini@arm.com        ++current5_;
442413481Sgiacomo.travaglini@arm.com      }
442513481Sgiacomo.travaglini@arm.com      if (current5_ == end5_) {
442613481Sgiacomo.travaglini@arm.com        current5_ = begin5_;
442713481Sgiacomo.travaglini@arm.com        ++current4_;
442813481Sgiacomo.travaglini@arm.com      }
442913481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
443013481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
443113481Sgiacomo.travaglini@arm.com        ++current3_;
443213481Sgiacomo.travaglini@arm.com      }
443313481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
443413481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
443513481Sgiacomo.travaglini@arm.com        ++current2_;
443613481Sgiacomo.travaglini@arm.com      }
443713481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
443813481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
443913481Sgiacomo.travaglini@arm.com        ++current1_;
444013481Sgiacomo.travaglini@arm.com      }
444113481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
444213481Sgiacomo.travaglini@arm.com    }
444313481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
444413481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
444513481Sgiacomo.travaglini@arm.com    }
444613481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
444713481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
444813481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
444913481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
445013481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
445113481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
445213481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
445313481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
445413481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
445513481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
445613481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
445713481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
445813481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
445913481Sgiacomo.travaglini@arm.com         (
446013481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
446113481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
446213481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
446313481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_ &&
446413481Sgiacomo.travaglini@arm.com          current5_ == typed_other->current5_ &&
446513481Sgiacomo.travaglini@arm.com          current6_ == typed_other->current6_ &&
446613481Sgiacomo.travaglini@arm.com          current7_ == typed_other->current7_ &&
446713481Sgiacomo.travaglini@arm.com          current8_ == typed_other->current8_ &&
446813481Sgiacomo.travaglini@arm.com          current9_ == typed_other->current9_);
446913481Sgiacomo.travaglini@arm.com    }
447013481Sgiacomo.travaglini@arm.com
447113481Sgiacomo.travaglini@arm.com   private:
447213481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
447313481Sgiacomo.travaglini@arm.com        : base_(other.base_),
447413481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
447513481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
447613481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
447713481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
447813481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
447913481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
448013481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
448113481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
448213481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
448313481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
448413481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
448513481Sgiacomo.travaglini@arm.com        current4_(other.current4_),
448613481Sgiacomo.travaglini@arm.com        begin5_(other.begin5_),
448713481Sgiacomo.travaglini@arm.com        end5_(other.end5_),
448813481Sgiacomo.travaglini@arm.com        current5_(other.current5_),
448913481Sgiacomo.travaglini@arm.com        begin6_(other.begin6_),
449013481Sgiacomo.travaglini@arm.com        end6_(other.end6_),
449113481Sgiacomo.travaglini@arm.com        current6_(other.current6_),
449213481Sgiacomo.travaglini@arm.com        begin7_(other.begin7_),
449313481Sgiacomo.travaglini@arm.com        end7_(other.end7_),
449413481Sgiacomo.travaglini@arm.com        current7_(other.current7_),
449513481Sgiacomo.travaglini@arm.com        begin8_(other.begin8_),
449613481Sgiacomo.travaglini@arm.com        end8_(other.end8_),
449713481Sgiacomo.travaglini@arm.com        current8_(other.current8_),
449813481Sgiacomo.travaglini@arm.com        begin9_(other.begin9_),
449913481Sgiacomo.travaglini@arm.com        end9_(other.end9_),
450013481Sgiacomo.travaglini@arm.com        current9_(other.current9_) {
450113481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
450213481Sgiacomo.travaglini@arm.com    }
450313481Sgiacomo.travaglini@arm.com
450413481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
450513481Sgiacomo.travaglini@arm.com      if (!AtEnd())
450613481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
450713481Sgiacomo.travaglini@arm.com            *current4_, *current5_, *current6_, *current7_, *current8_,
450813481Sgiacomo.travaglini@arm.com            *current9_);
450913481Sgiacomo.travaglini@arm.com    }
451013481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
451113481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
451213481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
451313481Sgiacomo.travaglini@arm.com      return
451413481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
451513481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
451613481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
451713481Sgiacomo.travaglini@arm.com          current4_ == end4_ ||
451813481Sgiacomo.travaglini@arm.com          current5_ == end5_ ||
451913481Sgiacomo.travaglini@arm.com          current6_ == end6_ ||
452013481Sgiacomo.travaglini@arm.com          current7_ == end7_ ||
452113481Sgiacomo.travaglini@arm.com          current8_ == end8_ ||
452213481Sgiacomo.travaglini@arm.com          current9_ == end9_;
452313481Sgiacomo.travaglini@arm.com    }
452413481Sgiacomo.travaglini@arm.com
452513481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
452613481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
452713481Sgiacomo.travaglini@arm.com
452813481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
452913481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
453013481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
453113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
453213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
453313481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
453413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
453513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
453613481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
453713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
453813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
453913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
454013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
454113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
454213481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
454313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator begin5_;
454413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator end5_;
454513481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T5>::iterator current5_;
454613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator begin6_;
454713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator end6_;
454813481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T6>::iterator current6_;
454913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator begin7_;
455013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator end7_;
455113481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T7>::iterator current7_;
455213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T8>::iterator begin8_;
455313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T8>::iterator end8_;
455413481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T8>::iterator current8_;
455513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T9>::iterator begin9_;
455613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T9>::iterator end9_;
455713481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T9>::iterator current9_;
455813481Sgiacomo.travaglini@arm.com    ParamType current_value_;
455913481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator9::Iterator
456013481Sgiacomo.travaglini@arm.com
456113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
456213481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator9& other);
456313481Sgiacomo.travaglini@arm.com
456413481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
456513481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
456613481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
456713481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
456813481Sgiacomo.travaglini@arm.com  const ParamGenerator<T5> g5_;
456913481Sgiacomo.travaglini@arm.com  const ParamGenerator<T6> g6_;
457013481Sgiacomo.travaglini@arm.com  const ParamGenerator<T7> g7_;
457113481Sgiacomo.travaglini@arm.com  const ParamGenerator<T8> g8_;
457213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T9> g9_;
457313481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator9
457413481Sgiacomo.travaglini@arm.com
457513481Sgiacomo.travaglini@arm.com
457613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
457713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10>
457813481Sgiacomo.travaglini@arm.comclass CartesianProductGenerator10
457913481Sgiacomo.travaglini@arm.com    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,
458013481Sgiacomo.travaglini@arm.com        T7, T8, T9, T10> > {
458113481Sgiacomo.travaglini@arm.com public:
458213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
458313481Sgiacomo.travaglini@arm.com
458413481Sgiacomo.travaglini@arm.com  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
458513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
458613481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
458713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
458813481Sgiacomo.travaglini@arm.com      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
458913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T10>& g10)
459013481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
459113481Sgiacomo.travaglini@arm.com          g9_(g9), g10_(g10) {}
459213481Sgiacomo.travaglini@arm.com  virtual ~CartesianProductGenerator10() {}
459313481Sgiacomo.travaglini@arm.com
459413481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* Begin() const {
459513481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
459613481Sgiacomo.travaglini@arm.com        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
459713481Sgiacomo.travaglini@arm.com        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
459813481Sgiacomo.travaglini@arm.com  }
459913481Sgiacomo.travaglini@arm.com  virtual ParamIteratorInterface<ParamType>* End() const {
460013481Sgiacomo.travaglini@arm.com    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
460113481Sgiacomo.travaglini@arm.com        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
460213481Sgiacomo.travaglini@arm.com        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
460313481Sgiacomo.travaglini@arm.com  }
460413481Sgiacomo.travaglini@arm.com
460513481Sgiacomo.travaglini@arm.com private:
460613481Sgiacomo.travaglini@arm.com  class Iterator : public ParamIteratorInterface<ParamType> {
460713481Sgiacomo.travaglini@arm.com   public:
460813481Sgiacomo.travaglini@arm.com    Iterator(const ParamGeneratorInterface<ParamType>* base,
460913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T1>& g1,
461013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T1>::iterator& current1,
461113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T2>& g2,
461213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T2>::iterator& current2,
461313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T3>& g3,
461413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T3>::iterator& current3,
461513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T4>& g4,
461613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T4>::iterator& current4,
461713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T5>& g5,
461813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T5>::iterator& current5,
461913481Sgiacomo.travaglini@arm.com      const ParamGenerator<T6>& g6,
462013481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T6>::iterator& current6,
462113481Sgiacomo.travaglini@arm.com      const ParamGenerator<T7>& g7,
462213481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T7>::iterator& current7,
462313481Sgiacomo.travaglini@arm.com      const ParamGenerator<T8>& g8,
462413481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T8>::iterator& current8,
462513481Sgiacomo.travaglini@arm.com      const ParamGenerator<T9>& g9,
462613481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T9>::iterator& current9,
462713481Sgiacomo.travaglini@arm.com      const ParamGenerator<T10>& g10,
462813481Sgiacomo.travaglini@arm.com      const typename ParamGenerator<T10>::iterator& current10)
462913481Sgiacomo.travaglini@arm.com        : base_(base),
463013481Sgiacomo.travaglini@arm.com          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
463113481Sgiacomo.travaglini@arm.com          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
463213481Sgiacomo.travaglini@arm.com          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
463313481Sgiacomo.travaglini@arm.com          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
463413481Sgiacomo.travaglini@arm.com          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
463513481Sgiacomo.travaglini@arm.com          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
463613481Sgiacomo.travaglini@arm.com          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
463713481Sgiacomo.travaglini@arm.com          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
463813481Sgiacomo.travaglini@arm.com          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
463913481Sgiacomo.travaglini@arm.com          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
464013481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
464113481Sgiacomo.travaglini@arm.com    }
464213481Sgiacomo.travaglini@arm.com    virtual ~Iterator() {}
464313481Sgiacomo.travaglini@arm.com
464413481Sgiacomo.travaglini@arm.com    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
464513481Sgiacomo.travaglini@arm.com      return base_;
464613481Sgiacomo.travaglini@arm.com    }
464713481Sgiacomo.travaglini@arm.com    // Advance should not be called on beyond-of-range iterators
464813481Sgiacomo.travaglini@arm.com    // so no component iterators must be beyond end of range, either.
464913481Sgiacomo.travaglini@arm.com    virtual void Advance() {
465013481Sgiacomo.travaglini@arm.com      assert(!AtEnd());
465113481Sgiacomo.travaglini@arm.com      ++current10_;
465213481Sgiacomo.travaglini@arm.com      if (current10_ == end10_) {
465313481Sgiacomo.travaglini@arm.com        current10_ = begin10_;
465413481Sgiacomo.travaglini@arm.com        ++current9_;
465513481Sgiacomo.travaglini@arm.com      }
465613481Sgiacomo.travaglini@arm.com      if (current9_ == end9_) {
465713481Sgiacomo.travaglini@arm.com        current9_ = begin9_;
465813481Sgiacomo.travaglini@arm.com        ++current8_;
465913481Sgiacomo.travaglini@arm.com      }
466013481Sgiacomo.travaglini@arm.com      if (current8_ == end8_) {
466113481Sgiacomo.travaglini@arm.com        current8_ = begin8_;
466213481Sgiacomo.travaglini@arm.com        ++current7_;
466313481Sgiacomo.travaglini@arm.com      }
466413481Sgiacomo.travaglini@arm.com      if (current7_ == end7_) {
466513481Sgiacomo.travaglini@arm.com        current7_ = begin7_;
466613481Sgiacomo.travaglini@arm.com        ++current6_;
466713481Sgiacomo.travaglini@arm.com      }
466813481Sgiacomo.travaglini@arm.com      if (current6_ == end6_) {
466913481Sgiacomo.travaglini@arm.com        current6_ = begin6_;
467013481Sgiacomo.travaglini@arm.com        ++current5_;
467113481Sgiacomo.travaglini@arm.com      }
467213481Sgiacomo.travaglini@arm.com      if (current5_ == end5_) {
467313481Sgiacomo.travaglini@arm.com        current5_ = begin5_;
467413481Sgiacomo.travaglini@arm.com        ++current4_;
467513481Sgiacomo.travaglini@arm.com      }
467613481Sgiacomo.travaglini@arm.com      if (current4_ == end4_) {
467713481Sgiacomo.travaglini@arm.com        current4_ = begin4_;
467813481Sgiacomo.travaglini@arm.com        ++current3_;
467913481Sgiacomo.travaglini@arm.com      }
468013481Sgiacomo.travaglini@arm.com      if (current3_ == end3_) {
468113481Sgiacomo.travaglini@arm.com        current3_ = begin3_;
468213481Sgiacomo.travaglini@arm.com        ++current2_;
468313481Sgiacomo.travaglini@arm.com      }
468413481Sgiacomo.travaglini@arm.com      if (current2_ == end2_) {
468513481Sgiacomo.travaglini@arm.com        current2_ = begin2_;
468613481Sgiacomo.travaglini@arm.com        ++current1_;
468713481Sgiacomo.travaglini@arm.com      }
468813481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
468913481Sgiacomo.travaglini@arm.com    }
469013481Sgiacomo.travaglini@arm.com    virtual ParamIteratorInterface<ParamType>* Clone() const {
469113481Sgiacomo.travaglini@arm.com      return new Iterator(*this);
469213481Sgiacomo.travaglini@arm.com    }
469313481Sgiacomo.travaglini@arm.com    virtual const ParamType* Current() const { return &current_value_; }
469413481Sgiacomo.travaglini@arm.com    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
469513481Sgiacomo.travaglini@arm.com      // Having the same base generator guarantees that the other
469613481Sgiacomo.travaglini@arm.com      // iterator is of the same type and we can downcast.
469713481Sgiacomo.travaglini@arm.com      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
469813481Sgiacomo.travaglini@arm.com          << "The program attempted to compare iterators "
469913481Sgiacomo.travaglini@arm.com          << "from different generators." << std::endl;
470013481Sgiacomo.travaglini@arm.com      const Iterator* typed_other =
470113481Sgiacomo.travaglini@arm.com          CheckedDowncastToActualType<const Iterator>(&other);
470213481Sgiacomo.travaglini@arm.com      // We must report iterators equal if they both point beyond their
470313481Sgiacomo.travaglini@arm.com      // respective ranges. That can happen in a variety of fashions,
470413481Sgiacomo.travaglini@arm.com      // so we have to consult AtEnd().
470513481Sgiacomo.travaglini@arm.com      return (AtEnd() && typed_other->AtEnd()) ||
470613481Sgiacomo.travaglini@arm.com         (
470713481Sgiacomo.travaglini@arm.com          current1_ == typed_other->current1_ &&
470813481Sgiacomo.travaglini@arm.com          current2_ == typed_other->current2_ &&
470913481Sgiacomo.travaglini@arm.com          current3_ == typed_other->current3_ &&
471013481Sgiacomo.travaglini@arm.com          current4_ == typed_other->current4_ &&
471113481Sgiacomo.travaglini@arm.com          current5_ == typed_other->current5_ &&
471213481Sgiacomo.travaglini@arm.com          current6_ == typed_other->current6_ &&
471313481Sgiacomo.travaglini@arm.com          current7_ == typed_other->current7_ &&
471413481Sgiacomo.travaglini@arm.com          current8_ == typed_other->current8_ &&
471513481Sgiacomo.travaglini@arm.com          current9_ == typed_other->current9_ &&
471613481Sgiacomo.travaglini@arm.com          current10_ == typed_other->current10_);
471713481Sgiacomo.travaglini@arm.com    }
471813481Sgiacomo.travaglini@arm.com
471913481Sgiacomo.travaglini@arm.com   private:
472013481Sgiacomo.travaglini@arm.com    Iterator(const Iterator& other)
472113481Sgiacomo.travaglini@arm.com        : base_(other.base_),
472213481Sgiacomo.travaglini@arm.com        begin1_(other.begin1_),
472313481Sgiacomo.travaglini@arm.com        end1_(other.end1_),
472413481Sgiacomo.travaglini@arm.com        current1_(other.current1_),
472513481Sgiacomo.travaglini@arm.com        begin2_(other.begin2_),
472613481Sgiacomo.travaglini@arm.com        end2_(other.end2_),
472713481Sgiacomo.travaglini@arm.com        current2_(other.current2_),
472813481Sgiacomo.travaglini@arm.com        begin3_(other.begin3_),
472913481Sgiacomo.travaglini@arm.com        end3_(other.end3_),
473013481Sgiacomo.travaglini@arm.com        current3_(other.current3_),
473113481Sgiacomo.travaglini@arm.com        begin4_(other.begin4_),
473213481Sgiacomo.travaglini@arm.com        end4_(other.end4_),
473313481Sgiacomo.travaglini@arm.com        current4_(other.current4_),
473413481Sgiacomo.travaglini@arm.com        begin5_(other.begin5_),
473513481Sgiacomo.travaglini@arm.com        end5_(other.end5_),
473613481Sgiacomo.travaglini@arm.com        current5_(other.current5_),
473713481Sgiacomo.travaglini@arm.com        begin6_(other.begin6_),
473813481Sgiacomo.travaglini@arm.com        end6_(other.end6_),
473913481Sgiacomo.travaglini@arm.com        current6_(other.current6_),
474013481Sgiacomo.travaglini@arm.com        begin7_(other.begin7_),
474113481Sgiacomo.travaglini@arm.com        end7_(other.end7_),
474213481Sgiacomo.travaglini@arm.com        current7_(other.current7_),
474313481Sgiacomo.travaglini@arm.com        begin8_(other.begin8_),
474413481Sgiacomo.travaglini@arm.com        end8_(other.end8_),
474513481Sgiacomo.travaglini@arm.com        current8_(other.current8_),
474613481Sgiacomo.travaglini@arm.com        begin9_(other.begin9_),
474713481Sgiacomo.travaglini@arm.com        end9_(other.end9_),
474813481Sgiacomo.travaglini@arm.com        current9_(other.current9_),
474913481Sgiacomo.travaglini@arm.com        begin10_(other.begin10_),
475013481Sgiacomo.travaglini@arm.com        end10_(other.end10_),
475113481Sgiacomo.travaglini@arm.com        current10_(other.current10_) {
475213481Sgiacomo.travaglini@arm.com      ComputeCurrentValue();
475313481Sgiacomo.travaglini@arm.com    }
475413481Sgiacomo.travaglini@arm.com
475513481Sgiacomo.travaglini@arm.com    void ComputeCurrentValue() {
475613481Sgiacomo.travaglini@arm.com      if (!AtEnd())
475713481Sgiacomo.travaglini@arm.com        current_value_ = ParamType(*current1_, *current2_, *current3_,
475813481Sgiacomo.travaglini@arm.com            *current4_, *current5_, *current6_, *current7_, *current8_,
475913481Sgiacomo.travaglini@arm.com            *current9_, *current10_);
476013481Sgiacomo.travaglini@arm.com    }
476113481Sgiacomo.travaglini@arm.com    bool AtEnd() const {
476213481Sgiacomo.travaglini@arm.com      // We must report iterator past the end of the range when either of the
476313481Sgiacomo.travaglini@arm.com      // component iterators has reached the end of its range.
476413481Sgiacomo.travaglini@arm.com      return
476513481Sgiacomo.travaglini@arm.com          current1_ == end1_ ||
476613481Sgiacomo.travaglini@arm.com          current2_ == end2_ ||
476713481Sgiacomo.travaglini@arm.com          current3_ == end3_ ||
476813481Sgiacomo.travaglini@arm.com          current4_ == end4_ ||
476913481Sgiacomo.travaglini@arm.com          current5_ == end5_ ||
477013481Sgiacomo.travaglini@arm.com          current6_ == end6_ ||
477113481Sgiacomo.travaglini@arm.com          current7_ == end7_ ||
477213481Sgiacomo.travaglini@arm.com          current8_ == end8_ ||
477313481Sgiacomo.travaglini@arm.com          current9_ == end9_ ||
477413481Sgiacomo.travaglini@arm.com          current10_ == end10_;
477513481Sgiacomo.travaglini@arm.com    }
477613481Sgiacomo.travaglini@arm.com
477713481Sgiacomo.travaglini@arm.com    // No implementation - assignment is unsupported.
477813481Sgiacomo.travaglini@arm.com    void operator=(const Iterator& other);
477913481Sgiacomo.travaglini@arm.com
478013481Sgiacomo.travaglini@arm.com    const ParamGeneratorInterface<ParamType>* const base_;
478113481Sgiacomo.travaglini@arm.com    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
478213481Sgiacomo.travaglini@arm.com    // current[i]_ is the actual traversing iterator.
478313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator begin1_;
478413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T1>::iterator end1_;
478513481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T1>::iterator current1_;
478613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator begin2_;
478713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T2>::iterator end2_;
478813481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T2>::iterator current2_;
478913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator begin3_;
479013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T3>::iterator end3_;
479113481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T3>::iterator current3_;
479213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator begin4_;
479313481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T4>::iterator end4_;
479413481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T4>::iterator current4_;
479513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator begin5_;
479613481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T5>::iterator end5_;
479713481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T5>::iterator current5_;
479813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator begin6_;
479913481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T6>::iterator end6_;
480013481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T6>::iterator current6_;
480113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator begin7_;
480213481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T7>::iterator end7_;
480313481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T7>::iterator current7_;
480413481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T8>::iterator begin8_;
480513481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T8>::iterator end8_;
480613481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T8>::iterator current8_;
480713481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T9>::iterator begin9_;
480813481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T9>::iterator end9_;
480913481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T9>::iterator current9_;
481013481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T10>::iterator begin10_;
481113481Sgiacomo.travaglini@arm.com    const typename ParamGenerator<T10>::iterator end10_;
481213481Sgiacomo.travaglini@arm.com    typename ParamGenerator<T10>::iterator current10_;
481313481Sgiacomo.travaglini@arm.com    ParamType current_value_;
481413481Sgiacomo.travaglini@arm.com  };  // class CartesianProductGenerator10::Iterator
481513481Sgiacomo.travaglini@arm.com
481613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
481713481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductGenerator10& other);
481813481Sgiacomo.travaglini@arm.com
481913481Sgiacomo.travaglini@arm.com  const ParamGenerator<T1> g1_;
482013481Sgiacomo.travaglini@arm.com  const ParamGenerator<T2> g2_;
482113481Sgiacomo.travaglini@arm.com  const ParamGenerator<T3> g3_;
482213481Sgiacomo.travaglini@arm.com  const ParamGenerator<T4> g4_;
482313481Sgiacomo.travaglini@arm.com  const ParamGenerator<T5> g5_;
482413481Sgiacomo.travaglini@arm.com  const ParamGenerator<T6> g6_;
482513481Sgiacomo.travaglini@arm.com  const ParamGenerator<T7> g7_;
482613481Sgiacomo.travaglini@arm.com  const ParamGenerator<T8> g8_;
482713481Sgiacomo.travaglini@arm.com  const ParamGenerator<T9> g9_;
482813481Sgiacomo.travaglini@arm.com  const ParamGenerator<T10> g10_;
482913481Sgiacomo.travaglini@arm.com};  // class CartesianProductGenerator10
483013481Sgiacomo.travaglini@arm.com
483113481Sgiacomo.travaglini@arm.com
483213481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
483313481Sgiacomo.travaglini@arm.com//
483413481Sgiacomo.travaglini@arm.com// Helper classes providing Combine() with polymorphic features. They allow
483513481Sgiacomo.travaglini@arm.com// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
483613481Sgiacomo.travaglini@arm.com// convertible to U.
483713481Sgiacomo.travaglini@arm.com//
483813481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2>
483913481Sgiacomo.travaglini@arm.comclass CartesianProductHolder2 {
484013481Sgiacomo.travaglini@arm.com public:
484113481Sgiacomo.travaglini@arm.comCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
484213481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2) {}
484313481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2>
484413481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2> >() const {
484513481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2> >(
484613481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator2<T1, T2>(
484713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
484813481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_)));
484913481Sgiacomo.travaglini@arm.com  }
485013481Sgiacomo.travaglini@arm.com
485113481Sgiacomo.travaglini@arm.com private:
485213481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
485313481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder2& other);
485413481Sgiacomo.travaglini@arm.com
485513481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
485613481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
485713481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder2
485813481Sgiacomo.travaglini@arm.com
485913481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3>
486013481Sgiacomo.travaglini@arm.comclass CartesianProductHolder3 {
486113481Sgiacomo.travaglini@arm.com public:
486213481Sgiacomo.travaglini@arm.comCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
486313481Sgiacomo.travaglini@arm.com    const Generator3& g3)
486413481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3) {}
486513481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3>
486613481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3> >() const {
486713481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3> >(
486813481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator3<T1, T2, T3>(
486913481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
487013481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
487113481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_)));
487213481Sgiacomo.travaglini@arm.com  }
487313481Sgiacomo.travaglini@arm.com
487413481Sgiacomo.travaglini@arm.com private:
487513481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
487613481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder3& other);
487713481Sgiacomo.travaglini@arm.com
487813481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
487913481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
488013481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
488113481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder3
488213481Sgiacomo.travaglini@arm.com
488313481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
488413481Sgiacomo.travaglini@arm.com    class Generator4>
488513481Sgiacomo.travaglini@arm.comclass CartesianProductHolder4 {
488613481Sgiacomo.travaglini@arm.com public:
488713481Sgiacomo.travaglini@arm.comCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
488813481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4)
488913481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
489013481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4>
489113481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >() const {
489213481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >(
489313481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator4<T1, T2, T3, T4>(
489413481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
489513481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
489613481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
489713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_)));
489813481Sgiacomo.travaglini@arm.com  }
489913481Sgiacomo.travaglini@arm.com
490013481Sgiacomo.travaglini@arm.com private:
490113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
490213481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder4& other);
490313481Sgiacomo.travaglini@arm.com
490413481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
490513481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
490613481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
490713481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
490813481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder4
490913481Sgiacomo.travaglini@arm.com
491013481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
491113481Sgiacomo.travaglini@arm.com    class Generator4, class Generator5>
491213481Sgiacomo.travaglini@arm.comclass CartesianProductHolder5 {
491313481Sgiacomo.travaglini@arm.com public:
491413481Sgiacomo.travaglini@arm.comCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
491513481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4, const Generator5& g5)
491613481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
491713481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4, typename T5>
491813481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >() const {
491913481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >(
492013481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
492113481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
492213481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
492313481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
492413481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_),
492513481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T5> >(g5_)));
492613481Sgiacomo.travaglini@arm.com  }
492713481Sgiacomo.travaglini@arm.com
492813481Sgiacomo.travaglini@arm.com private:
492913481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
493013481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder5& other);
493113481Sgiacomo.travaglini@arm.com
493213481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
493313481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
493413481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
493513481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
493613481Sgiacomo.travaglini@arm.com  const Generator5 g5_;
493713481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder5
493813481Sgiacomo.travaglini@arm.com
493913481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
494013481Sgiacomo.travaglini@arm.com    class Generator4, class Generator5, class Generator6>
494113481Sgiacomo.travaglini@arm.comclass CartesianProductHolder6 {
494213481Sgiacomo.travaglini@arm.com public:
494313481Sgiacomo.travaglini@arm.comCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
494413481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4, const Generator5& g5,
494513481Sgiacomo.travaglini@arm.com    const Generator6& g6)
494613481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
494713481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4, typename T5,
494813481Sgiacomo.travaglini@arm.com      typename T6>
494913481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >() const {
495013481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >(
495113481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
495213481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
495313481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
495413481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
495513481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_),
495613481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T5> >(g5_),
495713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T6> >(g6_)));
495813481Sgiacomo.travaglini@arm.com  }
495913481Sgiacomo.travaglini@arm.com
496013481Sgiacomo.travaglini@arm.com private:
496113481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
496213481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder6& other);
496313481Sgiacomo.travaglini@arm.com
496413481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
496513481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
496613481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
496713481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
496813481Sgiacomo.travaglini@arm.com  const Generator5 g5_;
496913481Sgiacomo.travaglini@arm.com  const Generator6 g6_;
497013481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder6
497113481Sgiacomo.travaglini@arm.com
497213481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
497313481Sgiacomo.travaglini@arm.com    class Generator4, class Generator5, class Generator6, class Generator7>
497413481Sgiacomo.travaglini@arm.comclass CartesianProductHolder7 {
497513481Sgiacomo.travaglini@arm.com public:
497613481Sgiacomo.travaglini@arm.comCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
497713481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4, const Generator5& g5,
497813481Sgiacomo.travaglini@arm.com    const Generator6& g6, const Generator7& g7)
497913481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
498013481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4, typename T5,
498113481Sgiacomo.travaglini@arm.com      typename T6, typename T7>
498213481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6,
498313481Sgiacomo.travaglini@arm.com      T7> >() const {
498413481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> >(
498513481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
498613481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
498713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
498813481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
498913481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_),
499013481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T5> >(g5_),
499113481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T6> >(g6_),
499213481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T7> >(g7_)));
499313481Sgiacomo.travaglini@arm.com  }
499413481Sgiacomo.travaglini@arm.com
499513481Sgiacomo.travaglini@arm.com private:
499613481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
499713481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder7& other);
499813481Sgiacomo.travaglini@arm.com
499913481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
500013481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
500113481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
500213481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
500313481Sgiacomo.travaglini@arm.com  const Generator5 g5_;
500413481Sgiacomo.travaglini@arm.com  const Generator6 g6_;
500513481Sgiacomo.travaglini@arm.com  const Generator7 g7_;
500613481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder7
500713481Sgiacomo.travaglini@arm.com
500813481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
500913481Sgiacomo.travaglini@arm.com    class Generator4, class Generator5, class Generator6, class Generator7,
501013481Sgiacomo.travaglini@arm.com    class Generator8>
501113481Sgiacomo.travaglini@arm.comclass CartesianProductHolder8 {
501213481Sgiacomo.travaglini@arm.com public:
501313481Sgiacomo.travaglini@arm.comCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
501413481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4, const Generator5& g5,
501513481Sgiacomo.travaglini@arm.com    const Generator6& g6, const Generator7& g7, const Generator8& g8)
501613481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
501713481Sgiacomo.travaglini@arm.com          g8_(g8) {}
501813481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4, typename T5,
501913481Sgiacomo.travaglini@arm.com      typename T6, typename T7, typename T8>
502013481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7,
502113481Sgiacomo.travaglini@arm.com      T8> >() const {
502213481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
502313481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
502413481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
502513481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
502613481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
502713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_),
502813481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T5> >(g5_),
502913481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T6> >(g6_),
503013481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T7> >(g7_),
503113481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T8> >(g8_)));
503213481Sgiacomo.travaglini@arm.com  }
503313481Sgiacomo.travaglini@arm.com
503413481Sgiacomo.travaglini@arm.com private:
503513481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
503613481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder8& other);
503713481Sgiacomo.travaglini@arm.com
503813481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
503913481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
504013481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
504113481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
504213481Sgiacomo.travaglini@arm.com  const Generator5 g5_;
504313481Sgiacomo.travaglini@arm.com  const Generator6 g6_;
504413481Sgiacomo.travaglini@arm.com  const Generator7 g7_;
504513481Sgiacomo.travaglini@arm.com  const Generator8 g8_;
504613481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder8
504713481Sgiacomo.travaglini@arm.com
504813481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
504913481Sgiacomo.travaglini@arm.com    class Generator4, class Generator5, class Generator6, class Generator7,
505013481Sgiacomo.travaglini@arm.com    class Generator8, class Generator9>
505113481Sgiacomo.travaglini@arm.comclass CartesianProductHolder9 {
505213481Sgiacomo.travaglini@arm.com public:
505313481Sgiacomo.travaglini@arm.comCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
505413481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4, const Generator5& g5,
505513481Sgiacomo.travaglini@arm.com    const Generator6& g6, const Generator7& g7, const Generator8& g8,
505613481Sgiacomo.travaglini@arm.com    const Generator9& g9)
505713481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
505813481Sgiacomo.travaglini@arm.com          g9_(g9) {}
505913481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4, typename T5,
506013481Sgiacomo.travaglini@arm.com      typename T6, typename T7, typename T8, typename T9>
506113481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
506213481Sgiacomo.travaglini@arm.com      T9> >() const {
506313481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
506413481Sgiacomo.travaglini@arm.com        T9> >(
506513481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
506613481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
506713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
506813481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
506913481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_),
507013481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T5> >(g5_),
507113481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T6> >(g6_),
507213481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T7> >(g7_),
507313481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T8> >(g8_),
507413481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T9> >(g9_)));
507513481Sgiacomo.travaglini@arm.com  }
507613481Sgiacomo.travaglini@arm.com
507713481Sgiacomo.travaglini@arm.com private:
507813481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
507913481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder9& other);
508013481Sgiacomo.travaglini@arm.com
508113481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
508213481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
508313481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
508413481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
508513481Sgiacomo.travaglini@arm.com  const Generator5 g5_;
508613481Sgiacomo.travaglini@arm.com  const Generator6 g6_;
508713481Sgiacomo.travaglini@arm.com  const Generator7 g7_;
508813481Sgiacomo.travaglini@arm.com  const Generator8 g8_;
508913481Sgiacomo.travaglini@arm.com  const Generator9 g9_;
509013481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder9
509113481Sgiacomo.travaglini@arm.com
509213481Sgiacomo.travaglini@arm.comtemplate <class Generator1, class Generator2, class Generator3,
509313481Sgiacomo.travaglini@arm.com    class Generator4, class Generator5, class Generator6, class Generator7,
509413481Sgiacomo.travaglini@arm.com    class Generator8, class Generator9, class Generator10>
509513481Sgiacomo.travaglini@arm.comclass CartesianProductHolder10 {
509613481Sgiacomo.travaglini@arm.com public:
509713481Sgiacomo.travaglini@arm.comCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
509813481Sgiacomo.travaglini@arm.com    const Generator3& g3, const Generator4& g4, const Generator5& g5,
509913481Sgiacomo.travaglini@arm.com    const Generator6& g6, const Generator7& g7, const Generator8& g8,
510013481Sgiacomo.travaglini@arm.com    const Generator9& g9, const Generator10& g10)
510113481Sgiacomo.travaglini@arm.com      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
510213481Sgiacomo.travaglini@arm.com          g9_(g9), g10_(g10) {}
510313481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2, typename T3, typename T4, typename T5,
510413481Sgiacomo.travaglini@arm.com      typename T6, typename T7, typename T8, typename T9, typename T10>
510513481Sgiacomo.travaglini@arm.com  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,
510613481Sgiacomo.travaglini@arm.com      T10> >() const {
510713481Sgiacomo.travaglini@arm.com    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,
510813481Sgiacomo.travaglini@arm.com        T10> >(
510913481Sgiacomo.travaglini@arm.com        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
511013481Sgiacomo.travaglini@arm.com            T10>(
511113481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T1> >(g1_),
511213481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T2> >(g2_),
511313481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T3> >(g3_),
511413481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T4> >(g4_),
511513481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T5> >(g5_),
511613481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T6> >(g6_),
511713481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T7> >(g7_),
511813481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T8> >(g8_),
511913481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T9> >(g9_),
512013481Sgiacomo.travaglini@arm.com        static_cast<ParamGenerator<T10> >(g10_)));
512113481Sgiacomo.travaglini@arm.com  }
512213481Sgiacomo.travaglini@arm.com
512313481Sgiacomo.travaglini@arm.com private:
512413481Sgiacomo.travaglini@arm.com  // No implementation - assignment is unsupported.
512513481Sgiacomo.travaglini@arm.com  void operator=(const CartesianProductHolder10& other);
512613481Sgiacomo.travaglini@arm.com
512713481Sgiacomo.travaglini@arm.com  const Generator1 g1_;
512813481Sgiacomo.travaglini@arm.com  const Generator2 g2_;
512913481Sgiacomo.travaglini@arm.com  const Generator3 g3_;
513013481Sgiacomo.travaglini@arm.com  const Generator4 g4_;
513113481Sgiacomo.travaglini@arm.com  const Generator5 g5_;
513213481Sgiacomo.travaglini@arm.com  const Generator6 g6_;
513313481Sgiacomo.travaglini@arm.com  const Generator7 g7_;
513413481Sgiacomo.travaglini@arm.com  const Generator8 g8_;
513513481Sgiacomo.travaglini@arm.com  const Generator9 g9_;
513613481Sgiacomo.travaglini@arm.com  const Generator10 g10_;
513713481Sgiacomo.travaglini@arm.com};  // class CartesianProductHolder10
513813481Sgiacomo.travaglini@arm.com
513913481Sgiacomo.travaglini@arm.com# endif  // GTEST_HAS_COMBINE
514013481Sgiacomo.travaglini@arm.com
514113481Sgiacomo.travaglini@arm.com}  // namespace internal
514213481Sgiacomo.travaglini@arm.com}  // namespace testing
514313481Sgiacomo.travaglini@arm.com
514413481Sgiacomo.travaglini@arm.com#endif  //  GTEST_HAS_PARAM_TEST
514513481Sgiacomo.travaglini@arm.com
514613481Sgiacomo.travaglini@arm.com#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
5147