141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This file was GENERATED by command:
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     pump.py gtest-param-test.h.pump
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DO NOT EDIT BY HAND!!!
41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2008, Google Inc.
61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved.
71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without
91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are
101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met:
111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions of source code must retain the above copyright
131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer.
141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions in binary form must reproduce the above
151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer
161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the
171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution.
181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Neither the name of Google Inc. nor the names of its
191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from
201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission.
211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Authors: vladl@google.com (Vlad Losev)
351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros and functions for implementing parameterized tests
371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in Google C++ Testing Framework (Google Test)
381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Value-parameterized tests allow you to test your code with different
461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// parameters without writing multiple copies of the same test.
471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Here is how you use value-parameterized tests:
491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if 0
511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// To write value-parameterized tests, first you should define a fixture
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// class. It is usually derived from testing::TestWithParam<T> (see below for
5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// another inheritance scheme that's sometimes useful in more complicated
5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// class hierarchies), where the type of your parameter values.
5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TestWithParam<T> is itself derived from testing::Test. T can be any
5741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// copyable type. If it's a raw pointer, you are responsible for managing the
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// lifespan of the pointed values.
591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass FooTest : public ::testing::TestWithParam<const char*> {
611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // You can implement all the usual class fixture members here.
621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Then, use the TEST_P macro to define as many parameterized tests
651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// for this fixture as you want. The _P suffix is for "parameterized"
661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// or "pattern", whichever you prefer to think.
671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
681be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_P(FooTest, DoesBlah) {
691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // Inside a test, access the test parameter with the GetParam() method
701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // of the TestWithParam<T> class:
711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  EXPECT_TRUE(foo.Blah(GetParam()));
721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ...
731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
751be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_P(FooTest, HasBlahBlah) {
761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ...
771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// case with any set of parameters you want. Google Test defines a number
811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// of functions for generating test parameters. They return what we call
821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (surprise!) parameter generators. Here is a  summary of them, which
831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// are all in the testing namespace:
841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  Range(begin, end [, step]) - Yields values {begin, begin+step,
871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                               begin+step+step, ...}. The values do not
881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                               include end. step defaults to 1.
891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  ValuesIn(container)        - Yields values from a C-style array, an STL
911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  Bool()                     - Yields sequence {false, true}.
931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                               for the math savvy) of the values generated
951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                               by the N generators.
961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// For more details, see comments at the definitions of these functions below
981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in this file.
991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The following statement will instantiate tests from the FooTest test case
1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// each with parameter values "meeny", "miny", and "moe".
1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaINSTANTIATE_TEST_CASE_P(InstantiationName,
1041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                        FooTest,
1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                        Values("meeny", "miny", "moe"));
1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// To distinguish different instances of the pattern, (yes, you
1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// can instantiate it more then once) the first argument to the
1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// actual test case name. Remember to pick unique prefixes for different
1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// instantiations. The tests from the instantiation above will have
1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// these names:
1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
1171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
1181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// You can use these names in --gtest_filter.
1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This statement will instantiate all tests from FooTest again, each
1241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// with parameter values "cat" and "dog":
1251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst char* pets[] = {"cat", "dog"};
1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
1281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The tests from the instantiation above will have these names:
1301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
1371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the given test case, whether their definitions come before or
1381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// AFTER the INSTANTIATE_TEST_CASE_P statement.
1391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Please also note that generator expressions (including parameters to the
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// generators) are evaluated in InitGoogleTest(), after main() has started.
14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This allows the user on one hand, to adjust generator parameters in order
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// to dynamically determine a set of tests to run and on the other hand,
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// give the user a chance to inspect the generated tests with Google Test
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// reflection API before RUN_ALL_TESTS() is executed.
1461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
1481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// for more examples.
1491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// In the future, we plan to publish the API for defining new parameter
1511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// generators. But for now this interface remains part of the internal
1521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// implementation and is subject to change.
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A parameterized test fixture must be derived from testing::Test and from
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// testing::WithParamInterface<T>, where T is the type of the parameter
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// values. Inheriting from TestWithParam<T> satisfies that requirement because
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TestWithParam<T> inherits from both Test and WithParamInterface. In more
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// complicated hierarchies, however, it is occasionally useful to inherit
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// separately from Test and WithParamInterface. For example:
16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass BaseTest : public ::testing::Test {
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // You can inherit all the usual members for a non-parameterized test
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // fixture here.
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // The usual test fixture members go here too.
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(BaseTest, HasFoo) {
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // This is an ordinary non-parameterized test.
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_P(DerivedTest, DoesBlah) {
17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // GetParam works just the same here as if you inherit from TestWithParam.
17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(foo.Blah(GetParam()));
17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
1791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // 0
1811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-port.h"
1831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !GTEST_OS_SYMBIAN
18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <utility>
18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif
1871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// scripts/fuse_gtest.py depends on gtest's own header being #included
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// *unconditionally*.  Therefore these #includes cannot be moved
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// inside #if GTEST_HAS_PARAM_TEST.
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-internal.h"
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-param-util.h"
193fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes#include "gtest/internal/gtest-param-util-generated.h"
1941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_PARAM_TEST
1961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace testing {
1981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Functions producing parameter generators.
2001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Google Test uses these generators to produce parameters for value-
2021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// parameterized tests. When a parameterized test case is instantiated
2031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// with a particular generator, Google Test creates and runs tests
2041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// for each element in the sequence produced by the generator.
2051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// In the following sample, tests from test case FooTest are instantiated
2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// each three times with parameter values 3, 5, and 8:
2081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// class FooTest : public TestWithParam<int> { ... };
2101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TEST_P(FooTest, TestThis) {
2121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// }
2131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TEST_P(FooTest, TestThat) {
2141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// }
2151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
2161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Range() returns generators providing sequences of values in a range.
2191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synopsis:
2211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Range(start, end)
2221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing a sequence of values {start, start+1,
2231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     start+2, ..., }.
2241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Range(start, end, step)
2251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing a sequence of values {start, start+step,
2261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     start+step+step, ..., }.
2271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Notes:
2281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   * The generated sequences never include end. For example, Range(1, 5)
2291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
2301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     returns a generator producing {1, 3, 5, 7}.
2311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   * start and end must have the same type. That type may be any integral or
2321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     floating-point type or a user defined type satisfying these conditions:
2331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * It must be assignable (have operator=() defined).
2341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * It must have operator+() (operator+(int-compatible type) for
2351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//       two-operand version).
2361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * It must have operator<() defined.
2371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     Elements in the resulting sequences will also have that type.
2381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   * Condition start < end must be satisfied in order for resulting sequences
2391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     to contain any elements.
2401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T, typename IncrementT>
2421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
2431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ParamGenerator<T>(
2441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      new internal::RangeGenerator<T, IncrementT>(start, end, step));
2451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
2461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T>
2481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ParamGenerator<T> Range(T start, T end) {
2491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return Range(start, end, 1);
2501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
2511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ValuesIn() function allows generation of tests with parameters coming from
2531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// a container.
2541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synopsis:
2561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ValuesIn(const T (&array)[N])
2571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing sequences with elements from
2581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     a C-style array.
2591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ValuesIn(const Container& container)
2601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing sequences with elements from
2611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     an STL-style container.
2621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ValuesIn(Iterator begin, Iterator end)
2631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing sequences with elements from
2641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     a range [begin, end) defined by a pair of STL-style iterators. These
2651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     iterators can also be plain C pointers.
2661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Please note that ValuesIn copies the values from the containers
2681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// passed in and keeps them to generate tests in RUN_ALL_TESTS().
2691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Examples:
2711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This instantiates tests from test case StringTest
2731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// each with C-string values of "foo", "bar", and "baz":
2741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// const char* strings[] = {"foo", "bar", "baz"};
2761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
2771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This instantiates tests from test case StlStringTest
2791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// each with STL strings with values "a" and "b":
2801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ::std::vector< ::std::string> GetParameterStrings() {
2821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ::std::vector< ::std::string> v;
2831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   v.push_back("a");
2841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   v.push_back("b");
2851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   return v;
2861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// }
2871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(CharSequence,
2891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         StlStringTest,
2901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         ValuesIn(GetParameterStrings()));
2911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This will also instantiate tests from CharTest
2941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// each with parameter values 'a' and 'b':
2951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
2961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ::std::list<char> GetParameterChars() {
2971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ::std::list<char> list;
2981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   list.push_back('a');
2991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   list.push_back('b');
3001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   return list;
3011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// }
3021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ::std::list<char> l = GetParameterChars();
3031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(CharSequence2,
3041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         CharTest,
3051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         ValuesIn(l.begin(), l.end()));
3061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename ForwardIterator>
3081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ParamGenerator<
30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotValuesIn(ForwardIterator begin, ForwardIterator end) {
31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      ::value_type ParamType;
3131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ParamGenerator<ParamType>(
3141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
3151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T, size_t N>
3181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
3191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return ValuesIn(array, array + N);
3201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <class Container>
3231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ParamGenerator<typename Container::value_type> ValuesIn(
3241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Container& container) {
3251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return ValuesIn(container.begin(), container.end());
3261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Values() allows generating tests from explicitly specified list of
3291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// parameters.
3301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synopsis:
3321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Values(T v1, T v2, ..., T vN)
3331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing sequences with elements v1, v2, ..., vN.
3341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// For example, this instantiates tests from test case BarTest each
3361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// with values "one", "two", and "three":
3371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
3391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
3411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The exact type of values will depend on the type of parameter in BazTest.
3421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
3441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Currently, Values() supports from 1 to 50 parameters.
3461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
3471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1>
3481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray1<T1> Values(T1 v1) {
3491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray1<T1>(v1);
3501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2>
3531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
3541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray2<T1, T2>(v1, v2);
3551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3>
3581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
3591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
3601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4>
3631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
3641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
3651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
3691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T5 v5) {
3701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
3711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6>
3751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
3761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T4 v4, T5 v5, T6 v6) {
3771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
3781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7>
3821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
3831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T4 v4, T5 v5, T6 v6, T7 v7) {
3841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
3851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v6, v7);
3861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8>
3901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
3911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
3921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
3931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5, v6, v7, v8);
3941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9>
3981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
3991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
4001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
4011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4, v5, v6, v7, v8, v9);
4021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10>
4061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
4071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
4081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
4091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2, v3, v4, v5, v6, v7, v8, v9, v10);
4101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11>
4151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11) {
4181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
4201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12>
4251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12) {
4281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
4301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13>
4351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13) {
4381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
4401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14>
4451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
4481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
4501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14);
4511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15>
4561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
4581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
4591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
4611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13, v14, v15);
4621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
4671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16>
4681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16) {
4721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
4741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12, v13, v14, v15, v16);
4751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
4801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17>
4811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17) {
4851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
4871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11, v12, v13, v14, v15, v16, v17);
4881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
4891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
4921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
4931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18>
4941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
4961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18) {
4981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
5001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10, v11, v12, v13, v14, v15, v16, v17, v18);
5011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19>
5071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
5091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
5101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
5111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
5131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
5141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20>
5201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
5241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
5261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
5271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
5331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21>
5341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
5381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
5401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
5411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
5471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22>
5481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
5501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T21 v21, T22 v22) {
5531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
5551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20, v21, v22);
5571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
5631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23>
5641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
5661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T21 v21, T22 v22, T23 v23) {
5691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
5711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20, v21, v22, v23);
5731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
5791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24>
5801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
5821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T21 v21, T22 v22, T23 v23, T24 v24) {
5851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
5871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
5881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v19, v20, v21, v22, v23, v24);
5891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
5901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
5931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
5941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
5951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25>
5961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
5981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
5991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
6001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
6011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
6031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
6041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v18, v19, v20, v21, v22, v23, v24, v25);
6051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
6061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
6111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
6121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26>
6131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26) {
6191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
6221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
6231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
6241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
6291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
6301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27>
6311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27) {
6371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
6401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
6411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
6421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
6471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
6481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28>
6491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27, T28 v28) {
6551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
6581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
6591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v28);
6601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
6611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
6661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
6671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29>
6681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27, T28 v28, T29 v29) {
6741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
6771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
6781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27, v28, v29);
6791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
6801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
6831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
6841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
6851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
6861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30>
6871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
6901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
6911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
6921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
6931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
6961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
6971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v26, v27, v28, v29, v30);
6981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
6991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
7041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
7051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
7061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31>
7071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
7131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
7161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
7171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v25, v26, v27, v28, v29, v30, v31);
7181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
7191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
7241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
7251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
7261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32>
7271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T32 v32) {
7341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
7371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24, v25, v26, v27, v28, v29, v30, v31, v32);
7391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
7401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
7451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
7461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
7471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33>
7481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
7511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T32 v32, T33 v33) {
7551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
7581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
7601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
7611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
7661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
7671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
7681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34>
7691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
7721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
7731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
7741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
7751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T31 v31, T32 v32, T33 v33, T34 v34) {
7761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
7791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
7801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
7811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
7821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
7851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
7861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
7871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
7881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
7891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35>
7901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
7931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
7941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
7951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
7961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
7971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
8001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
8011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
8021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
8031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
8061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
8071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
8081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
8091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
8101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
8111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36>
8121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
8151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
8161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
8171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
8181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
8191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
8221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v34, v35, v36);
8251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
8261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
8291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
8301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
8311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
8321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
8331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
8341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37>
8351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
8381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T37 v37) {
8431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
8461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v34, v35, v36, v37);
8491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
8501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
8531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
8541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
8551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
8561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
8571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
8581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38>
8591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
8621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T37 v37, T38 v38) {
8671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
8701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
8711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
8721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v33, v34, v35, v36, v37, v38);
8731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
8741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
8771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
8781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
8791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
8801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
8811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
8821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39>
8831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
8861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T37 v37, T38 v38, T39 v39) {
8911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
8941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
8951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
8961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v32, v33, v34, v35, v36, v37, v38, v39);
8971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
8981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
9011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
9021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
9031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
9041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
9051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
9061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40>
9071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
9101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
9111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
9121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
9131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
9141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
9151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
9191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
9201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
9211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
9221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
9251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
9261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
9271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
9281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
9291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
9301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
9311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41>
9321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
9351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
9401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
9441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
9451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
9461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
9471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
9501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
9511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
9521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
9531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
9541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
9551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
9561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42>
9571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
9601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T42 v42) {
9661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
9701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
9711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
9721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v42);
9731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
9741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
9771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
9781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
9791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
9801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
9811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
9821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
9831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43>
9841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
9871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T42 v42, T43 v43) {
9931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
9971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
9981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
9991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v41, v42, v43);
10001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
10011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
10041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
10051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
10061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
10071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
10081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
10091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
10101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44>
10111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
10181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
10191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T42 v42, T43 v43, T44 v44) {
10201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
10241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
10251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
10261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v40, v41, v42, v43, v44);
10271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
10281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
10311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
10321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
10331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
10341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
10351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
10361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
10371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45>
10381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
10431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
10441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
10451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
10461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
10471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
10511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
10521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
10531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v39, v40, v41, v42, v43, v44, v45);
10541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
10551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
10581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
10591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
10601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
10611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
10621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
10631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
10641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
10651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46>
10661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
10721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
10731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
10741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
10751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
10791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
10801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
10811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v38, v39, v40, v41, v42, v43, v44, v45, v46);
10821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
10831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
10841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
10861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
10871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
10881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
10891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
10901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
10911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
10921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
10931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47>
10941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
11031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
11071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
11081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
11091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
11101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
11111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
11141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
11151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
11161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
11171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
11181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
11191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
11201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
11211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47, typename T48>
11221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
11261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
11271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
11311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T48 v48) {
11321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
11361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
11371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
11381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
11391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
11401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
11431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
11441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
11451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
11461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
11471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
11481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
11491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
11501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47, typename T48, typename T49>
11511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
11551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
11561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
11571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
11581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
11591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
11601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T47 v47, T48 v48, T49 v49) {
11611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
11651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
11661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
11671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
11681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
11691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
11701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T6, typename T7, typename T8, typename T9, typename T10,
11721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T11, typename T12, typename T13, typename T14, typename T15,
11731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T16, typename T17, typename T18, typename T19, typename T20,
11741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T21, typename T22, typename T23, typename T24, typename T25,
11751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T26, typename T27, typename T28, typename T29, typename T30,
11761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T31, typename T32, typename T33, typename T34, typename T35,
11771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T36, typename T37, typename T38, typename T39, typename T40,
11781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T41, typename T42, typename T43, typename T44, typename T45,
11791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename T46, typename T47, typename T48, typename T49, typename T50>
11801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
11841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
11851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
11861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
11871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
11881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
11891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
11901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
11941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
11951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
11961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
11971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      v48, v49, v50);
11981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
11991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Bool() allows generating tests with parameters in a set of (false, true).
12011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synopsis:
12031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Bool()
12041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing sequences with elements {false, true}.
12051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// It is useful when testing code that depends on Boolean flags. Combinations
12071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// of multiple flags can be tested when several Bool()'s are combined using
12081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Combine() function.
12091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// In the following example all tests in the test case FlagDependentTest
12111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// will be instantiated twice with parameters false and true.
12121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// class FlagDependentTest : public testing::TestWithParam<bool> {
12141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   virtual void SetUp() {
12151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     external_flag = GetParam();
12161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   }
12171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// }
12181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
12191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline internal::ParamGenerator<bool> Bool() {
12211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return Values(false, true);
12221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
12231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
122441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_HAS_COMBINE
12251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Combine() allows the user to combine two or more sequences to produce
12261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// values of a Cartesian product of those sequences' elements.
12271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synopsis:
12291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Combine(gen1, gen2, ..., genN)
12301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   - returns a generator producing sequences with elements coming from
12311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     the Cartesian product of elements from the sequences generated by
12321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     gen1, gen2, ..., genN. The sequence elements will have a type of
12331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
12341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     of elements from sequences produces by gen1, gen2, ..., genN.
12351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Combine can have up to 10 arguments. This number is currently limited
12371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// by the maximum number of elements in the tuple implementation used by Google
12381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Test.
12391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Example:
12411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This will instantiate tests in test case AnimalTest each one with
12431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
12441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// tuple("dog", BLACK), and tuple("dog", WHITE):
12451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// enum Color { BLACK, GRAY, WHITE };
12471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// class AnimalTest
12481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
12491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TEST_P(AnimalTest, AnimalLooksNice) {...}
12511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
12531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         Combine(Values("cat", "dog"),
12541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                                 Values(BLACK, WHITE)));
12551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This will instantiate tests in FlagDependentTest with all variations of two
12571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Boolean flags:
12581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// class FlagDependentTest
1260fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes//     : public testing::TestWithParam<tuple<bool, bool> > {
12611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   virtual void SetUp() {
12621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
12631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     tie(external_flag_1, external_flag_2) = GetParam();
12641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   }
12651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// };
12661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TEST_P(FlagDependentTest, TestFeature1) {
12681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   // Test your code using external_flag_1 and external_flag_2 here.
12691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// }
12701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
12711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         Combine(Bool(), Bool()));
12721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
12731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2>
12741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder2<Generator1, Generator2> Combine(
12751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2) {
12761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder2<Generator1, Generator2>(
12771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2);
12781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
12791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3>
12811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
12821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
12831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
12841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3);
12851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
12861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
12881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4>
12891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4> Combine(
12911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
12921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4) {
12931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4>(
12951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4);
12961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
12971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
12981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
12991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4, typename Generator5>
13001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4, Generator5> Combine(
13021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4, const Generator5& g5) {
13041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4, Generator5>(
13061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4, g5);
13071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
13081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
13101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4, typename Generator5, typename Generator6>
13111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4, Generator5, Generator6> Combine(
13131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
13151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4, Generator5, Generator6>(
13171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4, g5, g6);
13181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
13191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
13211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4, typename Generator5, typename Generator6,
13221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator7>
13231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4, Generator5, Generator6, Generator7> Combine(
13251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator7& g7) {
13281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4, Generator5, Generator6, Generator7>(
13301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4, g5, g6, g7);
13311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
13321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
13341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4, typename Generator5, typename Generator6,
13351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator7, typename Generator8>
13361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
13381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator7& g7, const Generator8& g8) {
13411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4, Generator5, Generator6, Generator7, Generator8>(
13431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4, g5, g6, g7, g8);
13441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
13451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
13471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4, typename Generator5, typename Generator6,
13481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator7, typename Generator8, typename Generator9>
13491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4, Generator5, Generator6, Generator7, Generator8,
13511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator9> Combine(
13521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
13551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
13571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4, g5, g6, g7, g8, g9);
13581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
13591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Generator1, typename Generator2, typename Generator3,
13611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator4, typename Generator5, typename Generator6,
13621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator7, typename Generator8, typename Generator9,
13631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    typename Generator10>
13641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    Generator10> Combine(
13671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator7& g7, const Generator8& g8, const Generator9& g9,
13701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        const Generator10& g10) {
13711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      Generator10>(
13741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
13751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
137641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif  // GTEST_HAS_COMBINE
13771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
138041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define TEST_P(test_case_name, test_name) \
13811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
13821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      : public test_case_name { \
13831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   public: \
13841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
13851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    virtual void TestBody(); \
13861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania   private: \
13871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    static int AddToRegistry() { \
13881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
13891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          GetTestCasePatternHolder<test_case_name>(\
13901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
13911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                  #test_case_name, \
13921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                  #test_name, \
13931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                  new ::testing::internal::TestMetaFactory< \
13941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
13951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      return 0; \
13961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    } \
13971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    static int gtest_registering_dummy_; \
13981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
13991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
14001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }; \
14011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  int GTEST_TEST_CLASS_NAME_(test_case_name, \
14021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                             test_name)::gtest_registering_dummy_ = \
14031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
14041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
14051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
140641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
14071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
14081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
14091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  int gtest_##prefix##test_case_name##_dummy_ = \
14101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
14111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          GetTestCasePatternHolder<test_case_name>(\
14121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
14131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                  #prefix, \
14141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
14151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                  __FILE__, __LINE__)
14161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}  // namespace testing
14181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_PARAM_TEST
14201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
14211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1422