1915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// This file was GENERATED by command:
2915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan//     pump.py gtest-param-test.h.pump
3915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// DO NOT EDIT BY HAND!!!
43d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
53d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Copyright 2008, Google Inc.
63d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// All rights reserved.
73d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
83d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Redistribution and use in source and binary forms, with or without
93d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// modification, are permitted provided that the following conditions are
103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// met:
113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     * Redistributions of source code must retain the above copyright
133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// notice, this list of conditions and the following disclaimer.
143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     * Redistributions in binary form must reproduce the above
153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// copyright notice, this list of conditions and the following disclaimer
163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// in the documentation and/or other materials provided with the
173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// distribution.
183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     * Neither the name of Google Inc. nor the names of its
193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// contributors may be used to endorse or promote products derived from
203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// this software without specific prior written permission.
213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Authors: vladl@google.com (Vlad Losev)
353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Macros and functions for implementing parameterized tests
373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// in Google C++ Testing Framework (Google Test)
383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Value-parameterized tests allow you to test your code with different
463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// parameters without writing multiple copies of the same test.
473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Here is how you use value-parameterized tests:
493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev#if 0
513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// To write value-parameterized tests, first you should define a fixture
53915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// class. It is usually derived from testing::TestWithParam<T> (see below for
54915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// another inheritance scheme that's sometimes useful in more complicated
55915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// class hierarchies), where the type of your parameter values.
56915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// TestWithParam<T> is itself derived from testing::Test. T can be any
57915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// copyable type. If it's a raw pointer, you are responsible for managing the
58915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// lifespan of the pointed values.
593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevclass FooTest : public ::testing::TestWithParam<const char*> {
613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  // You can implement all the usual class fixture members here.
623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev};
633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Then, use the TEST_P macro to define as many parameterized tests
653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// for this fixture as you want. The _P suffix is for "parameterized"
663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// or "pattern", whichever you prefer to think.
673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevTEST_P(FooTest, DoesBlah) {
693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  // Inside a test, access the test parameter with the GetParam() method
703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  // of the TestWithParam<T> class:
713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  EXPECT_TRUE(foo.Blah(GetParam()));
723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  ...
733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevTEST_P(FooTest, HasBlahBlah) {
763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  ...
773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// case with any set of parameters you want. Google Test defines a number
813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// of functions for generating test parameters. They return what we call
823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// (surprise!) parameter generators. Here is a  summary of them, which
833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// are all in the testing namespace:
843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//  Range(begin, end [, step]) - Yields values {begin, begin+step,
873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                               begin+step+step, ...}. The values do not
883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                               include end. step defaults to 1.
893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//  ValuesIn(container)        - Yields values from a C-style array, an STL
913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//  Bool()                     - Yields sequence {false, true}.
933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                               for the math savvy) of the values generated
953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                               by the N generators.
963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// For more details, see comments at the definitions of these functions below
983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// in this file.
993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// The following statement will instantiate tests from the FooTest test case
1013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// each with parameter values "meeny", "miny", and "moe".
1023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevINSTANTIATE_TEST_CASE_P(InstantiationName,
1043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev                        FooTest,
1053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev                        Values("meeny", "miny", "moe"));
1063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// To distinguish different instances of the pattern, (yes, you
1083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// can instantiate it more then once) the first argument to the
1093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
1103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// actual test case name. Remember to pick unique prefixes for different
1113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// instantiations. The tests from the instantiation above will have
1123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// these names:
1133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
1153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
1163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
1173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
1183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
1193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
1203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// You can use these names in --gtest_filter.
1223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This statement will instantiate all tests from FooTest again, each
1243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// with parameter values "cat" and "dog":
1253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevconst char* pets[] = {"cat", "dog"};
1273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
1283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// The tests from the instantiation above will have these names:
1303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
1323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
1333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
1343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
1353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
1373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// in the given test case, whether their definitions come before or
1383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// AFTER the INSTANTIATE_TEST_CASE_P statement.
1393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
14090030d74c8cacbdab62136daa465a7ef359e2adcvladlosev// Please also note that generator expressions (including parameters to the
14190030d74c8cacbdab62136daa465a7ef359e2adcvladlosev// generators) are evaluated in InitGoogleTest(), after main() has started.
14290030d74c8cacbdab62136daa465a7ef359e2adcvladlosev// This allows the user on one hand, to adjust generator parameters in order
14390030d74c8cacbdab62136daa465a7ef359e2adcvladlosev// to dynamically determine a set of tests to run and on the other hand,
14490030d74c8cacbdab62136daa465a7ef359e2adcvladlosev// give the user a chance to inspect the generated tests with Google Test
14590030d74c8cacbdab62136daa465a7ef359e2adcvladlosev// reflection API before RUN_ALL_TESTS() is executed.
1463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
1483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// for more examples.
1493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
1503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// In the future, we plan to publish the API for defining new parameter
1513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// generators. But for now this interface remains part of the internal
1523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// implementation and is subject to change.
153915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan//
154915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan//
155915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// A parameterized test fixture must be derived from testing::Test and from
156915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// testing::WithParamInterface<T>, where T is the type of the parameter
157915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// values. Inheriting from TestWithParam<T> satisfies that requirement because
158915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// TestWithParam<T> inherits from both Test and WithParamInterface. In more
159915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// complicated hierarchies, however, it is occasionally useful to inherit
160915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan// separately from Test and WithParamInterface. For example:
161915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan
162915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wanclass BaseTest : public ::testing::Test {
163915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan  // You can inherit all the usual members for a non-parameterized test
164915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan  // fixture here.
165915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan};
166915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan
167915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wanclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
168915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan  // The usual test fixture members go here too.
169915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan};
170915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan
171915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wanTEST_F(BaseTest, HasFoo) {
172915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan  // This is an ordinary non-parameterized test.
173915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan}
174915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan
175915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wanTEST_P(DerivedTest, DoesBlah) {
176915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan  // GetParam works just the same here as if you inherit from TestWithParam.
177915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan  EXPECT_TRUE(foo.Blah(GetParam()));
178915129ee6fd4d9c5564aafedb238a237592a3d42zhanyong.wan}
1793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev#endif  // 0
1813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
182dac3e879c56a50696a36f53e1e5e353e48fa665fzhanyong.wan#include "gtest/internal/gtest-port.h"
1833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1844853a503371f39aa22e14adcdecea71c09841e34zhanyong.wan#if !GTEST_OS_SYMBIAN
185ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan# include <utility>
1864853a503371f39aa22e14adcdecea71c09841e34zhanyong.wan#endif
1873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1887e13e0f5dd2f9458e0a613e0a91c894eb80126fczhanyong.wan// scripts/fuse_gtest.py depends on gtest's own header being #included
1897e13e0f5dd2f9458e0a613e0a91c894eb80126fczhanyong.wan// *unconditionally*.  Therefore these #includes cannot be moved
1907e13e0f5dd2f9458e0a613e0a91c894eb80126fczhanyong.wan// inside #if GTEST_HAS_PARAM_TEST.
191dac3e879c56a50696a36f53e1e5e353e48fa665fzhanyong.wan#include "gtest/internal/gtest-internal.h"
192dac3e879c56a50696a36f53e1e5e353e48fa665fzhanyong.wan#include "gtest/internal/gtest-param-util.h"
193dac3e879c56a50696a36f53e1e5e353e48fa665fzhanyong.wan#include "gtest/internal/gtest-param-util-generated.h"
1943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1957e13e0f5dd2f9458e0a613e0a91c894eb80126fczhanyong.wan#if GTEST_HAS_PARAM_TEST
1967e13e0f5dd2f9458e0a613e0a91c894eb80126fczhanyong.wan
1973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevnamespace testing {
1983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Functions producing parameter generators.
2003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Google Test uses these generators to produce parameters for value-
2023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// parameterized tests. When a parameterized test case is instantiated
2033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// with a particular generator, Google Test creates and runs tests
2043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// for each element in the sequence produced by the generator.
2053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// In the following sample, tests from test case FooTest are instantiated
2073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// each three times with parameter values 3, 5, and 8:
2083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// class FooTest : public TestWithParam<int> { ... };
2103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// TEST_P(FooTest, TestThis) {
2123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// }
2133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// TEST_P(FooTest, TestThat) {
2143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// }
2153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
2163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
2183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Range() returns generators providing sequences of values in a range.
2193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Synopsis:
2213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Range(start, end)
2223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing a sequence of values {start, start+1,
2233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     start+2, ..., }.
2243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Range(start, end, step)
2253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing a sequence of values {start, start+step,
2263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     start+step+step, ..., }.
2273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Notes:
2283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   * The generated sequences never include end. For example, Range(1, 5)
2293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
2303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     returns a generator producing {1, 3, 5, 7}.
2313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   * start and end must have the same type. That type may be any integral or
2323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     floating-point type or a user defined type satisfying these conditions:
2333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     * It must be assignable (have operator=() defined).
2343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     * It must have operator+() (operator+(int-compatible type) for
2353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//       two-operand version).
2363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     * It must have operator<() defined.
2373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     Elements in the resulting sequences will also have that type.
2383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   * Condition start < end must be satisfied in order for resulting sequences
2393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     to contain any elements.
2403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T, typename IncrementT>
2423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
2433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ParamGenerator<T>(
2443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      new internal::RangeGenerator<T, IncrementT>(start, end, step));
2453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
2463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
2473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T>
2483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ParamGenerator<T> Range(T start, T end) {
2493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return Range(start, end, 1);
2503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
2513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
2523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ValuesIn() function allows generation of tests with parameters coming from
2533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// a container.
2543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Synopsis:
2563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ValuesIn(const T (&array)[N])
2573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing sequences with elements from
2583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     a C-style array.
2593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ValuesIn(const Container& container)
2603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing sequences with elements from
2613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     an STL-style container.
2623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ValuesIn(Iterator begin, Iterator end)
2633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing sequences with elements from
2643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     a range [begin, end) defined by a pair of STL-style iterators. These
2653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     iterators can also be plain C pointers.
2663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Please note that ValuesIn copies the values from the containers
2683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// passed in and keeps them to generate tests in RUN_ALL_TESTS().
2693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Examples:
2713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This instantiates tests from test case StringTest
2733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// each with C-string values of "foo", "bar", and "baz":
2743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// const char* strings[] = {"foo", "bar", "baz"};
2763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
2773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This instantiates tests from test case StlStringTest
2793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// each with STL strings with values "a" and "b":
2803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ::std::vector< ::std::string> GetParameterStrings() {
2823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   ::std::vector< ::std::string> v;
2833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   v.push_back("a");
2843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   v.push_back("b");
2853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   return v;
2863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// }
2873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(CharSequence,
2893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                         StlStringTest,
2903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                         ValuesIn(GetParameterStrings()));
2913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This will also instantiate tests from CharTest
2943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// each with parameter values 'a' and 'b':
2953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
2963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ::std::list<char> GetParameterChars() {
2973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   ::std::list<char> list;
2983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   list.push_back('a');
2993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   list.push_back('b');
3003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   return list;
3013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// }
3023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// ::std::list<char> l = GetParameterChars();
3033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(CharSequence2,
3043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                         CharTest,
3053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                         ValuesIn(l.begin(), l.end()));
3063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename ForwardIterator>
3083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ParamGenerator<
309fc99b1ad515ccfc92ee92001c409f69385033af5zhanyong.wan  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
310fc99b1ad515ccfc92ee92001c409f69385033af5zhanyong.wanValuesIn(ForwardIterator begin, ForwardIterator end) {
311fc99b1ad515ccfc92ee92001c409f69385033af5zhanyong.wan  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
312fc99b1ad515ccfc92ee92001c409f69385033af5zhanyong.wan      ::value_type ParamType;
3133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ParamGenerator<ParamType>(
3143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
3153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T, size_t N>
3183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
3193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return ValuesIn(array, array + N);
3203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <class Container>
3233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ParamGenerator<typename Container::value_type> ValuesIn(
3243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Container& container) {
3253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return ValuesIn(container.begin(), container.end());
3263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Values() allows generating tests from explicitly specified list of
3293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// parameters.
3303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Synopsis:
3323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Values(T v1, T v2, ..., T vN)
3333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing sequences with elements v1, v2, ..., vN.
3343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// For example, this instantiates tests from test case BarTest each
3363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// with values "one", "two", and "three":
3373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
3393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
3413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// The exact type of values will depend on the type of parameter in BazTest.
3423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
3443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Currently, Values() supports from 1 to 50 parameters.
3463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
3473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1>
3483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray1<T1> Values(T1 v1) {
3493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray1<T1>(v1);
3503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2>
3533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
3543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray2<T1, T2>(v1, v2);
3553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3>
3583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
3593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
3603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4>
3633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
3643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
3653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
3693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T5 v5) {
3703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
3713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6>
3753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
3763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T4 v4, T5 v5, T6 v6) {
3773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
3783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7>
3823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
3833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T4 v4, T5 v5, T6 v6, T7 v7) {
3843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
3853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v6, v7);
3863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8>
3903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
3913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
3923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
3933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v5, v6, v7, v8);
3943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
3953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
3963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9>
3983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
3993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
4003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
4013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v4, v5, v6, v7, v8, v9);
4023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10>
4063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
4073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
4083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
4093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v2, v3, v4, v5, v6, v7, v8, v9, v10);
4103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11>
4153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11) {
4183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
4193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
4203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12>
4253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12) {
4283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
4303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13>
4353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13) {
4383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
4403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14>
4453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
4473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
4483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
4503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v14);
4513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15>
4563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
4583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
4593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
4613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v13, v14, v15);
4623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
4673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16>
4683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16) {
4723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
4743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v12, v13, v14, v15, v16);
4753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
4803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17>
4813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
4833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17) {
4853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
4873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v11, v12, v13, v14, v15, v16, v17);
4883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
4893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
4903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
4923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
4933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18>
4943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
4963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
4973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18) {
4983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
5003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v10, v11, v12, v13, v14, v15, v16, v17, v18);
5013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19>
5073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
5093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
5103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
5113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
5133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
5143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20>
5203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
5243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
5263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
5273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
5333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21>
5343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
5363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
5373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
5383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
5403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
5413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
5473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22>
5483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
5503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T21 v21, T22 v22) {
5533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
5553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v20, v21, v22);
5573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
5633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23>
5643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
5663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T21 v21, T22 v22, T23 v23) {
5693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
5713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
5723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v20, v21, v22, v23);
5733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
5793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24>
5803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
5823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
5833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
5843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T21 v21, T22 v22, T23 v23, T24 v24) {
5853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
5863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
5873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
5883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v19, v20, v21, v22, v23, v24);
5893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
5903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
5913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
5933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
5943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
5953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25>
5963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
5983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
5993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
6003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
6013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
6033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
6043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v18, v19, v20, v21, v22, v23, v24, v25);
6053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
6063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
6073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
6093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
6103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
6113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
6123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26>
6133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26) {
6193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
6223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
6233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
6243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
6253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
6273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
6283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
6293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
6303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27>
6313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27) {
6373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
6403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
6413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
6423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
6433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
6453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
6463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
6473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
6483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28>
6493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27, T28 v28) {
6553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
6583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
6593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v28);
6603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
6613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
6623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
6643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
6653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
6663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
6673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29>
6683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
6713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
6723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
6733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27, T28 v28, T29 v29) {
6743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
6773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
6783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v27, v28, v29);
6793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
6803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
6813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
6833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
6843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
6853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
6863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30>
6873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
6903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
6913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
6923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
6933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
6943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
6953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
6963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
6973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v26, v27, v28, v29, v30);
6983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
6993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
7003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
7023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
7033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
7043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
7053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
7063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31>
7073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
7133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
7163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
7173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v25, v26, v27, v28, v29, v30, v31);
7183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
7193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
7203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
7223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
7233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
7243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
7253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
7263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32>
7273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
7303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T32 v32) {
7343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
7373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v24, v25, v26, v27, v28, v29, v30, v31, v32);
7393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
7403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
7413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
7433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
7443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
7453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
7463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
7473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33>
7483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
7513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
7523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
7533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
7543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T32 v32, T33 v33) {
7553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
7583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
7593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
7603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
7613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
7623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
7643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
7653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
7663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
7673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
7683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34>
7693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
7723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
7733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
7743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
7753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T31 v31, T32 v32, T33 v33, T34 v34) {
7763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
7793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
7803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
7813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
7823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
7833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
7853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
7863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
7873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
7883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
7893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35>
7903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
7933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
7943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
7953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
7963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
7973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
7983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
7993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
8003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
8013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
8023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
8033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
8043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
8063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
8073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
8083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
8093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
8103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
8113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36>
8123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
8153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
8163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
8173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
8183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
8193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
8223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v34, v35, v36);
8253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
8263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
8273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
8293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
8303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
8313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
8323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
8333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
8343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37>
8353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
8383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T37 v37) {
8433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
8463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
8473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
8483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v34, v35, v36, v37);
8493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
8503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
8513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
8533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
8543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
8553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
8563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
8573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
8583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38>
8593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
8623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T37 v37, T38 v38) {
8673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
8703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
8713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
8723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v33, v34, v35, v36, v37, v38);
8733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
8743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
8753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
8763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
8773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
8783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
8793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
8803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
8813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
8823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39>
8833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
8843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
8853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
8863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
8873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
8883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
8893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
8903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T37 v37, T38 v38, T39 v39) {
8913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
8923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
8933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
8943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
8953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
8963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v32, v33, v34, v35, v36, v37, v38, v39);
8973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
8983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
8993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
9013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
9023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
9033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
9043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
9053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
9063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40>
9073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
9103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
9113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
9123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
9133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
9143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
9153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
9193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
9203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
9213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
9223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
9233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
9253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
9263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
9273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
9283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
9293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
9303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
9313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41>
9323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
9353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
9403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
9443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
9453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
9463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
9473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
9483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
9503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
9513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
9523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
9533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
9543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
9553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
9563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42>
9573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
9603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T42 v42) {
9663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
9703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
9713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
9723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v42);
9733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
9743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
9753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
9773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
9783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
9793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
9803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
9813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
9823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
9833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43>
9843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
9853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
9863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
9873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
9883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
9893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
9903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
9913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
9923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T42 v42, T43 v43) {
9933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
9943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
9953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
9963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
9973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
9983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
9993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v41, v42, v43);
10003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
10013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
10023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
10043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
10053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
10063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
10073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
10083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
10093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
10103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44>
10113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
10163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
10173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
10183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
10193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T42 v42, T43 v43, T44 v44) {
10203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
10243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
10253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
10263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v40, v41, v42, v43, v44);
10273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
10283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
10293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
10313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
10323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
10333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
10343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
10353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
10363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
10373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44, typename T45>
10383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
10433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
10443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
10453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
10463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
10473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
10513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
10523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
10533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v39, v40, v41, v42, v43, v44, v45);
10543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
10553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
10563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
10583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
10593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
10603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
10613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
10623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
10633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
10643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44, typename T45,
10653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T46>
10663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
10723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
10733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
10743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
10753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
10763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
10773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
10783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
10793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
10803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
10813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v38, v39, v40, v41, v42, v43, v44, v45, v46);
10823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
10833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
10843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
10863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
10873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
10883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
10893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
10903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
10913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
10923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44, typename T45,
10933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T46, typename T47>
10943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
10953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
10963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
10973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
10993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
11033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
11073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
11083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
11093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
11103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
11113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
11123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
11143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
11153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
11163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
11173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
11183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
11193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
11203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44, typename T45,
11213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T46, typename T47, typename T48>
11223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
11263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
11273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
11283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
11293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
11303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
11313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T48 v48) {
11323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
11363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
11373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
11383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
11393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
11403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
11413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
11433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
11443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
11453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
11463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
11473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
11483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
11493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44, typename T45,
11503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T46, typename T47, typename T48, typename T49>
11513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
11553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
11563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
11573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
11583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
11593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
11603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T47 v47, T48 v48, T49 v49) {
11613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
11653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
11663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
11673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
11683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
11693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
11703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T6, typename T7, typename T8, typename T9, typename T10,
11723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T11, typename T12, typename T13, typename T14, typename T15,
11733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T16, typename T17, typename T18, typename T19, typename T20,
11743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T21, typename T22, typename T23, typename T24, typename T25,
11753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T26, typename T27, typename T28, typename T29, typename T30,
11763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T31, typename T32, typename T33, typename T34, typename T35,
11773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T36, typename T37, typename T38, typename T39, typename T40,
11783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T41, typename T42, typename T43, typename T44, typename T45,
11793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename T46, typename T47, typename T48, typename T49, typename T50>
11803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
11813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
11823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
11833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
11843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
11853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
11863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
11873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
11883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
11893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
11903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
11913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
11923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
11933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
11943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
11953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
11963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
11973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      v48, v49, v50);
11983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
11993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
12003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Bool() allows generating tests with parameters in a set of (false, true).
12013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Synopsis:
12033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Bool()
12043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing sequences with elements {false, true}.
12053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// It is useful when testing code that depends on Boolean flags. Combinations
12073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// of multiple flags can be tested when several Bool()'s are combined using
12083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Combine() function.
12093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// In the following example all tests in the test case FlagDependentTest
12113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// will be instantiated twice with parameters false and true.
12123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// class FlagDependentTest : public testing::TestWithParam<bool> {
12143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   virtual void SetUp() {
12153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     external_flag = GetParam();
12163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   }
12173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// }
12183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
12193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinline internal::ParamGenerator<bool> Bool() {
12213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return Values(false, true);
12223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
12233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1224ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan# if GTEST_HAS_COMBINE
12253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Combine() allows the user to combine two or more sequences to produce
12263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// values of a Cartesian product of those sequences' elements.
12273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Synopsis:
12293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Combine(gen1, gen2, ..., genN)
12303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   - returns a generator producing sequences with elements coming from
12313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     the Cartesian product of elements from the sequences generated by
12323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     gen1, gen2, ..., genN. The sequence elements will have a type of
12333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
12343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     of elements from sequences produces by gen1, gen2, ..., genN.
12353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Combine can have up to 10 arguments. This number is currently limited
12373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// by the maximum number of elements in the tuple implementation used by Google
12383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Test.
12393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Example:
12413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This will instantiate tests in test case AnimalTest each one with
12433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
12443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// tuple("dog", BLACK), and tuple("dog", WHITE):
12453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// enum Color { BLACK, GRAY, WHITE };
12473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// class AnimalTest
12483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
12493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// TEST_P(AnimalTest, AnimalLooksNice) {...}
12513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
12533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                         Combine(Values("cat", "dog"),
12543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                                 Values(BLACK, WHITE)));
12553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// This will instantiate tests in FlagDependentTest with all variations of two
12573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// Boolean flags:
12583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// class FlagDependentTest
1260f0b86fc3b0f625e1db84f3632cb37bd9eae6ae19jgm//     : public testing::TestWithParam<tuple<bool, bool> > {
12613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   virtual void SetUp() {
12623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
12633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//     tie(external_flag_1, external_flag_2) = GetParam();
12643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   }
12653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// };
12663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// TEST_P(FlagDependentTest, TestFeature1) {
12683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//   // Test your code using external_flag_1 and external_flag_2 here.
12693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// }
12703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
12713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//                         Combine(Bool(), Bool()));
12723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev//
12733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2>
12743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder2<Generator1, Generator2> Combine(
12753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2) {
12763d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder2<Generator1, Generator2>(
12773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2);
12783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
12793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
12803d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3>
12813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
12823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
12833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
12843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3);
12853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
12863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
12873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
12883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4>
12893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12903d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4> Combine(
12913d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
12923d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4) {
12933d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
12943d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4>(
12953d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4);
12963d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
12973d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
12983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
12993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4, typename Generator5>
13003d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4, Generator5> Combine(
13023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4, const Generator5& g5) {
13043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
13053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4, Generator5>(
13063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4, g5);
13073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
13083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13093d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
13103d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4, typename Generator5, typename Generator6>
13113d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13123d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4, Generator5, Generator6> Combine(
13133d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13143d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
13153d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
13163d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4, Generator5, Generator6>(
13173d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4, g5, g6);
13183d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
13193d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13203d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
13213d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4, typename Generator5, typename Generator6,
13223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator7>
13233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13243d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4, Generator5, Generator6, Generator7> Combine(
13253d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13263d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13273d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator7& g7) {
13283d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
13293d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4, Generator5, Generator6, Generator7>(
13303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4, g5, g6, g7);
13313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
13323d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13333d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
13343d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4, typename Generator5, typename Generator6,
13353d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator7, typename Generator8>
13363d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13373d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
13383d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator7& g7, const Generator8& g8) {
13413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
13423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4, Generator5, Generator6, Generator7, Generator8>(
13433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4, g5, g6, g7, g8);
13443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
13453d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13463d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
13473d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4, typename Generator5, typename Generator6,
13483d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator7, typename Generator8, typename Generator9>
13493d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13503d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4, Generator5, Generator6, Generator7, Generator8,
13513d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator9> Combine(
13523d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13533d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13543d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
13553d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
13563d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
13573d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4, g5, g6, g7, g8, g9);
13583d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
13593d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13603d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevtemplate <typename Generator1, typename Generator2, typename Generator3,
13613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator4, typename Generator5, typename Generator6,
13623d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator7, typename Generator8, typename Generator9,
13633d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    typename Generator10>
13643d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosevinternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13653d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13663d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    Generator10> Combine(
13673d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    const Generator1& g1, const Generator2& g2, const Generator3& g3,
13683d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator4& g4, const Generator5& g5, const Generator6& g6,
13693d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator7& g7, const Generator8& g8, const Generator9& g9,
13703d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        const Generator10& g10) {
13713d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
13723d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
13733d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      Generator10>(
13743d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
13753d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}
1376ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan# endif  // GTEST_HAS_COMBINE
13773d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13783d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
13793d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1380ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan# define TEST_P(test_case_name, test_name) \
13813d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
13823d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      : public test_case_name { \
13833d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev   public: \
13843d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
13853d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    virtual void TestBody(); \
13863d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev   private: \
13873d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    static int AddToRegistry() { \
13883d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
13893d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev          GetTestCasePatternHolder<test_case_name>(\
13904f8dc917ebce062f75defee3d4890bbcd07e277bkosak              #test_case_name, \
13914f8dc917ebce062f75defee3d4890bbcd07e277bkosak              ::testing::internal::CodeLocation(\
13924f8dc917ebce062f75defee3d4890bbcd07e277bkosak                  __FILE__, __LINE__))->AddTestPattern(\
13934f8dc917ebce062f75defee3d4890bbcd07e277bkosak                      #test_case_name, \
13944f8dc917ebce062f75defee3d4890bbcd07e277bkosak                      #test_name, \
13954f8dc917ebce062f75defee3d4890bbcd07e277bkosak                      new ::testing::internal::TestMetaFactory< \
13964f8dc917ebce062f75defee3d4890bbcd07e277bkosak                          GTEST_TEST_CLASS_NAME_(\
13974f8dc917ebce062f75defee3d4890bbcd07e277bkosak                              test_case_name, test_name)>()); \
13983d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      return 0; \
13993d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    } \
1400683886c5676dca2e8198bbf5f735f79387d10fc6kosak    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
14013d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
14023d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
14033d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  }; \
14043d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  int GTEST_TEST_CLASS_NAME_(test_case_name, \
14053d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev                             test_name)::gtest_registering_dummy_ = \
14063d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
14073d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
14083d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
1409794ef030ebad671b699abdfd8e0474f93045be91kosak// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user
1410794ef030ebad671b699abdfd8e0474f93045be91kosak// to specify a function or functor that generates custom test name suffixes
1411794ef030ebad671b699abdfd8e0474f93045be91kosak// based on the test parameters. The function should accept one argument of
1412794ef030ebad671b699abdfd8e0474f93045be91kosak// type testing::TestParamInfo<class ParamType>, and return std::string.
1413794ef030ebad671b699abdfd8e0474f93045be91kosak//
1414794ef030ebad671b699abdfd8e0474f93045be91kosak// testing::PrintToStringParamName is a builtin test suffix generator that
1415794ef030ebad671b699abdfd8e0474f93045be91kosak// returns the value of testing::PrintToString(GetParam()). It does not work
1416794ef030ebad671b699abdfd8e0474f93045be91kosak// for std::string or C strings.
1417794ef030ebad671b699abdfd8e0474f93045be91kosak//
1418794ef030ebad671b699abdfd8e0474f93045be91kosak// Note: test names must be non-empty, unique, and may only contain ASCII
1419794ef030ebad671b699abdfd8e0474f93045be91kosak// alphanumeric characters or underscore.
1420794ef030ebad671b699abdfd8e0474f93045be91kosak
1421794ef030ebad671b699abdfd8e0474f93045be91kosak# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \
14223d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
14233d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
1424794ef030ebad671b699abdfd8e0474f93045be91kosak  ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \
1425794ef030ebad671b699abdfd8e0474f93045be91kosak      const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \
1426794ef030ebad671b699abdfd8e0474f93045be91kosak    return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \
1427794ef030ebad671b699abdfd8e0474f93045be91kosak        (__VA_ARGS__)(info); \
1428794ef030ebad671b699abdfd8e0474f93045be91kosak  } \
1429d5ac8cd9ebdb63f7790d2e6c9a7e2aeeed3c2690kosak  int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \
14303d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
14313d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev          GetTestCasePatternHolder<test_case_name>(\
14324f8dc917ebce062f75defee3d4890bbcd07e277bkosak              #test_case_name, \
14334f8dc917ebce062f75defee3d4890bbcd07e277bkosak              ::testing::internal::CodeLocation(\
14344f8dc917ebce062f75defee3d4890bbcd07e277bkosak                  __FILE__, __LINE__))->AddTestCaseInstantiation(\
14354f8dc917ebce062f75defee3d4890bbcd07e277bkosak                      #prefix, \
14364f8dc917ebce062f75defee3d4890bbcd07e277bkosak                      &gtest_##prefix##test_case_name##_EvalGenerator_, \
1437794ef030ebad671b699abdfd8e0474f93045be91kosak                      &gtest_##prefix##test_case_name##_EvalGenerateName_, \
14384f8dc917ebce062f75defee3d4890bbcd07e277bkosak                      __FILE__, __LINE__)
14393d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
14403d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev}  // namespace testing
14413d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
14423d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev#endif  // GTEST_HAS_PARAM_TEST
14433d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev
14443d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
1445