Qucs-core  0.0.19
gtest-param-test.h
Go to the documentation of this file.
00001 // This file was GENERATED by command:
00002 //     pump.py gtest-param-test.h.pump
00003 // DO NOT EDIT BY HAND!!!
00004 
00005 // Copyright 2008, Google Inc.
00006 // All rights reserved.
00007 //
00008 // Redistribution and use in source and binary forms, with or without
00009 // modification, are permitted provided that the following conditions are
00010 // met:
00011 //
00012 //     * Redistributions of source code must retain the above copyright
00013 // notice, this list of conditions and the following disclaimer.
00014 //     * Redistributions in binary form must reproduce the above
00015 // copyright notice, this list of conditions and the following disclaimer
00016 // in the documentation and/or other materials provided with the
00017 // distribution.
00018 //     * Neither the name of Google Inc. nor the names of its
00019 // contributors may be used to endorse or promote products derived from
00020 // this software without specific prior written permission.
00021 //
00022 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00023 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00024 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00025 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00026 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00027 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00028 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00029 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00030 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00031 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00032 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 //
00034 // Authors: vladl@google.com (Vlad Losev)
00035 //
00036 // Macros and functions for implementing parameterized tests
00037 // in Google C++ Testing Framework (Google Test)
00038 //
00039 // This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
00040 //
00041 #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
00042 #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
00043 
00044 
00045 // Value-parameterized tests allow you to test your code with different
00046 // parameters without writing multiple copies of the same test.
00047 //
00048 // Here is how you use value-parameterized tests:
00049 
00050 #if 0
00051 
00052 // To write value-parameterized tests, first you should define a fixture
00053 // class. It is usually derived from testing::TestWithParam<T> (see below for
00054 // another inheritance scheme that's sometimes useful in more complicated
00055 // class hierarchies), where the type of your parameter values.
00056 // TestWithParam<T> is itself derived from testing::Test. T can be any
00057 // copyable type. If it's a raw pointer, you are responsible for managing the
00058 // lifespan of the pointed values.
00059 
00060 class FooTest : public ::testing::TestWithParam<const char*> {
00061   // You can implement all the usual class fixture members here.
00062 };
00063 
00064 // Then, use the TEST_P macro to define as many parameterized tests
00065 // for this fixture as you want. The _P suffix is for "parameterized"
00066 // or "pattern", whichever you prefer to think.
00067 
00068 TEST_P(FooTest, DoesBlah) {
00069   // Inside a test, access the test parameter with the GetParam() method
00070   // of the TestWithParam<T> class:
00071   EXPECT_TRUE(foo.Blah(GetParam()));
00072   ...
00073 }
00074 
00075 TEST_P(FooTest, HasBlahBlah) {
00076   ...
00077 }
00078 
00079 // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
00080 // case with any set of parameters you want. Google Test defines a number
00081 // of functions for generating test parameters. They return what we call
00082 // (surprise!) parameter generators. Here is a  summary of them, which
00083 // are all in the testing namespace:
00084 //
00085 //
00086 //  Range(begin, end [, step]) - Yields values {begin, begin+step,
00087 //                               begin+step+step, ...}. The values do not
00088 //                               include end. step defaults to 1.
00089 //  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
00090 //  ValuesIn(container)        - Yields values from a C-style array, an STL
00091 //  ValuesIn(begin,end)          container, or an iterator range [begin, end).
00092 //  Bool()                     - Yields sequence {false, true}.
00093 //  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
00094 //                               for the math savvy) of the values generated
00095 //                               by the N generators.
00096 //
00097 // For more details, see comments at the definitions of these functions below
00098 // in this file.
00099 //
00100 // The following statement will instantiate tests from the FooTest test case
00101 // each with parameter values "meeny", "miny", and "moe".
00102 
00103 INSTANTIATE_TEST_CASE_P(InstantiationName,
00104                         FooTest,
00105                         Values("meeny", "miny", "moe"));
00106 
00107 // To distinguish different instances of the pattern, (yes, you
00108 // can instantiate it more then once) the first argument to the
00109 // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
00110 // actual test case name. Remember to pick unique prefixes for different
00111 // instantiations. The tests from the instantiation above will have
00112 // these names:
00113 //
00114 //    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
00115 //    * InstantiationName/FooTest.DoesBlah/1 for "miny"
00116 //    * InstantiationName/FooTest.DoesBlah/2 for "moe"
00117 //    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
00118 //    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
00119 //    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
00120 //
00121 // You can use these names in --gtest_filter.
00122 //
00123 // This statement will instantiate all tests from FooTest again, each
00124 // with parameter values "cat" and "dog":
00125 
00126 const char* pets[] = {"cat", "dog"};
00127 INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
00128 
00129 // The tests from the instantiation above will have these names:
00130 //
00131 //    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
00132 //    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
00133 //    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
00134 //    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
00135 //
00136 // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
00137 // in the given test case, whether their definitions come before or
00138 // AFTER the INSTANTIATE_TEST_CASE_P statement.
00139 //
00140 // Please also note that generator expressions (including parameters to the
00141 // generators) are evaluated in InitGoogleTest(), after main() has started.
00142 // This allows the user on one hand, to adjust generator parameters in order
00143 // to dynamically determine a set of tests to run and on the other hand,
00144 // give the user a chance to inspect the generated tests with Google Test
00145 // reflection API before RUN_ALL_TESTS() is executed.
00146 //
00147 // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
00148 // for more examples.
00149 //
00150 // In the future, we plan to publish the API for defining new parameter
00151 // generators. But for now this interface remains part of the internal
00152 // implementation and is subject to change.
00153 //
00154 //
00155 // A parameterized test fixture must be derived from testing::Test and from
00156 // testing::WithParamInterface<T>, where T is the type of the parameter
00157 // values. Inheriting from TestWithParam<T> satisfies that requirement because
00158 // TestWithParam<T> inherits from both Test and WithParamInterface. In more
00159 // complicated hierarchies, however, it is occasionally useful to inherit
00160 // separately from Test and WithParamInterface. For example:
00161 
00162 class BaseTest : public ::testing::Test {
00163   // You can inherit all the usual members for a non-parameterized test
00164   // fixture here.
00165 };
00166 
00167 class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
00168   // The usual test fixture members go here too.
00169 };
00170 
00171 TEST_F(BaseTest, HasFoo) {
00172   // This is an ordinary non-parameterized test.
00173 }
00174 
00175 TEST_P(DerivedTest, DoesBlah) {
00176   // GetParam works just the same here as if you inherit from TestWithParam.
00177   EXPECT_TRUE(foo.Blah(GetParam()));
00178 }
00179 
00180 #endif  // 0
00181 
00182 #include "gtest/internal/gtest-port.h"
00183 
00184 #if !GTEST_OS_SYMBIAN
00185 # include <utility>
00186 #endif
00187 
00188 // scripts/fuse_gtest.py depends on gtest's own header being #included
00189 // *unconditionally*.  Therefore these #includes cannot be moved
00190 // inside #if GTEST_HAS_PARAM_TEST.
00191 #include "gtest/internal/gtest-internal.h"
00192 #include "gtest/internal/gtest-param-util.h"
00193 #include "gtest/internal/gtest-param-util-generated.h"
00194 
00195 #if GTEST_HAS_PARAM_TEST
00196 
00197 namespace testing {
00198 
00199 // Functions producing parameter generators.
00200 //
00201 // Google Test uses these generators to produce parameters for value-
00202 // parameterized tests. When a parameterized test case is instantiated
00203 // with a particular generator, Google Test creates and runs tests
00204 // for each element in the sequence produced by the generator.
00205 //
00206 // In the following sample, tests from test case FooTest are instantiated
00207 // each three times with parameter values 3, 5, and 8:
00208 //
00209 // class FooTest : public TestWithParam<int> { ... };
00210 //
00211 // TEST_P(FooTest, TestThis) {
00212 // }
00213 // TEST_P(FooTest, TestThat) {
00214 // }
00215 // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
00216 //
00217 
00218 // Range() returns generators providing sequences of values in a range.
00219 //
00220 // Synopsis:
00221 // Range(start, end)
00222 //   - returns a generator producing a sequence of values {start, start+1,
00223 //     start+2, ..., }.
00224 // Range(start, end, step)
00225 //   - returns a generator producing a sequence of values {start, start+step,
00226 //     start+step+step, ..., }.
00227 // Notes:
00228 //   * The generated sequences never include end. For example, Range(1, 5)
00229 //     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
00230 //     returns a generator producing {1, 3, 5, 7}.
00231 //   * start and end must have the same type. That type may be any integral or
00232 //     floating-point type or a user defined type satisfying these conditions:
00233 //     * It must be assignable (have operator=() defined).
00234 //     * It must have operator+() (operator+(int-compatible type) for
00235 //       two-operand version).
00236 //     * It must have operator<() defined.
00237 //     Elements in the resulting sequences will also have that type.
00238 //   * Condition start < end must be satisfied in order for resulting sequences
00239 //     to contain any elements.
00240 //
00241 template <typename T, typename IncrementT>
00242 internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
00243   return internal::ParamGenerator<T>(
00244       new internal::RangeGenerator<T, IncrementT>(start, end, step));
00245 }
00246 
00247 template <typename T>
00248 internal::ParamGenerator<T> Range(T start, T end) {
00249   return Range(start, end, 1);
00250 }
00251 
00252 // ValuesIn() function allows generation of tests with parameters coming from
00253 // a container.
00254 //
00255 // Synopsis:
00256 // ValuesIn(const T (&array)[N])
00257 //   - returns a generator producing sequences with elements from
00258 //     a C-style array.
00259 // ValuesIn(const Container& container)
00260 //   - returns a generator producing sequences with elements from
00261 //     an STL-style container.
00262 // ValuesIn(Iterator begin, Iterator end)
00263 //   - returns a generator producing sequences with elements from
00264 //     a range [begin, end) defined by a pair of STL-style iterators. These
00265 //     iterators can also be plain C pointers.
00266 //
00267 // Please note that ValuesIn copies the values from the containers
00268 // passed in and keeps them to generate tests in RUN_ALL_TESTS().
00269 //
00270 // Examples:
00271 //
00272 // This instantiates tests from test case StringTest
00273 // each with C-string values of "foo", "bar", and "baz":
00274 //
00275 // const char* strings[] = {"foo", "bar", "baz"};
00276 // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
00277 //
00278 // This instantiates tests from test case StlStringTest
00279 // each with STL strings with values "a" and "b":
00280 //
00281 // ::std::vector< ::std::string> GetParameterStrings() {
00282 //   ::std::vector< ::std::string> v;
00283 //   v.push_back("a");
00284 //   v.push_back("b");
00285 //   return v;
00286 // }
00287 //
00288 // INSTANTIATE_TEST_CASE_P(CharSequence,
00289 //                         StlStringTest,
00290 //                         ValuesIn(GetParameterStrings()));
00291 //
00292 //
00293 // This will also instantiate tests from CharTest
00294 // each with parameter values 'a' and 'b':
00295 //
00296 // ::std::list<char> GetParameterChars() {
00297 //   ::std::list<char> list;
00298 //   list.push_back('a');
00299 //   list.push_back('b');
00300 //   return list;
00301 // }
00302 // ::std::list<char> l = GetParameterChars();
00303 // INSTANTIATE_TEST_CASE_P(CharSequence2,
00304 //                         CharTest,
00305 //                         ValuesIn(l.begin(), l.end()));
00306 //
00307 template <typename ForwardIterator>
00308 internal::ParamGenerator<
00309   typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
00310 ValuesIn(ForwardIterator begin, ForwardIterator end) {
00311   typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
00312       ::value_type ParamType;
00313   return internal::ParamGenerator<ParamType>(
00314       new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
00315 }
00316 
00317 template <typename T, size_t N>
00318 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
00319   return ValuesIn(array, array + N);
00320 }
00321 
00322 template <class Container>
00323 internal::ParamGenerator<typename Container::value_type> ValuesIn(
00324     const Container& container) {
00325   return ValuesIn(container.begin(), container.end());
00326 }
00327 
00328 // Values() allows generating tests from explicitly specified list of
00329 // parameters.
00330 //
00331 // Synopsis:
00332 // Values(T v1, T v2, ..., T vN)
00333 //   - returns a generator producing sequences with elements v1, v2, ..., vN.
00334 //
00335 // For example, this instantiates tests from test case BarTest each
00336 // with values "one", "two", and "three":
00337 //
00338 // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
00339 //
00340 // This instantiates tests from test case BazTest each with values 1, 2, 3.5.
00341 // The exact type of values will depend on the type of parameter in BazTest.
00342 //
00343 // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
00344 //
00345 // Currently, Values() supports from 1 to 50 parameters.
00346 //
00347 template <typename T1>
00348 internal::ValueArray1<T1> Values(T1 v1) {
00349   return internal::ValueArray1<T1>(v1);
00350 }
00351 
00352 template <typename T1, typename T2>
00353 internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
00354   return internal::ValueArray2<T1, T2>(v1, v2);
00355 }
00356 
00357 template <typename T1, typename T2, typename T3>
00358 internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
00359   return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
00360 }
00361 
00362 template <typename T1, typename T2, typename T3, typename T4>
00363 internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
00364   return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
00365 }
00366 
00367 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00368 internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
00369     T5 v5) {
00370   return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
00371 }
00372 
00373 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00374     typename T6>
00375 internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
00376     T4 v4, T5 v5, T6 v6) {
00377   return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
00378 }
00379 
00380 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00381     typename T6, typename T7>
00382 internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
00383     T4 v4, T5 v5, T6 v6, T7 v7) {
00384   return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
00385       v6, v7);
00386 }
00387 
00388 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00389     typename T6, typename T7, typename T8>
00390 internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
00391     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
00392   return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
00393       v5, v6, v7, v8);
00394 }
00395 
00396 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00397     typename T6, typename T7, typename T8, typename T9>
00398 internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
00399     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
00400   return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
00401       v4, v5, v6, v7, v8, v9);
00402 }
00403 
00404 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00405     typename T6, typename T7, typename T8, typename T9, typename T10>
00406 internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
00407     T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
00408   return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
00409       v2, v3, v4, v5, v6, v7, v8, v9, v10);
00410 }
00411 
00412 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00413     typename T6, typename T7, typename T8, typename T9, typename T10,
00414     typename T11>
00415 internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
00416     T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00417     T10 v10, T11 v11) {
00418   return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
00419       T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
00420 }
00421 
00422 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00423     typename T6, typename T7, typename T8, typename T9, typename T10,
00424     typename T11, typename T12>
00425 internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00426     T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00427     T10 v10, T11 v11, T12 v12) {
00428   return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00429       T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
00430 }
00431 
00432 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00433     typename T6, typename T7, typename T8, typename T9, typename T10,
00434     typename T11, typename T12, typename T13>
00435 internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
00436     T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00437     T10 v10, T11 v11, T12 v12, T13 v13) {
00438   return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00439       T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
00440 }
00441 
00442 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00443     typename T6, typename T7, typename T8, typename T9, typename T10,
00444     typename T11, typename T12, typename T13, typename T14>
00445 internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00446     T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00447     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
00448   return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00449       T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
00450       v14);
00451 }
00452 
00453 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00454     typename T6, typename T7, typename T8, typename T9, typename T10,
00455     typename T11, typename T12, typename T13, typename T14, typename T15>
00456 internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00457     T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
00458     T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
00459   return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00460       T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
00461       v13, v14, v15);
00462 }
00463 
00464 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00465     typename T6, typename T7, typename T8, typename T9, typename T10,
00466     typename T11, typename T12, typename T13, typename T14, typename T15,
00467     typename T16>
00468 internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00469     T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
00470     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
00471     T16 v16) {
00472   return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00473       T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
00474       v12, v13, v14, v15, v16);
00475 }
00476 
00477 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00478     typename T6, typename T7, typename T8, typename T9, typename T10,
00479     typename T11, typename T12, typename T13, typename T14, typename T15,
00480     typename T16, typename T17>
00481 internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00482     T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
00483     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
00484     T16 v16, T17 v17) {
00485   return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00486       T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
00487       v11, v12, v13, v14, v15, v16, v17);
00488 }
00489 
00490 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00491     typename T6, typename T7, typename T8, typename T9, typename T10,
00492     typename T11, typename T12, typename T13, typename T14, typename T15,
00493     typename T16, typename T17, typename T18>
00494 internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00495     T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
00496     T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
00497     T16 v16, T17 v17, T18 v18) {
00498   return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00499       T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
00500       v10, v11, v12, v13, v14, v15, v16, v17, v18);
00501 }
00502 
00503 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00504     typename T6, typename T7, typename T8, typename T9, typename T10,
00505     typename T11, typename T12, typename T13, typename T14, typename T15,
00506     typename T16, typename T17, typename T18, typename T19>
00507 internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00508     T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
00509     T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
00510     T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
00511   return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00512       T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
00513       v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
00514 }
00515 
00516 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00517     typename T6, typename T7, typename T8, typename T9, typename T10,
00518     typename T11, typename T12, typename T13, typename T14, typename T15,
00519     typename T16, typename T17, typename T18, typename T19, typename T20>
00520 internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00521     T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
00522     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
00523     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
00524   return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00525       T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
00526       v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
00527 }
00528 
00529 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00530     typename T6, typename T7, typename T8, typename T9, typename T10,
00531     typename T11, typename T12, typename T13, typename T14, typename T15,
00532     typename T16, typename T17, typename T18, typename T19, typename T20,
00533     typename T21>
00534 internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00535     T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
00536     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
00537     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
00538   return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00539       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
00540       v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
00541 }
00542 
00543 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00544     typename T6, typename T7, typename T8, typename T9, typename T10,
00545     typename T11, typename T12, typename T13, typename T14, typename T15,
00546     typename T16, typename T17, typename T18, typename T19, typename T20,
00547     typename T21, typename T22>
00548 internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00549     T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
00550     T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
00551     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
00552     T21 v21, T22 v22) {
00553   return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00554       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
00555       v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
00556       v20, v21, v22);
00557 }
00558 
00559 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00560     typename T6, typename T7, typename T8, typename T9, typename T10,
00561     typename T11, typename T12, typename T13, typename T14, typename T15,
00562     typename T16, typename T17, typename T18, typename T19, typename T20,
00563     typename T21, typename T22, typename T23>
00564 internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00565     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
00566     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
00567     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
00568     T21 v21, T22 v22, T23 v23) {
00569   return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00570       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
00571       v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
00572       v20, v21, v22, v23);
00573 }
00574 
00575 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00576     typename T6, typename T7, typename T8, typename T9, typename T10,
00577     typename T11, typename T12, typename T13, typename T14, typename T15,
00578     typename T16, typename T17, typename T18, typename T19, typename T20,
00579     typename T21, typename T22, typename T23, typename T24>
00580 internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00581     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
00582     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
00583     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
00584     T21 v21, T22 v22, T23 v23, T24 v24) {
00585   return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00586       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
00587       v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
00588       v19, v20, v21, v22, v23, v24);
00589 }
00590 
00591 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00592     typename T6, typename T7, typename T8, typename T9, typename T10,
00593     typename T11, typename T12, typename T13, typename T14, typename T15,
00594     typename T16, typename T17, typename T18, typename T19, typename T20,
00595     typename T21, typename T22, typename T23, typename T24, typename T25>
00596 internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00597     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
00598     T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
00599     T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
00600     T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
00601   return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00602       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
00603       v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
00604       v18, v19, v20, v21, v22, v23, v24, v25);
00605 }
00606 
00607 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00608     typename T6, typename T7, typename T8, typename T9, typename T10,
00609     typename T11, typename T12, typename T13, typename T14, typename T15,
00610     typename T16, typename T17, typename T18, typename T19, typename T20,
00611     typename T21, typename T22, typename T23, typename T24, typename T25,
00612     typename T26>
00613 internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00614     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00615     T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00616     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00617     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00618     T26 v26) {
00619   return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00620       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00621       T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
00622       v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
00623 }
00624 
00625 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00626     typename T6, typename T7, typename T8, typename T9, typename T10,
00627     typename T11, typename T12, typename T13, typename T14, typename T15,
00628     typename T16, typename T17, typename T18, typename T19, typename T20,
00629     typename T21, typename T22, typename T23, typename T24, typename T25,
00630     typename T26, typename T27>
00631 internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00632     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
00633     T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00634     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00635     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00636     T26 v26, T27 v27) {
00637   return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00638       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00639       T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
00640       v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
00641 }
00642 
00643 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00644     typename T6, typename T7, typename T8, typename T9, typename T10,
00645     typename T11, typename T12, typename T13, typename T14, typename T15,
00646     typename T16, typename T17, typename T18, typename T19, typename T20,
00647     typename T21, typename T22, typename T23, typename T24, typename T25,
00648     typename T26, typename T27, typename T28>
00649 internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00650     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
00651     T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00652     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00653     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00654     T26 v26, T27 v27, T28 v28) {
00655   return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00656       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00657       T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
00658       v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
00659       v28);
00660 }
00661 
00662 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00663     typename T6, typename T7, typename T8, typename T9, typename T10,
00664     typename T11, typename T12, typename T13, typename T14, typename T15,
00665     typename T16, typename T17, typename T18, typename T19, typename T20,
00666     typename T21, typename T22, typename T23, typename T24, typename T25,
00667     typename T26, typename T27, typename T28, typename T29>
00668 internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00669     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00670     T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00671     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00672     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00673     T26 v26, T27 v27, T28 v28, T29 v29) {
00674   return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00675       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00676       T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
00677       v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
00678       v27, v28, v29);
00679 }
00680 
00681 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00682     typename T6, typename T7, typename T8, typename T9, typename T10,
00683     typename T11, typename T12, typename T13, typename T14, typename T15,
00684     typename T16, typename T17, typename T18, typename T19, typename T20,
00685     typename T21, typename T22, typename T23, typename T24, typename T25,
00686     typename T26, typename T27, typename T28, typename T29, typename T30>
00687 internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00688     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00689     T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
00690     T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
00691     T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
00692     T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
00693   return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00694       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00695       T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
00696       v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
00697       v26, v27, v28, v29, v30);
00698 }
00699 
00700 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00701     typename T6, typename T7, typename T8, typename T9, typename T10,
00702     typename T11, typename T12, typename T13, typename T14, typename T15,
00703     typename T16, typename T17, typename T18, typename T19, typename T20,
00704     typename T21, typename T22, typename T23, typename T24, typename T25,
00705     typename T26, typename T27, typename T28, typename T29, typename T30,
00706     typename T31>
00707 internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00708     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00709     T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
00710     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
00711     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
00712     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
00713   return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00714       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00715       T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
00716       v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
00717       v25, v26, v27, v28, v29, v30, v31);
00718 }
00719 
00720 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00721     typename T6, typename T7, typename T8, typename T9, typename T10,
00722     typename T11, typename T12, typename T13, typename T14, typename T15,
00723     typename T16, typename T17, typename T18, typename T19, typename T20,
00724     typename T21, typename T22, typename T23, typename T24, typename T25,
00725     typename T26, typename T27, typename T28, typename T29, typename T30,
00726     typename T31, typename T32>
00727 internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00728     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00729     T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
00730     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
00731     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
00732     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
00733     T32 v32) {
00734   return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00735       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00736       T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
00737       v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
00738       v24, v25, v26, v27, v28, v29, v30, v31, v32);
00739 }
00740 
00741 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00742     typename T6, typename T7, typename T8, typename T9, typename T10,
00743     typename T11, typename T12, typename T13, typename T14, typename T15,
00744     typename T16, typename T17, typename T18, typename T19, typename T20,
00745     typename T21, typename T22, typename T23, typename T24, typename T25,
00746     typename T26, typename T27, typename T28, typename T29, typename T30,
00747     typename T31, typename T32, typename T33>
00748 internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00749     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00750     T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
00751     T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
00752     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
00753     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
00754     T32 v32, T33 v33) {
00755   return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00756       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00757       T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
00758       v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
00759       v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
00760 }
00761 
00762 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00763     typename T6, typename T7, typename T8, typename T9, typename T10,
00764     typename T11, typename T12, typename T13, typename T14, typename T15,
00765     typename T16, typename T17, typename T18, typename T19, typename T20,
00766     typename T21, typename T22, typename T23, typename T24, typename T25,
00767     typename T26, typename T27, typename T28, typename T29, typename T30,
00768     typename T31, typename T32, typename T33, typename T34>
00769 internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00770     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00771     T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
00772     T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
00773     T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
00774     T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
00775     T31 v31, T32 v32, T33 v33, T34 v34) {
00776   return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00777       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00778       T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
00779       v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
00780       v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
00781 }
00782 
00783 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00784     typename T6, typename T7, typename T8, typename T9, typename T10,
00785     typename T11, typename T12, typename T13, typename T14, typename T15,
00786     typename T16, typename T17, typename T18, typename T19, typename T20,
00787     typename T21, typename T22, typename T23, typename T24, typename T25,
00788     typename T26, typename T27, typename T28, typename T29, typename T30,
00789     typename T31, typename T32, typename T33, typename T34, typename T35>
00790 internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00791     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00792     T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
00793     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
00794     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
00795     T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
00796     T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
00797   return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00798       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00799       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
00800       v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
00801       v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
00802 }
00803 
00804 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00805     typename T6, typename T7, typename T8, typename T9, typename T10,
00806     typename T11, typename T12, typename T13, typename T14, typename T15,
00807     typename T16, typename T17, typename T18, typename T19, typename T20,
00808     typename T21, typename T22, typename T23, typename T24, typename T25,
00809     typename T26, typename T27, typename T28, typename T29, typename T30,
00810     typename T31, typename T32, typename T33, typename T34, typename T35,
00811     typename T36>
00812 internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00813     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00814     T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
00815     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
00816     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
00817     T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
00818     T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
00819   return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00820       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00821       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
00822       v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
00823       v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
00824       v34, v35, v36);
00825 }
00826 
00827 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00828     typename T6, typename T7, typename T8, typename T9, typename T10,
00829     typename T11, typename T12, typename T13, typename T14, typename T15,
00830     typename T16, typename T17, typename T18, typename T19, typename T20,
00831     typename T21, typename T22, typename T23, typename T24, typename T25,
00832     typename T26, typename T27, typename T28, typename T29, typename T30,
00833     typename T31, typename T32, typename T33, typename T34, typename T35,
00834     typename T36, typename T37>
00835 internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00836     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00837     T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
00838     T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
00839     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
00840     T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
00841     T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
00842     T37 v37) {
00843   return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00844       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00845       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
00846       v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
00847       v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
00848       v34, v35, v36, v37);
00849 }
00850 
00851 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00852     typename T6, typename T7, typename T8, typename T9, typename T10,
00853     typename T11, typename T12, typename T13, typename T14, typename T15,
00854     typename T16, typename T17, typename T18, typename T19, typename T20,
00855     typename T21, typename T22, typename T23, typename T24, typename T25,
00856     typename T26, typename T27, typename T28, typename T29, typename T30,
00857     typename T31, typename T32, typename T33, typename T34, typename T35,
00858     typename T36, typename T37, typename T38>
00859 internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00860     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00861     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
00862     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
00863     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
00864     T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
00865     T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
00866     T37 v37, T38 v38) {
00867   return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00868       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00869       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
00870       v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
00871       v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
00872       v33, v34, v35, v36, v37, v38);
00873 }
00874 
00875 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00876     typename T6, typename T7, typename T8, typename T9, typename T10,
00877     typename T11, typename T12, typename T13, typename T14, typename T15,
00878     typename T16, typename T17, typename T18, typename T19, typename T20,
00879     typename T21, typename T22, typename T23, typename T24, typename T25,
00880     typename T26, typename T27, typename T28, typename T29, typename T30,
00881     typename T31, typename T32, typename T33, typename T34, typename T35,
00882     typename T36, typename T37, typename T38, typename T39>
00883 internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00884     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00885     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
00886     T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
00887     T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
00888     T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
00889     T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
00890     T37 v37, T38 v38, T39 v39) {
00891   return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00892       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00893       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
00894       v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
00895       v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
00896       v32, v33, v34, v35, v36, v37, v38, v39);
00897 }
00898 
00899 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00900     typename T6, typename T7, typename T8, typename T9, typename T10,
00901     typename T11, typename T12, typename T13, typename T14, typename T15,
00902     typename T16, typename T17, typename T18, typename T19, typename T20,
00903     typename T21, typename T22, typename T23, typename T24, typename T25,
00904     typename T26, typename T27, typename T28, typename T29, typename T30,
00905     typename T31, typename T32, typename T33, typename T34, typename T35,
00906     typename T36, typename T37, typename T38, typename T39, typename T40>
00907 internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00908     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00909     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
00910     T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
00911     T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
00912     T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
00913     T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
00914     T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
00915   return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00916       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00917       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
00918       T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
00919       v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
00920       v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
00921 }
00922 
00923 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00924     typename T6, typename T7, typename T8, typename T9, typename T10,
00925     typename T11, typename T12, typename T13, typename T14, typename T15,
00926     typename T16, typename T17, typename T18, typename T19, typename T20,
00927     typename T21, typename T22, typename T23, typename T24, typename T25,
00928     typename T26, typename T27, typename T28, typename T29, typename T30,
00929     typename T31, typename T32, typename T33, typename T34, typename T35,
00930     typename T36, typename T37, typename T38, typename T39, typename T40,
00931     typename T41>
00932 internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00933     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00934     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
00935     T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00936     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00937     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00938     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
00939     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
00940   return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00941       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00942       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
00943       T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
00944       v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
00945       v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
00946 }
00947 
00948 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00949     typename T6, typename T7, typename T8, typename T9, typename T10,
00950     typename T11, typename T12, typename T13, typename T14, typename T15,
00951     typename T16, typename T17, typename T18, typename T19, typename T20,
00952     typename T21, typename T22, typename T23, typename T24, typename T25,
00953     typename T26, typename T27, typename T28, typename T29, typename T30,
00954     typename T31, typename T32, typename T33, typename T34, typename T35,
00955     typename T36, typename T37, typename T38, typename T39, typename T40,
00956     typename T41, typename T42>
00957 internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00958     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00959     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
00960     T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00961     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00962     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00963     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
00964     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
00965     T42 v42) {
00966   return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00967       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00968       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
00969       T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
00970       v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
00971       v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
00972       v42);
00973 }
00974 
00975 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00976     typename T6, typename T7, typename T8, typename T9, typename T10,
00977     typename T11, typename T12, typename T13, typename T14, typename T15,
00978     typename T16, typename T17, typename T18, typename T19, typename T20,
00979     typename T21, typename T22, typename T23, typename T24, typename T25,
00980     typename T26, typename T27, typename T28, typename T29, typename T30,
00981     typename T31, typename T32, typename T33, typename T34, typename T35,
00982     typename T36, typename T37, typename T38, typename T39, typename T40,
00983     typename T41, typename T42, typename T43>
00984 internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
00985     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
00986     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
00987     T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
00988     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
00989     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
00990     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
00991     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
00992     T42 v42, T43 v43) {
00993   return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
00994       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
00995       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
00996       T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
00997       v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
00998       v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
00999       v41, v42, v43);
01000 }
01001 
01002 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01003     typename T6, typename T7, typename T8, typename T9, typename T10,
01004     typename T11, typename T12, typename T13, typename T14, typename T15,
01005     typename T16, typename T17, typename T18, typename T19, typename T20,
01006     typename T21, typename T22, typename T23, typename T24, typename T25,
01007     typename T26, typename T27, typename T28, typename T29, typename T30,
01008     typename T31, typename T32, typename T33, typename T34, typename T35,
01009     typename T36, typename T37, typename T38, typename T39, typename T40,
01010     typename T41, typename T42, typename T43, typename T44>
01011 internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01012     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01013     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01014     T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
01015     T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
01016     T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
01017     T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
01018     T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
01019     T42 v42, T43 v43, T44 v44) {
01020   return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01021       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01022       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01023       T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
01024       v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
01025       v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
01026       v40, v41, v42, v43, v44);
01027 }
01028 
01029 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01030     typename T6, typename T7, typename T8, typename T9, typename T10,
01031     typename T11, typename T12, typename T13, typename T14, typename T15,
01032     typename T16, typename T17, typename T18, typename T19, typename T20,
01033     typename T21, typename T22, typename T23, typename T24, typename T25,
01034     typename T26, typename T27, typename T28, typename T29, typename T30,
01035     typename T31, typename T32, typename T33, typename T34, typename T35,
01036     typename T36, typename T37, typename T38, typename T39, typename T40,
01037     typename T41, typename T42, typename T43, typename T44, typename T45>
01038 internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01039     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01040     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01041     T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
01042     T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
01043     T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
01044     T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
01045     T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
01046     T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
01047   return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01048       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01049       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01050       T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
01051       v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
01052       v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
01053       v39, v40, v41, v42, v43, v44, v45);
01054 }
01055 
01056 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01057     typename T6, typename T7, typename T8, typename T9, typename T10,
01058     typename T11, typename T12, typename T13, typename T14, typename T15,
01059     typename T16, typename T17, typename T18, typename T19, typename T20,
01060     typename T21, typename T22, typename T23, typename T24, typename T25,
01061     typename T26, typename T27, typename T28, typename T29, typename T30,
01062     typename T31, typename T32, typename T33, typename T34, typename T35,
01063     typename T36, typename T37, typename T38, typename T39, typename T40,
01064     typename T41, typename T42, typename T43, typename T44, typename T45,
01065     typename T46>
01066 internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01067     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01068     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01069     T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
01070     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
01071     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
01072     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
01073     T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
01074     T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
01075   return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01076       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01077       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01078       T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
01079       v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
01080       v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
01081       v38, v39, v40, v41, v42, v43, v44, v45, v46);
01082 }
01083 
01084 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01085     typename T6, typename T7, typename T8, typename T9, typename T10,
01086     typename T11, typename T12, typename T13, typename T14, typename T15,
01087     typename T16, typename T17, typename T18, typename T19, typename T20,
01088     typename T21, typename T22, typename T23, typename T24, typename T25,
01089     typename T26, typename T27, typename T28, typename T29, typename T30,
01090     typename T31, typename T32, typename T33, typename T34, typename T35,
01091     typename T36, typename T37, typename T38, typename T39, typename T40,
01092     typename T41, typename T42, typename T43, typename T44, typename T45,
01093     typename T46, typename T47>
01094 internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01095     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01096     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01097     T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
01098     T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
01099     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
01100     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
01101     T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
01102     T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
01103   return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01104       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01105       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01106       T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
01107       v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
01108       v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
01109       v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
01110 }
01111 
01112 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01113     typename T6, typename T7, typename T8, typename T9, typename T10,
01114     typename T11, typename T12, typename T13, typename T14, typename T15,
01115     typename T16, typename T17, typename T18, typename T19, typename T20,
01116     typename T21, typename T22, typename T23, typename T24, typename T25,
01117     typename T26, typename T27, typename T28, typename T29, typename T30,
01118     typename T31, typename T32, typename T33, typename T34, typename T35,
01119     typename T36, typename T37, typename T38, typename T39, typename T40,
01120     typename T41, typename T42, typename T43, typename T44, typename T45,
01121     typename T46, typename T47, typename T48>
01122 internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01123     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01124     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01125     T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
01126     T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
01127     T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
01128     T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
01129     T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
01130     T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
01131     T48 v48) {
01132   return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01133       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01134       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01135       T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
01136       v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
01137       v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
01138       v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
01139 }
01140 
01141 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01142     typename T6, typename T7, typename T8, typename T9, typename T10,
01143     typename T11, typename T12, typename T13, typename T14, typename T15,
01144     typename T16, typename T17, typename T18, typename T19, typename T20,
01145     typename T21, typename T22, typename T23, typename T24, typename T25,
01146     typename T26, typename T27, typename T28, typename T29, typename T30,
01147     typename T31, typename T32, typename T33, typename T34, typename T35,
01148     typename T36, typename T37, typename T38, typename T39, typename T40,
01149     typename T41, typename T42, typename T43, typename T44, typename T45,
01150     typename T46, typename T47, typename T48, typename T49>
01151 internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01152     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01153     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01154     T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
01155     T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
01156     T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
01157     T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
01158     T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
01159     T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
01160     T47 v47, T48 v48, T49 v49) {
01161   return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01162       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01163       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01164       T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
01165       v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
01166       v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
01167       v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
01168 }
01169 
01170 template <typename T1, typename T2, typename T3, typename T4, typename T5,
01171     typename T6, typename T7, typename T8, typename T9, typename T10,
01172     typename T11, typename T12, typename T13, typename T14, typename T15,
01173     typename T16, typename T17, typename T18, typename T19, typename T20,
01174     typename T21, typename T22, typename T23, typename T24, typename T25,
01175     typename T26, typename T27, typename T28, typename T29, typename T30,
01176     typename T31, typename T32, typename T33, typename T34, typename T35,
01177     typename T36, typename T37, typename T38, typename T39, typename T40,
01178     typename T41, typename T42, typename T43, typename T44, typename T45,
01179     typename T46, typename T47, typename T48, typename T49, typename T50>
01180 internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
01181     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
01182     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
01183     T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
01184     T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
01185     T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
01186     T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
01187     T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
01188     T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
01189     T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
01190   return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
01191       T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
01192       T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
01193       T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
01194       v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
01195       v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
01196       v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
01197       v48, v49, v50);
01198 }
01199 
01200 // Bool() allows generating tests with parameters in a set of (false, true).
01201 //
01202 // Synopsis:
01203 // Bool()
01204 //   - returns a generator producing sequences with elements {false, true}.
01205 //
01206 // It is useful when testing code that depends on Boolean flags. Combinations
01207 // of multiple flags can be tested when several Bool()'s are combined using
01208 // Combine() function.
01209 //
01210 // In the following example all tests in the test case FlagDependentTest
01211 // will be instantiated twice with parameters false and true.
01212 //
01213 // class FlagDependentTest : public testing::TestWithParam<bool> {
01214 //   virtual void SetUp() {
01215 //     external_flag = GetParam();
01216 //   }
01217 // }
01218 // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
01219 //
01220 inline internal::ParamGenerator<bool> Bool() {
01221   return Values(false, true);
01222 }
01223 
01224 # if GTEST_HAS_COMBINE
01225 // Combine() allows the user to combine two or more sequences to produce
01226 // values of a Cartesian product of those sequences' elements.
01227 //
01228 // Synopsis:
01229 // Combine(gen1, gen2, ..., genN)
01230 //   - returns a generator producing sequences with elements coming from
01231 //     the Cartesian product of elements from the sequences generated by
01232 //     gen1, gen2, ..., genN. The sequence elements will have a type of
01233 //     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
01234 //     of elements from sequences produces by gen1, gen2, ..., genN.
01235 //
01236 // Combine can have up to 10 arguments. This number is currently limited
01237 // by the maximum number of elements in the tuple implementation used by Google
01238 // Test.
01239 //
01240 // Example:
01241 //
01242 // This will instantiate tests in test case AnimalTest each one with
01243 // the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
01244 // tuple("dog", BLACK), and tuple("dog", WHITE):
01245 //
01246 // enum Color { BLACK, GRAY, WHITE };
01247 // class AnimalTest
01248 //     : public testing::TestWithParam<tuple<const char*, Color> > {...};
01249 //
01250 // TEST_P(AnimalTest, AnimalLooksNice) {...}
01251 //
01252 // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
01253 //                         Combine(Values("cat", "dog"),
01254 //                                 Values(BLACK, WHITE)));
01255 //
01256 // This will instantiate tests in FlagDependentTest with all variations of two
01257 // Boolean flags:
01258 //
01259 // class FlagDependentTest
01260 //     : public testing::TestWithParam<tuple<bool, bool> > {
01261 //   virtual void SetUp() {
01262 //     // Assigns external_flag_1 and external_flag_2 values from the tuple.
01263 //     tie(external_flag_1, external_flag_2) = GetParam();
01264 //   }
01265 // };
01266 //
01267 // TEST_P(FlagDependentTest, TestFeature1) {
01268 //   // Test your code using external_flag_1 and external_flag_2 here.
01269 // }
01270 // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
01271 //                         Combine(Bool(), Bool()));
01272 //
01273 template <typename Generator1, typename Generator2>
01274 internal::CartesianProductHolder2<Generator1, Generator2> Combine(
01275     const Generator1& g1, const Generator2& g2) {
01276   return internal::CartesianProductHolder2<Generator1, Generator2>(
01277       g1, g2);
01278 }
01279 
01280 template <typename Generator1, typename Generator2, typename Generator3>
01281 internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
01282     const Generator1& g1, const Generator2& g2, const Generator3& g3) {
01283   return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
01284       g1, g2, g3);
01285 }
01286 
01287 template <typename Generator1, typename Generator2, typename Generator3,
01288     typename Generator4>
01289 internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
01290     Generator4> Combine(
01291     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01292         const Generator4& g4) {
01293   return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
01294       Generator4>(
01295       g1, g2, g3, g4);
01296 }
01297 
01298 template <typename Generator1, typename Generator2, typename Generator3,
01299     typename Generator4, typename Generator5>
01300 internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
01301     Generator4, Generator5> Combine(
01302     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01303         const Generator4& g4, const Generator5& g5) {
01304   return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
01305       Generator4, Generator5>(
01306       g1, g2, g3, g4, g5);
01307 }
01308 
01309 template <typename Generator1, typename Generator2, typename Generator3,
01310     typename Generator4, typename Generator5, typename Generator6>
01311 internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
01312     Generator4, Generator5, Generator6> Combine(
01313     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01314         const Generator4& g4, const Generator5& g5, const Generator6& g6) {
01315   return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
01316       Generator4, Generator5, Generator6>(
01317       g1, g2, g3, g4, g5, g6);
01318 }
01319 
01320 template <typename Generator1, typename Generator2, typename Generator3,
01321     typename Generator4, typename Generator5, typename Generator6,
01322     typename Generator7>
01323 internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
01324     Generator4, Generator5, Generator6, Generator7> Combine(
01325     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01326         const Generator4& g4, const Generator5& g5, const Generator6& g6,
01327         const Generator7& g7) {
01328   return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
01329       Generator4, Generator5, Generator6, Generator7>(
01330       g1, g2, g3, g4, g5, g6, g7);
01331 }
01332 
01333 template <typename Generator1, typename Generator2, typename Generator3,
01334     typename Generator4, typename Generator5, typename Generator6,
01335     typename Generator7, typename Generator8>
01336 internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
01337     Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
01338     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01339         const Generator4& g4, const Generator5& g5, const Generator6& g6,
01340         const Generator7& g7, const Generator8& g8) {
01341   return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
01342       Generator4, Generator5, Generator6, Generator7, Generator8>(
01343       g1, g2, g3, g4, g5, g6, g7, g8);
01344 }
01345 
01346 template <typename Generator1, typename Generator2, typename Generator3,
01347     typename Generator4, typename Generator5, typename Generator6,
01348     typename Generator7, typename Generator8, typename Generator9>
01349 internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
01350     Generator4, Generator5, Generator6, Generator7, Generator8,
01351     Generator9> Combine(
01352     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01353         const Generator4& g4, const Generator5& g5, const Generator6& g6,
01354         const Generator7& g7, const Generator8& g8, const Generator9& g9) {
01355   return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
01356       Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
01357       g1, g2, g3, g4, g5, g6, g7, g8, g9);
01358 }
01359 
01360 template <typename Generator1, typename Generator2, typename Generator3,
01361     typename Generator4, typename Generator5, typename Generator6,
01362     typename Generator7, typename Generator8, typename Generator9,
01363     typename Generator10>
01364 internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
01365     Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
01366     Generator10> Combine(
01367     const Generator1& g1, const Generator2& g2, const Generator3& g3,
01368         const Generator4& g4, const Generator5& g5, const Generator6& g6,
01369         const Generator7& g7, const Generator8& g8, const Generator9& g9,
01370         const Generator10& g10) {
01371   return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
01372       Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
01373       Generator10>(
01374       g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
01375 }
01376 # endif  // GTEST_HAS_COMBINE
01377 
01378 
01379 
01380 # define TEST_P(test_case_name, test_name) \
01381   class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
01382       : public test_case_name { \
01383    public: \
01384     GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
01385     virtual void TestBody(); \
01386    private: \
01387     static int AddToRegistry() { \
01388       ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
01389           GetTestCasePatternHolder<test_case_name>(\
01390               #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
01391                   #test_case_name, \
01392                   #test_name, \
01393                   new ::testing::internal::TestMetaFactory< \
01394                       GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
01395       return 0; \
01396     } \
01397     static int gtest_registering_dummy_; \
01398     GTEST_DISALLOW_COPY_AND_ASSIGN_(\
01399         GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
01400   }; \
01401   int GTEST_TEST_CLASS_NAME_(test_case_name, \
01402                              test_name)::gtest_registering_dummy_ = \
01403       GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
01404   void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
01405 
01406 # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
01407   ::testing::internal::ParamGenerator<test_case_name::ParamType> \
01408       gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
01409   int gtest_##prefix##test_case_name##_dummy_ = \
01410       ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
01411           GetTestCasePatternHolder<test_case_name>(\
01412               #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
01413                   #prefix, \
01414                   &gtest_##prefix##test_case_name##_EvalGenerator_, \
01415                   __FILE__, __LINE__)
01416 
01417 }  // namespace testing
01418 
01419 #endif  // GTEST_HAS_PARAM_TEST
01420 
01421 #endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_