1// This file was GENERATED by command: 2// pump.py gtest-param-test.h.pump 3// DO NOT EDIT BY HAND!!! 4 5// Copyright 2008, Google Inc. 6// All rights reserved. 7// 8// Redistribution and use in source and binary forms, with or without 9// modification, are permitted provided that the following conditions are 10// met: 11// 12// * Redistributions of source code must retain the above copyright 13// notice, this list of conditions and the following disclaimer. 14// * Redistributions in binary form must reproduce the above 15// copyright notice, this list of conditions and the following disclaimer 16// in the documentation and/or other materials provided with the 17// distribution. 18// * Neither the name of Google Inc. nor the names of its 19// contributors may be used to endorse or promote products derived from 20// this software without specific prior written permission. 21// 22// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33// 34// Authors: vladl@google.com (Vlad Losev) 35// 36// Macros and functions for implementing parameterized tests 37// in Google C++ Testing Framework (Google Test) 38// 39// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! 40// 41#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ 42#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ 43 44 45// Value-parameterized tests allow you to test your code with different 46// parameters without writing multiple copies of the same test. 47// 48// Here is how you use value-parameterized tests: 49 50#if 0 51 52// To write value-parameterized tests, first you should define a fixture 53// class. It is usually derived from testing::TestWithParam<T> (see below for 54// another inheritance scheme that's sometimes useful in more complicated 55// class hierarchies), where the type of your parameter values. 56// TestWithParam<T> is itself derived from testing::Test. T can be any 57// copyable type. If it's a raw pointer, you are responsible for managing the 58// lifespan of the pointed values. 59 60class FooTest : public ::testing::TestWithParam<const char*> { 61 // You can implement all the usual class fixture members here. 62}; 63 64// Then, use the TEST_P macro to define as many parameterized tests 65// for this fixture as you want. The _P suffix is for "parameterized" 66// or "pattern", whichever you prefer to think. 67 68TEST_P(FooTest, DoesBlah) { 69 // Inside a test, access the test parameter with the GetParam() method 70 // of the TestWithParam<T> class: 71 EXPECT_TRUE(foo.Blah(GetParam())); 72 ... 73} 74 75TEST_P(FooTest, HasBlahBlah) { 76 ... 77} 78 79// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test 80// case with any set of parameters you want. Google Test defines a number 81// of functions for generating test parameters. They return what we call 82// (surprise!) parameter generators. Here is a summary of them, which 83// are all in the testing namespace: 84// 85// 86// Range(begin, end [, step]) - Yields values {begin, begin+step, 87// begin+step+step, ...}. The values do not 88// include end. step defaults to 1. 89// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. 90// ValuesIn(container) - Yields values from a C-style array, an STL 91// ValuesIn(begin,end) container, or an iterator range [begin, end). 92// Bool() - Yields sequence {false, true}. 93// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product 94// for the math savvy) of the values generated 95// by the N generators. 96// 97// For more details, see comments at the definitions of these functions below 98// in this file. 99// 100// The following statement will instantiate tests from the FooTest test case 101// each with parameter values "meeny", "miny", and "moe". 102 103INSTANTIATE_TEST_CASE_P(InstantiationName, 104 FooTest, 105 Values("meeny", "miny", "moe")); 106 107// To distinguish different instances of the pattern, (yes, you 108// can instantiate it more then once) the first argument to the 109// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the 110// actual test case name. Remember to pick unique prefixes for different 111// instantiations. The tests from the instantiation above will have 112// these names: 113// 114// * InstantiationName/FooTest.DoesBlah/0 for "meeny" 115// * InstantiationName/FooTest.DoesBlah/1 for "miny" 116// * InstantiationName/FooTest.DoesBlah/2 for "moe" 117// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" 118// * InstantiationName/FooTest.HasBlahBlah/1 for "miny" 119// * InstantiationName/FooTest.HasBlahBlah/2 for "moe" 120// 121// You can use these names in --gtest_filter. 122// 123// This statement will instantiate all tests from FooTest again, each 124// with parameter values "cat" and "dog": 125 126const char* pets[] = {"cat", "dog"}; 127INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); 128 129// The tests from the instantiation above will have these names: 130// 131// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" 132// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" 133// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" 134// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" 135// 136// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests 137// in the given test case, whether their definitions come before or 138// AFTER the INSTANTIATE_TEST_CASE_P statement. 139// 140// Please also note that generator expressions (including parameters to the 141// generators) are evaluated in InitGoogleTest(), after main() has started. 142// This allows the user on one hand, to adjust generator parameters in order 143// to dynamically determine a set of tests to run and on the other hand, 144// give the user a chance to inspect the generated tests with Google Test 145// reflection API before RUN_ALL_TESTS() is executed. 146// 147// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc 148// for more examples. 149// 150// In the future, we plan to publish the API for defining new parameter 151// generators. But for now this interface remains part of the internal 152// implementation and is subject to change. 153// 154// 155// A parameterized test fixture must be derived from testing::Test and from 156// testing::WithParamInterface<T>, where T is the type of the parameter 157// values. Inheriting from TestWithParam<T> satisfies that requirement because 158// TestWithParam<T> inherits from both Test and WithParamInterface. In more 159// complicated hierarchies, however, it is occasionally useful to inherit 160// separately from Test and WithParamInterface. For example: 161 162class BaseTest : public ::testing::Test { 163 // You can inherit all the usual members for a non-parameterized test 164 // fixture here. 165}; 166 167class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> { 168 // The usual test fixture members go here too. 169}; 170 171TEST_F(BaseTest, HasFoo) { 172 // This is an ordinary non-parameterized test. 173} 174 175TEST_P(DerivedTest, DoesBlah) { 176 // GetParam works just the same here as if you inherit from TestWithParam. 177 EXPECT_TRUE(foo.Blah(GetParam())); 178} 179 180#endif // 0 181 182#include "gtest/internal/gtest-port.h" 183 184#if !GTEST_OS_SYMBIAN 185# include <utility> 186#endif 187 188// scripts/fuse_gtest.py depends on gtest's own header being #included 189// *unconditionally*. Therefore these #includes cannot be moved 190// inside #if GTEST_HAS_PARAM_TEST. 191#include "gtest/internal/gtest-internal.h" 192#include "gtest/internal/gtest-param-util.h" 193 194#if GTEST_HAS_PARAM_TEST 195 196namespace testing { 197 198// Functions producing parameter generators. 199// 200// Google Test uses these generators to produce parameters for value- 201// parameterized tests. When a parameterized test case is instantiated 202// with a particular generator, Google Test creates and runs tests 203// for each element in the sequence produced by the generator. 204// 205// In the following sample, tests from test case FooTest are instantiated 206// each three times with parameter values 3, 5, and 8: 207// 208// class FooTest : public TestWithParam<int> { ... }; 209// 210// TEST_P(FooTest, TestThis) { 211// } 212// TEST_P(FooTest, TestThat) { 213// } 214// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); 215// 216 217// Range() returns generators providing sequences of values in a range. 218// 219// Synopsis: 220// Range(start, end) 221// - returns a generator producing a sequence of values {start, start+1, 222// start+2, ..., }. 223// Range(start, end, step) 224// - returns a generator producing a sequence of values {start, start+step, 225// start+step+step, ..., }. 226// Notes: 227// * The generated sequences never include end. For example, Range(1, 5) 228// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) 229// returns a generator producing {1, 3, 5, 7}. 230// * start and end must have the same type. That type may be any integral or 231// floating-point type or a user defined type satisfying these conditions: 232// * It must be assignable (have operator=() defined). 233// * It must have operator+() (operator+(int-compatible type) for 234// two-operand version). 235// * It must have operator<() defined. 236// Elements in the resulting sequences will also have that type. 237// * Condition start < end must be satisfied in order for resulting sequences 238// to contain any elements. 239// 240template <typename T, typename IncrementT> 241internal::ParamGenerator<T> Range(T start, T end, IncrementT step) { 242 return internal::ParamGenerator<T>( 243 new internal::RangeGenerator<T, IncrementT>(start, end, step)); 244} 245 246template <typename T> 247internal::ParamGenerator<T> Range(T start, T end) { 248 return Range(start, end, 1); 249} 250 251// ValuesIn() function allows generation of tests with parameters coming from 252// a container. 253// 254// Synopsis: 255// ValuesIn(const T (&array)[N]) 256// - returns a generator producing sequences with elements from 257// a C-style array. 258// ValuesIn(const Container& container) 259// - returns a generator producing sequences with elements from 260// an STL-style container. 261// ValuesIn(Iterator begin, Iterator end) 262// - returns a generator producing sequences with elements from 263// a range [begin, end) defined by a pair of STL-style iterators. These 264// iterators can also be plain C pointers. 265// 266// Please note that ValuesIn copies the values from the containers 267// passed in and keeps them to generate tests in RUN_ALL_TESTS(). 268// 269// Examples: 270// 271// This instantiates tests from test case StringTest 272// each with C-string values of "foo", "bar", and "baz": 273// 274// const char* strings[] = {"foo", "bar", "baz"}; 275// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); 276// 277// This instantiates tests from test case StlStringTest 278// each with STL strings with values "a" and "b": 279// 280// ::std::vector< ::std::string> GetParameterStrings() { 281// ::std::vector< ::std::string> v; 282// v.push_back("a"); 283// v.push_back("b"); 284// return v; 285// } 286// 287// INSTANTIATE_TEST_CASE_P(CharSequence, 288// StlStringTest, 289// ValuesIn(GetParameterStrings())); 290// 291// 292// This will also instantiate tests from CharTest 293// each with parameter values 'a' and 'b': 294// 295// ::std::list<char> GetParameterChars() { 296// ::std::list<char> list; 297// list.push_back('a'); 298// list.push_back('b'); 299// return list; 300// } 301// ::std::list<char> l = GetParameterChars(); 302// INSTANTIATE_TEST_CASE_P(CharSequence2, 303// CharTest, 304// ValuesIn(l.begin(), l.end())); 305// 306template <typename ForwardIterator> 307internal::ParamGenerator< 308 typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> 309ValuesIn(ForwardIterator begin, ForwardIterator end) { 310 typedef typename ::testing::internal::IteratorTraits<ForwardIterator> 311 ::value_type ParamType; 312 return internal::ParamGenerator<ParamType>( 313 new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end)); 314} 315 316template <typename T, size_t N> 317internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) { 318 return ValuesIn(array, array + N); 319} 320 321template <class Container> 322internal::ParamGenerator<typename Container::value_type> ValuesIn( 323 const Container& container) { 324 return ValuesIn(container.begin(), container.end()); 325} 326 327} // namespace testing 328#include <gtest/internal/gtest-param-util-generated.h> // Must be included after ValuesIn and friends are defined 329namespace testing { // And back in... 330 331// Values() allows generating tests from explicitly specified list of 332// parameters. 333// 334// Synopsis: 335// Values(T v1, T v2, ..., T vN) 336// - returns a generator producing sequences with elements v1, v2, ..., vN. 337// 338// For example, this instantiates tests from test case BarTest each 339// with values "one", "two", and "three": 340// 341// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); 342// 343// This instantiates tests from test case BazTest each with values 1, 2, 3.5. 344// The exact type of values will depend on the type of parameter in BazTest. 345// 346// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); 347// 348// Currently, Values() supports from 1 to 50 parameters. 349// 350template <typename T1> 351internal::ValueArray1<T1> Values(T1 v1) { 352 return internal::ValueArray1<T1>(v1); 353} 354 355template <typename T1, typename T2> 356internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) { 357 return internal::ValueArray2<T1, T2>(v1, v2); 358} 359 360template <typename T1, typename T2, typename T3> 361internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) { 362 return internal::ValueArray3<T1, T2, T3>(v1, v2, v3); 363} 364 365template <typename T1, typename T2, typename T3, typename T4> 366internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) { 367 return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4); 368} 369 370template <typename T1, typename T2, typename T3, typename T4, typename T5> 371internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4, 372 T5 v5) { 373 return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5); 374} 375 376template <typename T1, typename T2, typename T3, typename T4, typename T5, 377 typename T6> 378internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3, 379 T4 v4, T5 v5, T6 v6) { 380 return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6); 381} 382 383template <typename T1, typename T2, typename T3, typename T4, typename T5, 384 typename T6, typename T7> 385internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3, 386 T4 v4, T5 v5, T6 v6, T7 v7) { 387 return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5, 388 v6, v7); 389} 390 391template <typename T1, typename T2, typename T3, typename T4, typename T5, 392 typename T6, typename T7, typename T8> 393internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2, 394 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) { 395 return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4, 396 v5, v6, v7, v8); 397} 398 399template <typename T1, typename T2, typename T3, typename T4, typename T5, 400 typename T6, typename T7, typename T8, typename T9> 401internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2, 402 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) { 403 return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3, 404 v4, v5, v6, v7, v8, v9); 405} 406 407template <typename T1, typename T2, typename T3, typename T4, typename T5, 408 typename T6, typename T7, typename T8, typename T9, typename T10> 409internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1, 410 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) { 411 return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1, 412 v2, v3, v4, v5, v6, v7, v8, v9, v10); 413} 414 415template <typename T1, typename T2, typename T3, typename T4, typename T5, 416 typename T6, typename T7, typename T8, typename T9, typename T10, 417 typename T11> 418internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, 419 T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 420 T10 v10, T11 v11) { 421 return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, 422 T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); 423} 424 425template <typename T1, typename T2, typename T3, typename T4, typename T5, 426 typename T6, typename T7, typename T8, typename T9, typename T10, 427 typename T11, typename T12> 428internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 429 T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 430 T10 v10, T11 v11, T12 v12) { 431 return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 432 T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); 433} 434 435template <typename T1, typename T2, typename T3, typename T4, typename T5, 436 typename T6, typename T7, typename T8, typename T9, typename T10, 437 typename T11, typename T12, typename T13> 438internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, 439 T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 440 T10 v10, T11 v11, T12 v12, T13 v13) { 441 return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 442 T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13); 443} 444 445template <typename T1, typename T2, typename T3, typename T4, typename T5, 446 typename T6, typename T7, typename T8, typename T9, typename T10, 447 typename T11, typename T12, typename T13, typename T14> 448internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 449 T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 450 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) { 451 return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 452 T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, 453 v14); 454} 455 456template <typename T1, typename T2, typename T3, typename T4, typename T5, 457 typename T6, typename T7, typename T8, typename T9, typename T10, 458 typename T11, typename T12, typename T13, typename T14, typename T15> 459internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 460 T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, 461 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) { 462 return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 463 T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, 464 v13, v14, v15); 465} 466 467template <typename T1, typename T2, typename T3, typename T4, typename T5, 468 typename T6, typename T7, typename T8, typename T9, typename T10, 469 typename T11, typename T12, typename T13, typename T14, typename T15, 470 typename T16> 471internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 472 T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 473 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 474 T16 v16) { 475 return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 476 T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, 477 v12, v13, v14, v15, v16); 478} 479 480template <typename T1, typename T2, typename T3, typename T4, typename T5, 481 typename T6, typename T7, typename T8, typename T9, typename T10, 482 typename T11, typename T12, typename T13, typename T14, typename T15, 483 typename T16, typename T17> 484internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 485 T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 486 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 487 T16 v16, T17 v17) { 488 return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 489 T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, 490 v11, v12, v13, v14, v15, v16, v17); 491} 492 493template <typename T1, typename T2, typename T3, typename T4, typename T5, 494 typename T6, typename T7, typename T8, typename T9, typename T10, 495 typename T11, typename T12, typename T13, typename T14, typename T15, 496 typename T16, typename T17, typename T18> 497internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 498 T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, 499 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 500 T16 v16, T17 v17, T18 v18) { 501 return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 502 T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9, 503 v10, v11, v12, v13, v14, v15, v16, v17, v18); 504} 505 506template <typename T1, typename T2, typename T3, typename T4, typename T5, 507 typename T6, typename T7, typename T8, typename T9, typename T10, 508 typename T11, typename T12, typename T13, typename T14, typename T15, 509 typename T16, typename T17, typename T18, typename T19> 510internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 511 T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, 512 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, 513 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) { 514 return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 515 T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8, 516 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19); 517} 518 519template <typename T1, typename T2, typename T3, typename T4, typename T5, 520 typename T6, typename T7, typename T8, typename T9, typename T10, 521 typename T11, typename T12, typename T13, typename T14, typename T15, 522 typename T16, typename T17, typename T18, typename T19, typename T20> 523internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 524 T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4, 525 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, 526 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) { 527 return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 528 T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7, 529 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); 530} 531 532template <typename T1, typename T2, typename T3, typename T4, typename T5, 533 typename T6, typename T7, typename T8, typename T9, typename T10, 534 typename T11, typename T12, typename T13, typename T14, typename T15, 535 typename T16, typename T17, typename T18, typename T19, typename T20, 536 typename T21> 537internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 538 T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4, 539 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, 540 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) { 541 return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 542 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6, 543 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21); 544} 545 546template <typename T1, typename T2, typename T3, typename T4, typename T5, 547 typename T6, typename T7, typename T8, typename T9, typename T10, 548 typename T11, typename T12, typename T13, typename T14, typename T15, 549 typename T16, typename T17, typename T18, typename T19, typename T20, 550 typename T21, typename T22> 551internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 552 T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3, 553 T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, 554 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, 555 T21 v21, T22 v22) { 556 return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 557 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4, 558 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, 559 v20, v21, v22); 560} 561 562template <typename T1, typename T2, typename T3, typename T4, typename T5, 563 typename T6, typename T7, typename T8, typename T9, typename T10, 564 typename T11, typename T12, typename T13, typename T14, typename T15, 565 typename T16, typename T17, typename T18, typename T19, typename T20, 566 typename T21, typename T22, typename T23> 567internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 568 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2, 569 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, 570 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, 571 T21 v21, T22 v22, T23 v23) { 572 return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 573 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3, 574 v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, 575 v20, v21, v22, v23); 576} 577 578template <typename T1, typename T2, typename T3, typename T4, typename T5, 579 typename T6, typename T7, typename T8, typename T9, typename T10, 580 typename T11, typename T12, typename T13, typename T14, typename T15, 581 typename T16, typename T17, typename T18, typename T19, typename T20, 582 typename T21, typename T22, typename T23, typename T24> 583internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 584 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2, 585 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, 586 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, 587 T21 v21, T22 v22, T23 v23, T24 v24) { 588 return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 589 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2, 590 v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, 591 v19, v20, v21, v22, v23, v24); 592} 593 594template <typename T1, typename T2, typename T3, typename T4, typename T5, 595 typename T6, typename T7, typename T8, typename T9, typename T10, 596 typename T11, typename T12, typename T13, typename T14, typename T15, 597 typename T16, typename T17, typename T18, typename T19, typename T20, 598 typename T21, typename T22, typename T23, typename T24, typename T25> 599internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 600 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1, 601 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, 602 T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, 603 T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) { 604 return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 605 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1, 606 v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, 607 v18, v19, v20, v21, v22, v23, v24, v25); 608} 609 610template <typename T1, typename T2, typename T3, typename T4, typename T5, 611 typename T6, typename T7, typename T8, typename T9, typename T10, 612 typename T11, typename T12, typename T13, typename T14, typename T15, 613 typename T16, typename T17, typename T18, typename T19, typename T20, 614 typename T21, typename T22, typename T23, typename T24, typename T25, 615 typename T26> 616internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 617 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 618 T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 619 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 620 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 621 T26 v26) { 622 return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 623 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 624 T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, 625 v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26); 626} 627 628template <typename T1, typename T2, typename T3, typename T4, typename T5, 629 typename T6, typename T7, typename T8, typename T9, typename T10, 630 typename T11, typename T12, typename T13, typename T14, typename T15, 631 typename T16, typename T17, typename T18, typename T19, typename T20, 632 typename T21, typename T22, typename T23, typename T24, typename T25, 633 typename T26, typename T27> 634internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 635 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, 636 T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 637 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 638 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 639 T26 v26, T27 v27) { 640 return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 641 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 642 T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, 643 v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); 644} 645 646template <typename T1, typename T2, typename T3, typename T4, typename T5, 647 typename T6, typename T7, typename T8, typename T9, typename T10, 648 typename T11, typename T12, typename T13, typename T14, typename T15, 649 typename T16, typename T17, typename T18, typename T19, typename T20, 650 typename T21, typename T22, typename T23, typename T24, typename T25, 651 typename T26, typename T27, typename T28> 652internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 653 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, 654 T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 655 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 656 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 657 T26 v26, T27 v27, T28 v28) { 658 return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 659 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 660 T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, 661 v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, 662 v28); 663} 664 665template <typename T1, typename T2, typename T3, typename T4, typename T5, 666 typename T6, typename T7, typename T8, typename T9, typename T10, 667 typename T11, typename T12, typename T13, typename T14, typename T15, 668 typename T16, typename T17, typename T18, typename T19, typename T20, 669 typename T21, typename T22, typename T23, typename T24, typename T25, 670 typename T26, typename T27, typename T28, typename T29> 671internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 672 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 673 T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 674 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 675 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 676 T26 v26, T27 v27, T28 v28, T29 v29) { 677 return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 678 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 679 T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, 680 v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, 681 v27, v28, v29); 682} 683 684template <typename T1, typename T2, typename T3, typename T4, typename T5, 685 typename T6, typename T7, typename T8, typename T9, typename T10, 686 typename T11, typename T12, typename T13, typename T14, typename T15, 687 typename T16, typename T17, typename T18, typename T19, typename T20, 688 typename T21, typename T22, typename T23, typename T24, typename T25, 689 typename T26, typename T27, typename T28, typename T29, typename T30> 690internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 691 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 692 T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, 693 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, 694 T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, 695 T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) { 696 return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 697 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 698 T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, 699 v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, 700 v26, v27, v28, v29, v30); 701} 702 703template <typename T1, typename T2, typename T3, typename T4, typename T5, 704 typename T6, typename T7, typename T8, typename T9, typename T10, 705 typename T11, typename T12, typename T13, typename T14, typename T15, 706 typename T16, typename T17, typename T18, typename T19, typename T20, 707 typename T21, typename T22, typename T23, typename T24, typename T25, 708 typename T26, typename T27, typename T28, typename T29, typename T30, 709 typename T31> 710internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 711 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 712 T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 713 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 714 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, 715 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) { 716 return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 717 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 718 T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, 719 v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, 720 v25, v26, v27, v28, v29, v30, v31); 721} 722 723template <typename T1, typename T2, typename T3, typename T4, typename T5, 724 typename T6, typename T7, typename T8, typename T9, typename T10, 725 typename T11, typename T12, typename T13, typename T14, typename T15, 726 typename T16, typename T17, typename T18, typename T19, typename T20, 727 typename T21, typename T22, typename T23, typename T24, typename T25, 728 typename T26, typename T27, typename T28, typename T29, typename T30, 729 typename T31, typename T32> 730internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 731 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 732 T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 733 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 734 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, 735 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, 736 T32 v32) { 737 return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 738 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 739 T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9, 740 v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, 741 v24, v25, v26, v27, v28, v29, v30, v31, v32); 742} 743 744template <typename T1, typename T2, typename T3, typename T4, typename T5, 745 typename T6, typename T7, typename T8, typename T9, typename T10, 746 typename T11, typename T12, typename T13, typename T14, typename T15, 747 typename T16, typename T17, typename T18, typename T19, typename T20, 748 typename T21, typename T22, typename T23, typename T24, typename T25, 749 typename T26, typename T27, typename T28, typename T29, typename T30, 750 typename T31, typename T32, typename T33> 751internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 752 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 753 T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, 754 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 755 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, 756 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, 757 T32 v32, T33 v33) { 758 return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 759 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 760 T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8, 761 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, 762 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33); 763} 764 765template <typename T1, typename T2, typename T3, typename T4, typename T5, 766 typename T6, typename T7, typename T8, typename T9, typename T10, 767 typename T11, typename T12, typename T13, typename T14, typename T15, 768 typename T16, typename T17, typename T18, typename T19, typename T20, 769 typename T21, typename T22, typename T23, typename T24, typename T25, 770 typename T26, typename T27, typename T28, typename T29, typename T30, 771 typename T31, typename T32, typename T33, typename T34> 772internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 773 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 774 T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, 775 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, 776 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, 777 T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, 778 T31 v31, T32 v32, T33 v33, T34 v34) { 779 return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 780 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 781 T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7, 782 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, 783 v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34); 784} 785 786template <typename T1, typename T2, typename T3, typename T4, typename T5, 787 typename T6, typename T7, typename T8, typename T9, typename T10, 788 typename T11, typename T12, typename T13, typename T14, typename T15, 789 typename T16, typename T17, typename T18, typename T19, typename T20, 790 typename T21, typename T22, typename T23, typename T24, typename T25, 791 typename T26, typename T27, typename T28, typename T29, typename T30, 792 typename T31, typename T32, typename T33, typename T34, typename T35> 793internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 794 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 795 T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4, 796 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, 797 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, 798 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, 799 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) { 800 return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 801 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 802 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6, 803 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, 804 v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35); 805} 806 807template <typename T1, typename T2, typename T3, typename T4, typename T5, 808 typename T6, typename T7, typename T8, typename T9, typename T10, 809 typename T11, typename T12, typename T13, typename T14, typename T15, 810 typename T16, typename T17, typename T18, typename T19, typename T20, 811 typename T21, typename T22, typename T23, typename T24, typename T25, 812 typename T26, typename T27, typename T28, typename T29, typename T30, 813 typename T31, typename T32, typename T33, typename T34, typename T35, 814 typename T36> 815internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 816 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 817 T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4, 818 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, 819 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, 820 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, 821 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) { 822 return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 823 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 824 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4, 825 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, 826 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, 827 v34, v35, v36); 828} 829 830template <typename T1, typename T2, typename T3, typename T4, typename T5, 831 typename T6, typename T7, typename T8, typename T9, typename T10, 832 typename T11, typename T12, typename T13, typename T14, typename T15, 833 typename T16, typename T17, typename T18, typename T19, typename T20, 834 typename T21, typename T22, typename T23, typename T24, typename T25, 835 typename T26, typename T27, typename T28, typename T29, typename T30, 836 typename T31, typename T32, typename T33, typename T34, typename T35, 837 typename T36, typename T37> 838internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 839 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 840 T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3, 841 T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, 842 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, 843 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, 844 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, 845 T37 v37) { 846 return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 847 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 848 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3, 849 v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, 850 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, 851 v34, v35, v36, v37); 852} 853 854template <typename T1, typename T2, typename T3, typename T4, typename T5, 855 typename T6, typename T7, typename T8, typename T9, typename T10, 856 typename T11, typename T12, typename T13, typename T14, typename T15, 857 typename T16, typename T17, typename T18, typename T19, typename T20, 858 typename T21, typename T22, typename T23, typename T24, typename T25, 859 typename T26, typename T27, typename T28, typename T29, typename T30, 860 typename T31, typename T32, typename T33, typename T34, typename T35, 861 typename T36, typename T37, typename T38> 862internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 863 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 864 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2, 865 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, 866 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, 867 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, 868 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, 869 T37 v37, T38 v38) { 870 return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 871 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 872 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2, 873 v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, 874 v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, 875 v33, v34, v35, v36, v37, v38); 876} 877 878template <typename T1, typename T2, typename T3, typename T4, typename T5, 879 typename T6, typename T7, typename T8, typename T9, typename T10, 880 typename T11, typename T12, typename T13, typename T14, typename T15, 881 typename T16, typename T17, typename T18, typename T19, typename T20, 882 typename T21, typename T22, typename T23, typename T24, typename T25, 883 typename T26, typename T27, typename T28, typename T29, typename T30, 884 typename T31, typename T32, typename T33, typename T34, typename T35, 885 typename T36, typename T37, typename T38, typename T39> 886internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 887 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 888 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2, 889 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, 890 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, 891 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, 892 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, 893 T37 v37, T38 v38, T39 v39) { 894 return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 895 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 896 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1, 897 v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, 898 v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, 899 v32, v33, v34, v35, v36, v37, v38, v39); 900} 901 902template <typename T1, typename T2, typename T3, typename T4, typename T5, 903 typename T6, typename T7, typename T8, typename T9, typename T10, 904 typename T11, typename T12, typename T13, typename T14, typename T15, 905 typename T16, typename T17, typename T18, typename T19, typename T20, 906 typename T21, typename T22, typename T23, typename T24, typename T25, 907 typename T26, typename T27, typename T28, typename T29, typename T30, 908 typename T31, typename T32, typename T33, typename T34, typename T35, 909 typename T36, typename T37, typename T38, typename T39, typename T40> 910internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 911 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 912 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1, 913 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, 914 T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, 915 T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, 916 T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, 917 T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) { 918 return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 919 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 920 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 921 T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, 922 v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, 923 v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40); 924} 925 926template <typename T1, typename T2, typename T3, typename T4, typename T5, 927 typename T6, typename T7, typename T8, typename T9, typename T10, 928 typename T11, typename T12, typename T13, typename T14, typename T15, 929 typename T16, typename T17, typename T18, typename T19, typename T20, 930 typename T21, typename T22, typename T23, typename T24, typename T25, 931 typename T26, typename T27, typename T28, typename T29, typename T30, 932 typename T31, typename T32, typename T33, typename T34, typename T35, 933 typename T36, typename T37, typename T38, typename T39, typename T40, 934 typename T41> 935internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 936 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 937 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, 938 T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 939 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 940 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 941 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 942 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) { 943 return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 944 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 945 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 946 T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, 947 v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, 948 v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41); 949} 950 951template <typename T1, typename T2, typename T3, typename T4, typename T5, 952 typename T6, typename T7, typename T8, typename T9, typename T10, 953 typename T11, typename T12, typename T13, typename T14, typename T15, 954 typename T16, typename T17, typename T18, typename T19, typename T20, 955 typename T21, typename T22, typename T23, typename T24, typename T25, 956 typename T26, typename T27, typename T28, typename T29, typename T30, 957 typename T31, typename T32, typename T33, typename T34, typename T35, 958 typename T36, typename T37, typename T38, typename T39, typename T40, 959 typename T41, typename T42> 960internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 961 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 962 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, 963 T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 964 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 965 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 966 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 967 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 968 T42 v42) { 969 return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 970 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 971 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 972 T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, 973 v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, 974 v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, 975 v42); 976} 977 978template <typename T1, typename T2, typename T3, typename T4, typename T5, 979 typename T6, typename T7, typename T8, typename T9, typename T10, 980 typename T11, typename T12, typename T13, typename T14, typename T15, 981 typename T16, typename T17, typename T18, typename T19, typename T20, 982 typename T21, typename T22, typename T23, typename T24, typename T25, 983 typename T26, typename T27, typename T28, typename T29, typename T30, 984 typename T31, typename T32, typename T33, typename T34, typename T35, 985 typename T36, typename T37, typename T38, typename T39, typename T40, 986 typename T41, typename T42, typename T43> 987internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 988 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 989 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, 990 T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 991 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 992 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 993 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 994 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 995 T42 v42, T43 v43) { 996 return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 997 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 998 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 999 T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, 1000 v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, 1001 v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, 1002 v41, v42, v43); 1003} 1004 1005template <typename T1, typename T2, typename T3, typename T4, typename T5, 1006 typename T6, typename T7, typename T8, typename T9, typename T10, 1007 typename T11, typename T12, typename T13, typename T14, typename T15, 1008 typename T16, typename T17, typename T18, typename T19, typename T20, 1009 typename T21, typename T22, typename T23, typename T24, typename T25, 1010 typename T26, typename T27, typename T28, typename T29, typename T30, 1011 typename T31, typename T32, typename T33, typename T34, typename T35, 1012 typename T36, typename T37, typename T38, typename T39, typename T40, 1013 typename T41, typename T42, typename T43, typename T44> 1014internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1015 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1016 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1017 T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1018 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1019 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1020 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1021 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 1022 T42 v42, T43 v43, T44 v44) { 1023 return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1024 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1025 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1026 T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, 1027 v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, 1028 v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, 1029 v40, v41, v42, v43, v44); 1030} 1031 1032template <typename T1, typename T2, typename T3, typename T4, typename T5, 1033 typename T6, typename T7, typename T8, typename T9, typename T10, 1034 typename T11, typename T12, typename T13, typename T14, typename T15, 1035 typename T16, typename T17, typename T18, typename T19, typename T20, 1036 typename T21, typename T22, typename T23, typename T24, typename T25, 1037 typename T26, typename T27, typename T28, typename T29, typename T30, 1038 typename T31, typename T32, typename T33, typename T34, typename T35, 1039 typename T36, typename T37, typename T38, typename T39, typename T40, 1040 typename T41, typename T42, typename T43, typename T44, typename T45> 1041internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1042 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1043 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1044 T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, 1045 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, 1046 T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, 1047 T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, 1048 T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, 1049 T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) { 1050 return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1051 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1052 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1053 T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, 1054 v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, 1055 v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, 1056 v39, v40, v41, v42, v43, v44, v45); 1057} 1058 1059template <typename T1, typename T2, typename T3, typename T4, typename T5, 1060 typename T6, typename T7, typename T8, typename T9, typename T10, 1061 typename T11, typename T12, typename T13, typename T14, typename T15, 1062 typename T16, typename T17, typename T18, typename T19, typename T20, 1063 typename T21, typename T22, typename T23, typename T24, typename T25, 1064 typename T26, typename T27, typename T28, typename T29, typename T30, 1065 typename T31, typename T32, typename T33, typename T34, typename T35, 1066 typename T36, typename T37, typename T38, typename T39, typename T40, 1067 typename T41, typename T42, typename T43, typename T44, typename T45, 1068 typename T46> 1069internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1070 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1071 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1072 T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 1073 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 1074 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, 1075 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, 1076 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, 1077 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) { 1078 return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1079 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1080 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1081 T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9, 1082 v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, 1083 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, 1084 v38, v39, v40, v41, v42, v43, v44, v45, v46); 1085} 1086 1087template <typename T1, typename T2, typename T3, typename T4, typename T5, 1088 typename T6, typename T7, typename T8, typename T9, typename T10, 1089 typename T11, typename T12, typename T13, typename T14, typename T15, 1090 typename T16, typename T17, typename T18, typename T19, typename T20, 1091 typename T21, typename T22, typename T23, typename T24, typename T25, 1092 typename T26, typename T27, typename T28, typename T29, typename T30, 1093 typename T31, typename T32, typename T33, typename T34, typename T35, 1094 typename T36, typename T37, typename T38, typename T39, typename T40, 1095 typename T41, typename T42, typename T43, typename T44, typename T45, 1096 typename T46, typename T47> 1097internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1098 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1099 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1100 T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 1101 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 1102 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, 1103 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, 1104 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, 1105 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) { 1106 return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1107 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1108 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1109 T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8, 1110 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, 1111 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, 1112 v38, v39, v40, v41, v42, v43, v44, v45, v46, v47); 1113} 1114 1115template <typename T1, typename T2, typename T3, typename T4, typename T5, 1116 typename T6, typename T7, typename T8, typename T9, typename T10, 1117 typename T11, typename T12, typename T13, typename T14, typename T15, 1118 typename T16, typename T17, typename T18, typename T19, typename T20, 1119 typename T21, typename T22, typename T23, typename T24, typename T25, 1120 typename T26, typename T27, typename T28, typename T29, typename T30, 1121 typename T31, typename T32, typename T33, typename T34, typename T35, 1122 typename T36, typename T37, typename T38, typename T39, typename T40, 1123 typename T41, typename T42, typename T43, typename T44, typename T45, 1124 typename T46, typename T47, typename T48> 1125internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1126 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1127 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1128 T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, 1129 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, 1130 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, 1131 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, 1132 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, 1133 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, 1134 T48 v48) { 1135 return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1136 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1137 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1138 T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7, 1139 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, 1140 v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, 1141 v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48); 1142} 1143 1144template <typename T1, typename T2, typename T3, typename T4, typename T5, 1145 typename T6, typename T7, typename T8, typename T9, typename T10, 1146 typename T11, typename T12, typename T13, typename T14, typename T15, 1147 typename T16, typename T17, typename T18, typename T19, typename T20, 1148 typename T21, typename T22, typename T23, typename T24, typename T25, 1149 typename T26, typename T27, typename T28, typename T29, typename T30, 1150 typename T31, typename T32, typename T33, typename T34, typename T35, 1151 typename T36, typename T37, typename T38, typename T39, typename T40, 1152 typename T41, typename T42, typename T43, typename T44, typename T45, 1153 typename T46, typename T47, typename T48, typename T49> 1154internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1155 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1156 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1157 T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, 1158 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, 1159 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, 1160 T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, 1161 T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, 1162 T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, 1163 T47 v47, T48 v48, T49 v49) { 1164 return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1165 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1166 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1167 T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6, 1168 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, 1169 v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, 1170 v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49); 1171} 1172 1173template <typename T1, typename T2, typename T3, typename T4, typename T5, 1174 typename T6, typename T7, typename T8, typename T9, typename T10, 1175 typename T11, typename T12, typename T13, typename T14, typename T15, 1176 typename T16, typename T17, typename T18, typename T19, typename T20, 1177 typename T21, typename T22, typename T23, typename T24, typename T25, 1178 typename T26, typename T27, typename T28, typename T29, typename T30, 1179 typename T31, typename T32, typename T33, typename T34, typename T35, 1180 typename T36, typename T37, typename T38, typename T39, typename T40, 1181 typename T41, typename T42, typename T43, typename T44, typename T45, 1182 typename T46, typename T47, typename T48, typename T49, typename T50> 1183internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, 1184 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, 1185 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, 1186 T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4, 1187 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, 1188 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, 1189 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, 1190 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, 1191 T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, 1192 T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) { 1193 return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, 1194 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, 1195 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, 1196 T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4, 1197 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, 1198 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, 1199 v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, 1200 v48, v49, v50); 1201} 1202 1203// Bool() allows generating tests with parameters in a set of (false, true). 1204// 1205// Synopsis: 1206// Bool() 1207// - returns a generator producing sequences with elements {false, true}. 1208// 1209// It is useful when testing code that depends on Boolean flags. Combinations 1210// of multiple flags can be tested when several Bool()'s are combined using 1211// Combine() function. 1212// 1213// In the following example all tests in the test case FlagDependentTest 1214// will be instantiated twice with parameters false and true. 1215// 1216// class FlagDependentTest : public testing::TestWithParam<bool> { 1217// virtual void SetUp() { 1218// external_flag = GetParam(); 1219// } 1220// } 1221// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); 1222// 1223inline internal::ParamGenerator<bool> Bool() { 1224 return Values(false, true); 1225} 1226 1227# if GTEST_HAS_COMBINE 1228// Combine() allows the user to combine two or more sequences to produce 1229// values of a Cartesian product of those sequences' elements. 1230// 1231// Synopsis: 1232// Combine(gen1, gen2, ..., genN) 1233// - returns a generator producing sequences with elements coming from 1234// the Cartesian product of elements from the sequences generated by 1235// gen1, gen2, ..., genN. The sequence elements will have a type of 1236// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types 1237// of elements from sequences produces by gen1, gen2, ..., genN. 1238// 1239// Combine can have up to 10 arguments. This number is currently limited 1240// by the maximum number of elements in the tuple implementation used by Google 1241// Test. 1242// 1243// Example: 1244// 1245// This will instantiate tests in test case AnimalTest each one with 1246// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), 1247// tuple("dog", BLACK), and tuple("dog", WHITE): 1248// 1249// enum Color { BLACK, GRAY, WHITE }; 1250// class AnimalTest 1251// : public testing::TestWithParam<tuple<const char*, Color> > {...}; 1252// 1253// TEST_P(AnimalTest, AnimalLooksNice) {...} 1254// 1255// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, 1256// Combine(Values("cat", "dog"), 1257// Values(BLACK, WHITE))); 1258// 1259// This will instantiate tests in FlagDependentTest with all variations of two 1260// Boolean flags: 1261// 1262// class FlagDependentTest 1263// : public testing::TestWithParam<tuple(bool, bool)> > { 1264// virtual void SetUp() { 1265// // Assigns external_flag_1 and external_flag_2 values from the tuple. 1266// tie(external_flag_1, external_flag_2) = GetParam(); 1267// } 1268// }; 1269// 1270// TEST_P(FlagDependentTest, TestFeature1) { 1271// // Test your code using external_flag_1 and external_flag_2 here. 1272// } 1273// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, 1274// Combine(Bool(), Bool())); 1275// 1276template <typename Generator1, typename Generator2> 1277internal::CartesianProductHolder2<Generator1, Generator2> Combine( 1278 const Generator1& g1, const Generator2& g2) { 1279 return internal::CartesianProductHolder2<Generator1, Generator2>( 1280 g1, g2); 1281} 1282 1283template <typename Generator1, typename Generator2, typename Generator3> 1284internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine( 1285 const Generator1& g1, const Generator2& g2, const Generator3& g3) { 1286 return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>( 1287 g1, g2, g3); 1288} 1289 1290template <typename Generator1, typename Generator2, typename Generator3, 1291 typename Generator4> 1292internal::CartesianProductHolder4<Generator1, Generator2, Generator3, 1293 Generator4> Combine( 1294 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1295 const Generator4& g4) { 1296 return internal::CartesianProductHolder4<Generator1, Generator2, Generator3, 1297 Generator4>( 1298 g1, g2, g3, g4); 1299} 1300 1301template <typename Generator1, typename Generator2, typename Generator3, 1302 typename Generator4, typename Generator5> 1303internal::CartesianProductHolder5<Generator1, Generator2, Generator3, 1304 Generator4, Generator5> Combine( 1305 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1306 const Generator4& g4, const Generator5& g5) { 1307 return internal::CartesianProductHolder5<Generator1, Generator2, Generator3, 1308 Generator4, Generator5>( 1309 g1, g2, g3, g4, g5); 1310} 1311 1312template <typename Generator1, typename Generator2, typename Generator3, 1313 typename Generator4, typename Generator5, typename Generator6> 1314internal::CartesianProductHolder6<Generator1, Generator2, Generator3, 1315 Generator4, Generator5, Generator6> Combine( 1316 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1317 const Generator4& g4, const Generator5& g5, const Generator6& g6) { 1318 return internal::CartesianProductHolder6<Generator1, Generator2, Generator3, 1319 Generator4, Generator5, Generator6>( 1320 g1, g2, g3, g4, g5, g6); 1321} 1322 1323template <typename Generator1, typename Generator2, typename Generator3, 1324 typename Generator4, typename Generator5, typename Generator6, 1325 typename Generator7> 1326internal::CartesianProductHolder7<Generator1, Generator2, Generator3, 1327 Generator4, Generator5, Generator6, Generator7> Combine( 1328 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1329 const Generator4& g4, const Generator5& g5, const Generator6& g6, 1330 const Generator7& g7) { 1331 return internal::CartesianProductHolder7<Generator1, Generator2, Generator3, 1332 Generator4, Generator5, Generator6, Generator7>( 1333 g1, g2, g3, g4, g5, g6, g7); 1334} 1335 1336template <typename Generator1, typename Generator2, typename Generator3, 1337 typename Generator4, typename Generator5, typename Generator6, 1338 typename Generator7, typename Generator8> 1339internal::CartesianProductHolder8<Generator1, Generator2, Generator3, 1340 Generator4, Generator5, Generator6, Generator7, Generator8> Combine( 1341 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1342 const Generator4& g4, const Generator5& g5, const Generator6& g6, 1343 const Generator7& g7, const Generator8& g8) { 1344 return internal::CartesianProductHolder8<Generator1, Generator2, Generator3, 1345 Generator4, Generator5, Generator6, Generator7, Generator8>( 1346 g1, g2, g3, g4, g5, g6, g7, g8); 1347} 1348 1349template <typename Generator1, typename Generator2, typename Generator3, 1350 typename Generator4, typename Generator5, typename Generator6, 1351 typename Generator7, typename Generator8, typename Generator9> 1352internal::CartesianProductHolder9<Generator1, Generator2, Generator3, 1353 Generator4, Generator5, Generator6, Generator7, Generator8, 1354 Generator9> Combine( 1355 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1356 const Generator4& g4, const Generator5& g5, const Generator6& g6, 1357 const Generator7& g7, const Generator8& g8, const Generator9& g9) { 1358 return internal::CartesianProductHolder9<Generator1, Generator2, Generator3, 1359 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>( 1360 g1, g2, g3, g4, g5, g6, g7, g8, g9); 1361} 1362 1363template <typename Generator1, typename Generator2, typename Generator3, 1364 typename Generator4, typename Generator5, typename Generator6, 1365 typename Generator7, typename Generator8, typename Generator9, 1366 typename Generator10> 1367internal::CartesianProductHolder10<Generator1, Generator2, Generator3, 1368 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9, 1369 Generator10> Combine( 1370 const Generator1& g1, const Generator2& g2, const Generator3& g3, 1371 const Generator4& g4, const Generator5& g5, const Generator6& g6, 1372 const Generator7& g7, const Generator8& g8, const Generator9& g9, 1373 const Generator10& g10) { 1374 return internal::CartesianProductHolder10<Generator1, Generator2, Generator3, 1375 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9, 1376 Generator10>( 1377 g1, g2, g3, g4, g5, g6, g7, g8, g9, g10); 1378} 1379# endif // GTEST_HAS_COMBINE 1380 1381 1382 1383# define TEST_P(test_case_name, test_name) \ 1384 class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ 1385 : public test_case_name { \ 1386 public: \ 1387 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ 1388 virtual void TestBody(); \ 1389 private: \ 1390 static int AddToRegistry() { \ 1391 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ 1392 GetTestCasePatternHolder<test_case_name>(\ 1393 #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ 1394 #test_case_name, \ 1395 #test_name, \ 1396 new ::testing::internal::TestMetaFactory< \ 1397 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ 1398 return 0; \ 1399 } \ 1400 static int gtest_registering_dummy_; \ 1401 GTEST_DISALLOW_COPY_AND_ASSIGN_(\ 1402 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ 1403 }; \ 1404 int GTEST_TEST_CLASS_NAME_(test_case_name, \ 1405 test_name)::gtest_registering_dummy_ = \ 1406 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ 1407 void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() 1408 1409# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ 1410 ::testing::internal::ParamGenerator<test_case_name::ParamType> \ 1411 gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ 1412 int gtest_##prefix##test_case_name##_dummy_ = \ 1413 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ 1414 GetTestCasePatternHolder<test_case_name>(\ 1415 #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ 1416 #prefix, \ 1417 >est_##prefix##test_case_name##_EvalGenerator_, \ 1418 __FILE__, __LINE__) 1419 1420} // namespace testing 1421 1422#endif // GTEST_HAS_PARAM_TEST 1423 1424#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ 1425