00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifndef GTEST_INCLUDE_GTEST_GTEST_H_
00052 #define GTEST_INCLUDE_GTEST_GTEST_H_
00053
00054 #include <limits>
00055 #include <ostream>
00056 #include <vector>
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
00095 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
00137 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 #include <ctype.h>
00293 #include <stddef.h>
00294 #include <stdlib.h>
00295 #include <stdio.h>
00296 #include <string.h>
00297 #ifndef _WIN32_WCE
00298 # include <sys/types.h>
00299 # include <sys/stat.h>
00300 #endif // !_WIN32_WCE
00301
00302 #if defined __APPLE__
00303 # include <AvailabilityMacros.h>
00304 # include <TargetConditionals.h>
00305 #endif
00306
00307 #include <iostream>
00308 #include <sstream>
00309 #include <string>
00310
00311 #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
00312 #define GTEST_FLAG_PREFIX_ "gtest_"
00313 #define GTEST_FLAG_PREFIX_DASH_ "gtest-"
00314 #define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
00315 #define GTEST_NAME_ "Google Test"
00316 #define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
00317
00318
00319 #ifdef __GNUC__
00320
00321 # define GTEST_GCC_VER_ \
00322 (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
00323 #endif // __GNUC__
00324
00325
00326 #ifdef __CYGWIN__
00327 # define GTEST_OS_CYGWIN 1
00328 #elif defined __SYMBIAN32__
00329 # define GTEST_OS_SYMBIAN 1
00330 #elif defined _WIN32
00331 # define GTEST_OS_WINDOWS 1
00332 # ifdef _WIN32_WCE
00333 # define GTEST_OS_WINDOWS_MOBILE 1
00334 # elif defined(__MINGW__) || defined(__MINGW32__)
00335 # define GTEST_OS_WINDOWS_MINGW 1
00336 # else
00337 # define GTEST_OS_WINDOWS_DESKTOP 1
00338 # endif // _WIN32_WCE
00339 #elif defined __APPLE__
00340 # define GTEST_OS_MAC 1
00341 # if TARGET_OS_IPHONE
00342 # define GTEST_OS_IOS 1
00343 # if TARGET_IPHONE_SIMULATOR
00344 # define GTEST_OS_IOS_SIMULATOR 1
00345 # endif
00346 # endif
00347 #elif defined __linux__
00348 # define GTEST_OS_LINUX 1
00349 # if defined __ANDROID__
00350 # define GTEST_OS_LINUX_ANDROID 1
00351 # endif
00352 #elif defined __MVS__
00353 # define GTEST_OS_ZOS 1
00354 #elif defined(__sun) && defined(__SVR4)
00355 # define GTEST_OS_SOLARIS 1
00356 #elif defined(_AIX)
00357 # define GTEST_OS_AIX 1
00358 #elif defined(__hpux)
00359 # define GTEST_OS_HPUX 1
00360 #elif defined __native_client__
00361 # define GTEST_OS_NACL 1
00362 #elif defined __OpenBSD__
00363 # define GTEST_OS_OPENBSD 1
00364 #elif defined __QNX__
00365 # define GTEST_OS_QNX 1
00366 #endif // __CYGWIN__
00367
00368 #ifndef GTEST_LANG_CXX11
00369
00370
00371
00372
00373 # if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
00374
00375 # define GTEST_LANG_CXX11 1
00376 # else
00377 # define GTEST_LANG_CXX11 0
00378 # endif
00379 #endif
00380
00381
00382
00383
00384 #if !GTEST_OS_WINDOWS
00385
00386
00387
00388 # include <unistd.h>
00389 # include <strings.h>
00390 #elif !GTEST_OS_WINDOWS_MOBILE
00391 # include <direct.h>
00392 # include <io.h>
00393 #endif
00394
00395 #if GTEST_OS_LINUX_ANDROID
00396
00397 # include <android/api-level.h>
00398 #endif
00399
00400
00401 #ifndef GTEST_HAS_POSIX_RE
00402 # if GTEST_OS_LINUX_ANDROID
00403
00404 # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
00405 # else
00406 # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
00407 # endif
00408 #endif
00409
00410 #if GTEST_HAS_POSIX_RE
00411
00412
00413
00414
00415
00416 # include <regex.h>
00417
00418 # define GTEST_USES_POSIX_RE 1
00419
00420 #elif GTEST_OS_WINDOWS
00421
00422
00423
00424 # define GTEST_USES_SIMPLE_RE 1
00425
00426 #else
00427
00428
00429
00430 # define GTEST_USES_SIMPLE_RE 1
00431
00432 #endif // GTEST_HAS_POSIX_RE
00433
00434 #ifndef GTEST_HAS_EXCEPTIONS
00435
00436
00437 # if defined(_MSC_VER) || defined(__BORLANDC__)
00438
00439
00440
00441 # ifndef _HAS_EXCEPTIONS
00442 # define _HAS_EXCEPTIONS 1
00443 # endif // _HAS_EXCEPTIONS
00444 # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
00445 # elif defined(__GNUC__) && __EXCEPTIONS
00446
00447 # define GTEST_HAS_EXCEPTIONS 1
00448 # elif defined(__SUNPRO_CC)
00449
00450
00451
00452 # define GTEST_HAS_EXCEPTIONS 1
00453 # elif defined(__IBMCPP__) && __EXCEPTIONS
00454
00455 # define GTEST_HAS_EXCEPTIONS 1
00456 # elif defined(__HP_aCC)
00457
00458
00459 # define GTEST_HAS_EXCEPTIONS 1
00460 # else
00461
00462
00463 # define GTEST_HAS_EXCEPTIONS 0
00464 # endif // defined(_MSC_VER) || defined(__BORLANDC__)
00465 #endif // GTEST_HAS_EXCEPTIONS
00466
00467 #if !defined(GTEST_HAS_STD_STRING)
00468
00469
00470 # define GTEST_HAS_STD_STRING 1
00471 #elif !GTEST_HAS_STD_STRING
00472
00473 # error "Google Test cannot be used where ::std::string isn't available."
00474 #endif // !defined(GTEST_HAS_STD_STRING)
00475
00476 #ifndef GTEST_HAS_GLOBAL_STRING
00477
00478
00479
00480 # define GTEST_HAS_GLOBAL_STRING 0
00481
00482 #endif // GTEST_HAS_GLOBAL_STRING
00483
00484 #ifndef GTEST_HAS_STD_WSTRING
00485
00486
00487
00488
00489
00490
00491
00492
00493 # define GTEST_HAS_STD_WSTRING \
00494 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
00495
00496 #endif // GTEST_HAS_STD_WSTRING
00497
00498 #ifndef GTEST_HAS_GLOBAL_WSTRING
00499
00500
00501 # define GTEST_HAS_GLOBAL_WSTRING \
00502 (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
00503 #endif // GTEST_HAS_GLOBAL_WSTRING
00504
00505
00506 #ifndef GTEST_HAS_RTTI
00507
00508
00509
00510 # ifdef _MSC_VER
00511
00512 # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
00513 # define GTEST_HAS_RTTI 1
00514 # else
00515 # define GTEST_HAS_RTTI 0
00516 # endif
00517
00518
00519 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
00520
00521 # ifdef __GXX_RTTI
00522
00523
00524
00525
00526 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
00527 !defined(__EXCEPTIONS)
00528 # define GTEST_HAS_RTTI 0
00529 # else
00530 # define GTEST_HAS_RTTI 1
00531 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
00532 # else
00533 # define GTEST_HAS_RTTI 0
00534 # endif // __GXX_RTTI
00535
00536
00537
00538
00539 # elif defined(__clang__)
00540
00541 # define GTEST_HAS_RTTI __has_feature(cxx_rtti)
00542
00543
00544
00545 # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
00546
00547 # ifdef __RTTI_ALL__
00548 # define GTEST_HAS_RTTI 1
00549 # else
00550 # define GTEST_HAS_RTTI 0
00551 # endif
00552
00553 # else
00554
00555
00556 # define GTEST_HAS_RTTI 1
00557
00558 # endif // _MSC_VER
00559
00560 #endif // GTEST_HAS_RTTI
00561
00562
00563
00564 #if GTEST_HAS_RTTI
00565 # include <typeinfo>
00566 #endif
00567
00568
00569 #ifndef GTEST_HAS_PTHREAD
00570
00571
00572
00573
00574
00575 # define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
00576 || GTEST_OS_QNX)
00577 #endif // GTEST_HAS_PTHREAD
00578
00579 #if GTEST_HAS_PTHREAD
00580
00581
00582 # include <pthread.h>
00583
00584
00585 # include <time.h>
00586 #endif
00587
00588
00589
00590
00591 #ifndef GTEST_HAS_TR1_TUPLE
00592 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
00593
00594 # define GTEST_HAS_TR1_TUPLE 0
00595 # else
00596
00597 # define GTEST_HAS_TR1_TUPLE 1
00598 # endif
00599 #endif // GTEST_HAS_TR1_TUPLE
00600
00601
00602
00603 #ifndef GTEST_USE_OWN_TR1_TUPLE
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616 # if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
00617 && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
00618 # define GTEST_ENV_HAS_TR1_TUPLE_ 1
00619 # endif
00620
00621
00622
00623
00624 # if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
00625 # define GTEST_ENV_HAS_STD_TUPLE_ 1
00626 # endif
00627
00628 # if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
00629 # define GTEST_USE_OWN_TR1_TUPLE 0
00630 # else
00631 # define GTEST_USE_OWN_TR1_TUPLE 1
00632 # endif
00633
00634 #endif // GTEST_USE_OWN_TR1_TUPLE
00635
00636
00637
00638
00639 #if GTEST_HAS_TR1_TUPLE
00640
00641 # if GTEST_USE_OWN_TR1_TUPLE
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
00680 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
00681
00682 #include <utility>
00683
00684
00685
00686
00687
00688
00689 #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
00690 # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
00691 #else
00692 # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
00693 template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
00694 private:
00695 #endif
00696
00697
00698 #define GTEST_0_TUPLE_(T) tuple<>
00699 #define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
00700 void, void, void>
00701 #define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
00702 void, void, void>
00703 #define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
00704 void, void, void>
00705 #define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
00706 void, void, void>
00707 #define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
00708 void, void, void>
00709 #define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
00710 void, void, void>
00711 #define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
00712 void, void, void>
00713 #define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
00714 T##7, void, void>
00715 #define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
00716 T##7, T##8, void>
00717 #define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
00718 T##7, T##8, T##9>
00719
00720
00721 #define GTEST_0_TYPENAMES_(T)
00722 #define GTEST_1_TYPENAMES_(T) typename T##0
00723 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
00724 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
00725 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00726 typename T##3
00727 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00728 typename T##3, typename T##4
00729 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00730 typename T##3, typename T##4, typename T##5
00731 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00732 typename T##3, typename T##4, typename T##5, typename T##6
00733 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00734 typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
00735 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00736 typename T##3, typename T##4, typename T##5, typename T##6, \
00737 typename T##7, typename T##8
00738 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
00739 typename T##3, typename T##4, typename T##5, typename T##6, \
00740 typename T##7, typename T##8, typename T##9
00741
00742
00743
00744
00745 namespace std {
00746 namespace tr1 {
00747
00748 template <typename T0 = void, typename T1 = void, typename T2 = void,
00749 typename T3 = void, typename T4 = void, typename T5 = void,
00750 typename T6 = void, typename T7 = void, typename T8 = void,
00751 typename T9 = void>
00752 class tuple;
00753
00754
00755
00756 namespace gtest_internal {
00757
00758
00759 template <typename T>
00760 struct ByRef { typedef const T& type; };
00761 template <typename T>
00762 struct ByRef<T&> { typedef T& type; };
00763
00764
00765 #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
00766
00767
00768
00769 template <typename T>
00770 struct AddRef { typedef T& type; };
00771 template <typename T>
00772 struct AddRef<T&> { typedef T& type; };
00773
00774
00775 #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
00776
00777
00778 template <int k> class Get;
00779
00780
00781
00782 template <bool kIndexValid, int kIndex, class Tuple>
00783 struct TupleElement;
00784
00785 template <GTEST_10_TYPENAMES_(T)>
00786 struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
00787 typedef T0 type;
00788 };
00789
00790 template <GTEST_10_TYPENAMES_(T)>
00791 struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
00792 typedef T1 type;
00793 };
00794
00795 template <GTEST_10_TYPENAMES_(T)>
00796 struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
00797 typedef T2 type;
00798 };
00799
00800 template <GTEST_10_TYPENAMES_(T)>
00801 struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
00802 typedef T3 type;
00803 };
00804
00805 template <GTEST_10_TYPENAMES_(T)>
00806 struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
00807 typedef T4 type;
00808 };
00809
00810 template <GTEST_10_TYPENAMES_(T)>
00811 struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
00812 typedef T5 type;
00813 };
00814
00815 template <GTEST_10_TYPENAMES_(T)>
00816 struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
00817 typedef T6 type;
00818 };
00819
00820 template <GTEST_10_TYPENAMES_(T)>
00821 struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
00822 typedef T7 type;
00823 };
00824
00825 template <GTEST_10_TYPENAMES_(T)>
00826 struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
00827 typedef T8 type;
00828 };
00829
00830 template <GTEST_10_TYPENAMES_(T)>
00831 struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
00832 typedef T9 type;
00833 };
00834
00835 }
00836
00837 template <>
00838 class tuple<> {
00839 public:
00840 tuple() {}
00841 tuple(const tuple& ) {}
00842 tuple& operator=(const tuple& ) { return *this; }
00843 };
00844
00845 template <GTEST_1_TYPENAMES_(T)>
00846 class GTEST_1_TUPLE_(T) {
00847 public:
00848 template <int k> friend class gtest_internal::Get;
00849
00850 tuple() : f0_() {}
00851
00852 explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
00853
00854 tuple(const tuple& t) : f0_(t.f0_) {}
00855
00856 template <GTEST_1_TYPENAMES_(U)>
00857 tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
00858
00859 tuple& operator=(const tuple& t) { return CopyFrom(t); }
00860
00861 template <GTEST_1_TYPENAMES_(U)>
00862 tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
00863 return CopyFrom(t);
00864 }
00865
00866 GTEST_DECLARE_TUPLE_AS_FRIEND_
00867
00868 template <GTEST_1_TYPENAMES_(U)>
00869 tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
00870 f0_ = t.f0_;
00871 return *this;
00872 }
00873
00874 T0 f0_;
00875 };
00876
00877 template <GTEST_2_TYPENAMES_(T)>
00878 class GTEST_2_TUPLE_(T) {
00879 public:
00880 template <int k> friend class gtest_internal::Get;
00881
00882 tuple() : f0_(), f1_() {}
00883
00884 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
00885 f1_(f1) {}
00886
00887 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
00888
00889 template <GTEST_2_TYPENAMES_(U)>
00890 tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
00891 template <typename U0, typename U1>
00892 tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
00893
00894 tuple& operator=(const tuple& t) { return CopyFrom(t); }
00895
00896 template <GTEST_2_TYPENAMES_(U)>
00897 tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
00898 return CopyFrom(t);
00899 }
00900 template <typename U0, typename U1>
00901 tuple& operator=(const ::std::pair<U0, U1>& p) {
00902 f0_ = p.first;
00903 f1_ = p.second;
00904 return *this;
00905 }
00906
00907 GTEST_DECLARE_TUPLE_AS_FRIEND_
00908
00909 template <GTEST_2_TYPENAMES_(U)>
00910 tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
00911 f0_ = t.f0_;
00912 f1_ = t.f1_;
00913 return *this;
00914 }
00915
00916 T0 f0_;
00917 T1 f1_;
00918 };
00919
00920 template <GTEST_3_TYPENAMES_(T)>
00921 class GTEST_3_TUPLE_(T) {
00922 public:
00923 template <int k> friend class gtest_internal::Get;
00924
00925 tuple() : f0_(), f1_(), f2_() {}
00926
00927 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
00928 GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
00929
00930 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
00931
00932 template <GTEST_3_TYPENAMES_(U)>
00933 tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
00934
00935 tuple& operator=(const tuple& t) { return CopyFrom(t); }
00936
00937 template <GTEST_3_TYPENAMES_(U)>
00938 tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
00939 return CopyFrom(t);
00940 }
00941
00942 GTEST_DECLARE_TUPLE_AS_FRIEND_
00943
00944 template <GTEST_3_TYPENAMES_(U)>
00945 tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
00946 f0_ = t.f0_;
00947 f1_ = t.f1_;
00948 f2_ = t.f2_;
00949 return *this;
00950 }
00951
00952 T0 f0_;
00953 T1 f1_;
00954 T2 f2_;
00955 };
00956
00957 template <GTEST_4_TYPENAMES_(T)>
00958 class GTEST_4_TUPLE_(T) {
00959 public:
00960 template <int k> friend class gtest_internal::Get;
00961
00962 tuple() : f0_(), f1_(), f2_(), f3_() {}
00963
00964 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
00965 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
00966 f3_(f3) {}
00967
00968 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
00969
00970 template <GTEST_4_TYPENAMES_(U)>
00971 tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
00972 f3_(t.f3_) {}
00973
00974 tuple& operator=(const tuple& t) { return CopyFrom(t); }
00975
00976 template <GTEST_4_TYPENAMES_(U)>
00977 tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
00978 return CopyFrom(t);
00979 }
00980
00981 GTEST_DECLARE_TUPLE_AS_FRIEND_
00982
00983 template <GTEST_4_TYPENAMES_(U)>
00984 tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
00985 f0_ = t.f0_;
00986 f1_ = t.f1_;
00987 f2_ = t.f2_;
00988 f3_ = t.f3_;
00989 return *this;
00990 }
00991
00992 T0 f0_;
00993 T1 f1_;
00994 T2 f2_;
00995 T3 f3_;
00996 };
00997
00998 template <GTEST_5_TYPENAMES_(T)>
00999 class GTEST_5_TUPLE_(T) {
01000 public:
01001 template <int k> friend class gtest_internal::Get;
01002
01003 tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
01004
01005 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
01006 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
01007 GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
01008
01009 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
01010 f4_(t.f4_) {}
01011
01012 template <GTEST_5_TYPENAMES_(U)>
01013 tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
01014 f3_(t.f3_), f4_(t.f4_) {}
01015
01016 tuple& operator=(const tuple& t) { return CopyFrom(t); }
01017
01018 template <GTEST_5_TYPENAMES_(U)>
01019 tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
01020 return CopyFrom(t);
01021 }
01022
01023 GTEST_DECLARE_TUPLE_AS_FRIEND_
01024
01025 template <GTEST_5_TYPENAMES_(U)>
01026 tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
01027 f0_ = t.f0_;
01028 f1_ = t.f1_;
01029 f2_ = t.f2_;
01030 f3_ = t.f3_;
01031 f4_ = t.f4_;
01032 return *this;
01033 }
01034
01035 T0 f0_;
01036 T1 f1_;
01037 T2 f2_;
01038 T3 f3_;
01039 T4 f4_;
01040 };
01041
01042 template <GTEST_6_TYPENAMES_(T)>
01043 class GTEST_6_TUPLE_(T) {
01044 public:
01045 template <int k> friend class gtest_internal::Get;
01046
01047 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
01048
01049 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
01050 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
01051 GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
01052 f5_(f5) {}
01053
01054 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
01055 f4_(t.f4_), f5_(t.f5_) {}
01056
01057 template <GTEST_6_TYPENAMES_(U)>
01058 tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
01059 f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
01060
01061 tuple& operator=(const tuple& t) { return CopyFrom(t); }
01062
01063 template <GTEST_6_TYPENAMES_(U)>
01064 tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
01065 return CopyFrom(t);
01066 }
01067
01068 GTEST_DECLARE_TUPLE_AS_FRIEND_
01069
01070 template <GTEST_6_TYPENAMES_(U)>
01071 tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
01072 f0_ = t.f0_;
01073 f1_ = t.f1_;
01074 f2_ = t.f2_;
01075 f3_ = t.f3_;
01076 f4_ = t.f4_;
01077 f5_ = t.f5_;
01078 return *this;
01079 }
01080
01081 T0 f0_;
01082 T1 f1_;
01083 T2 f2_;
01084 T3 f3_;
01085 T4 f4_;
01086 T5 f5_;
01087 };
01088
01089 template <GTEST_7_TYPENAMES_(T)>
01090 class GTEST_7_TUPLE_(T) {
01091 public:
01092 template <int k> friend class gtest_internal::Get;
01093
01094 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
01095
01096 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
01097 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
01098 GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
01099 f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
01100
01101 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
01102 f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
01103
01104 template <GTEST_7_TYPENAMES_(U)>
01105 tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
01106 f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
01107
01108 tuple& operator=(const tuple& t) { return CopyFrom(t); }
01109
01110 template <GTEST_7_TYPENAMES_(U)>
01111 tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
01112 return CopyFrom(t);
01113 }
01114
01115 GTEST_DECLARE_TUPLE_AS_FRIEND_
01116
01117 template <GTEST_7_TYPENAMES_(U)>
01118 tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
01119 f0_ = t.f0_;
01120 f1_ = t.f1_;
01121 f2_ = t.f2_;
01122 f3_ = t.f3_;
01123 f4_ = t.f4_;
01124 f5_ = t.f5_;
01125 f6_ = t.f6_;
01126 return *this;
01127 }
01128
01129 T0 f0_;
01130 T1 f1_;
01131 T2 f2_;
01132 T3 f3_;
01133 T4 f4_;
01134 T5 f5_;
01135 T6 f6_;
01136 };
01137
01138 template <GTEST_8_TYPENAMES_(T)>
01139 class GTEST_8_TUPLE_(T) {
01140 public:
01141 template <int k> friend class gtest_internal::Get;
01142
01143 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
01144
01145 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
01146 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
01147 GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
01148 GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
01149 f5_(f5), f6_(f6), f7_(f7) {}
01150
01151 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
01152 f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
01153
01154 template <GTEST_8_TYPENAMES_(U)>
01155 tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
01156 f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
01157
01158 tuple& operator=(const tuple& t) { return CopyFrom(t); }
01159
01160 template <GTEST_8_TYPENAMES_(U)>
01161 tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
01162 return CopyFrom(t);
01163 }
01164
01165 GTEST_DECLARE_TUPLE_AS_FRIEND_
01166
01167 template <GTEST_8_TYPENAMES_(U)>
01168 tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
01169 f0_ = t.f0_;
01170 f1_ = t.f1_;
01171 f2_ = t.f2_;
01172 f3_ = t.f3_;
01173 f4_ = t.f4_;
01174 f5_ = t.f5_;
01175 f6_ = t.f6_;
01176 f7_ = t.f7_;
01177 return *this;
01178 }
01179
01180 T0 f0_;
01181 T1 f1_;
01182 T2 f2_;
01183 T3 f3_;
01184 T4 f4_;
01185 T5 f5_;
01186 T6 f6_;
01187 T7 f7_;
01188 };
01189
01190 template <GTEST_9_TYPENAMES_(T)>
01191 class GTEST_9_TUPLE_(T) {
01192 public:
01193 template <int k> friend class gtest_internal::Get;
01194
01195 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
01196
01197 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
01198 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
01199 GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
01200 GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
01201 f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
01202
01203 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
01204 f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
01205
01206 template <GTEST_9_TYPENAMES_(U)>
01207 tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
01208 f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
01209
01210 tuple& operator=(const tuple& t) { return CopyFrom(t); }
01211
01212 template <GTEST_9_TYPENAMES_(U)>
01213 tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
01214 return CopyFrom(t);
01215 }
01216
01217 GTEST_DECLARE_TUPLE_AS_FRIEND_
01218
01219 template <GTEST_9_TYPENAMES_(U)>
01220 tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
01221 f0_ = t.f0_;
01222 f1_ = t.f1_;
01223 f2_ = t.f2_;
01224 f3_ = t.f3_;
01225 f4_ = t.f4_;
01226 f5_ = t.f5_;
01227 f6_ = t.f6_;
01228 f7_ = t.f7_;
01229 f8_ = t.f8_;
01230 return *this;
01231 }
01232
01233 T0 f0_;
01234 T1 f1_;
01235 T2 f2_;
01236 T3 f3_;
01237 T4 f4_;
01238 T5 f5_;
01239 T6 f6_;
01240 T7 f7_;
01241 T8 f8_;
01242 };
01243
01244 template <GTEST_10_TYPENAMES_(T)>
01245 class tuple {
01246 public:
01247 template <int k> friend class gtest_internal::Get;
01248
01249 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
01250 f9_() {}
01251
01252 explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
01253 GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
01254 GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
01255 GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
01256 f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
01257
01258 tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
01259 f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
01260
01261 template <GTEST_10_TYPENAMES_(U)>
01262 tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
01263 f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
01264 f9_(t.f9_) {}
01265
01266 tuple& operator=(const tuple& t) { return CopyFrom(t); }
01267
01268 template <GTEST_10_TYPENAMES_(U)>
01269 tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
01270 return CopyFrom(t);
01271 }
01272
01273 GTEST_DECLARE_TUPLE_AS_FRIEND_
01274
01275 template <GTEST_10_TYPENAMES_(U)>
01276 tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
01277 f0_ = t.f0_;
01278 f1_ = t.f1_;
01279 f2_ = t.f2_;
01280 f3_ = t.f3_;
01281 f4_ = t.f4_;
01282 f5_ = t.f5_;
01283 f6_ = t.f6_;
01284 f7_ = t.f7_;
01285 f8_ = t.f8_;
01286 f9_ = t.f9_;
01287 return *this;
01288 }
01289
01290 T0 f0_;
01291 T1 f1_;
01292 T2 f2_;
01293 T3 f3_;
01294 T4 f4_;
01295 T5 f5_;
01296 T6 f6_;
01297 T7 f7_;
01298 T8 f8_;
01299 T9 f9_;
01300 };
01301
01302
01303
01304
01305
01306
01307
01308 inline tuple<> make_tuple() { return tuple<>(); }
01309
01310 template <GTEST_1_TYPENAMES_(T)>
01311 inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
01312 return GTEST_1_TUPLE_(T)(f0);
01313 }
01314
01315 template <GTEST_2_TYPENAMES_(T)>
01316 inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
01317 return GTEST_2_TUPLE_(T)(f0, f1);
01318 }
01319
01320 template <GTEST_3_TYPENAMES_(T)>
01321 inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
01322 return GTEST_3_TUPLE_(T)(f0, f1, f2);
01323 }
01324
01325 template <GTEST_4_TYPENAMES_(T)>
01326 inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01327 const T3& f3) {
01328 return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
01329 }
01330
01331 template <GTEST_5_TYPENAMES_(T)>
01332 inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01333 const T3& f3, const T4& f4) {
01334 return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
01335 }
01336
01337 template <GTEST_6_TYPENAMES_(T)>
01338 inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01339 const T3& f3, const T4& f4, const T5& f5) {
01340 return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
01341 }
01342
01343 template <GTEST_7_TYPENAMES_(T)>
01344 inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01345 const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
01346 return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
01347 }
01348
01349 template <GTEST_8_TYPENAMES_(T)>
01350 inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01351 const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
01352 return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
01353 }
01354
01355 template <GTEST_9_TYPENAMES_(T)>
01356 inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01357 const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
01358 const T8& f8) {
01359 return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
01360 }
01361
01362 template <GTEST_10_TYPENAMES_(T)>
01363 inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
01364 const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
01365 const T8& f8, const T9& f9) {
01366 return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
01367 }
01368
01369
01370
01371 template <typename Tuple> struct tuple_size;
01372
01373 template <GTEST_0_TYPENAMES_(T)>
01374 struct tuple_size<GTEST_0_TUPLE_(T) > {
01375 static const int value = 0;
01376 };
01377
01378 template <GTEST_1_TYPENAMES_(T)>
01379 struct tuple_size<GTEST_1_TUPLE_(T) > {
01380 static const int value = 1;
01381 };
01382
01383 template <GTEST_2_TYPENAMES_(T)>
01384 struct tuple_size<GTEST_2_TUPLE_(T) > {
01385 static const int value = 2;
01386 };
01387
01388 template <GTEST_3_TYPENAMES_(T)>
01389 struct tuple_size<GTEST_3_TUPLE_(T) > {
01390 static const int value = 3;
01391 };
01392
01393 template <GTEST_4_TYPENAMES_(T)>
01394 struct tuple_size<GTEST_4_TUPLE_(T) > {
01395 static const int value = 4;
01396 };
01397
01398 template <GTEST_5_TYPENAMES_(T)>
01399 struct tuple_size<GTEST_5_TUPLE_(T) > {
01400 static const int value = 5;
01401 };
01402
01403 template <GTEST_6_TYPENAMES_(T)>
01404 struct tuple_size<GTEST_6_TUPLE_(T) > {
01405 static const int value = 6;
01406 };
01407
01408 template <GTEST_7_TYPENAMES_(T)>
01409 struct tuple_size<GTEST_7_TUPLE_(T) > {
01410 static const int value = 7;
01411 };
01412
01413 template <GTEST_8_TYPENAMES_(T)>
01414 struct tuple_size<GTEST_8_TUPLE_(T) > {
01415 static const int value = 8;
01416 };
01417
01418 template <GTEST_9_TYPENAMES_(T)>
01419 struct tuple_size<GTEST_9_TUPLE_(T) > {
01420 static const int value = 9;
01421 };
01422
01423 template <GTEST_10_TYPENAMES_(T)>
01424 struct tuple_size<GTEST_10_TUPLE_(T) > {
01425 static const int value = 10;
01426 };
01427
01428 template <int k, class Tuple>
01429 struct tuple_element {
01430 typedef typename gtest_internal::TupleElement<
01431 k < (tuple_size<Tuple>::value), k, Tuple>::type type;
01432 };
01433
01434 #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
01435
01436
01437
01438 namespace gtest_internal {
01439
01440 template <>
01441 class Get<0> {
01442 public:
01443 template <class Tuple>
01444 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
01445 Field(Tuple& t) { return t.f0_; }
01446
01447 template <class Tuple>
01448 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
01449 ConstField(const Tuple& t) { return t.f0_; }
01450 };
01451
01452 template <>
01453 class Get<1> {
01454 public:
01455 template <class Tuple>
01456 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
01457 Field(Tuple& t) { return t.f1_; }
01458
01459 template <class Tuple>
01460 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
01461 ConstField(const Tuple& t) { return t.f1_; }
01462 };
01463
01464 template <>
01465 class Get<2> {
01466 public:
01467 template <class Tuple>
01468 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
01469 Field(Tuple& t) { return t.f2_; }
01470
01471 template <class Tuple>
01472 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
01473 ConstField(const Tuple& t) { return t.f2_; }
01474 };
01475
01476 template <>
01477 class Get<3> {
01478 public:
01479 template <class Tuple>
01480 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
01481 Field(Tuple& t) { return t.f3_; }
01482
01483 template <class Tuple>
01484 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
01485 ConstField(const Tuple& t) { return t.f3_; }
01486 };
01487
01488 template <>
01489 class Get<4> {
01490 public:
01491 template <class Tuple>
01492 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
01493 Field(Tuple& t) { return t.f4_; }
01494
01495 template <class Tuple>
01496 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
01497 ConstField(const Tuple& t) { return t.f4_; }
01498 };
01499
01500 template <>
01501 class Get<5> {
01502 public:
01503 template <class Tuple>
01504 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
01505 Field(Tuple& t) { return t.f5_; }
01506
01507 template <class Tuple>
01508 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
01509 ConstField(const Tuple& t) { return t.f5_; }
01510 };
01511
01512 template <>
01513 class Get<6> {
01514 public:
01515 template <class Tuple>
01516 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
01517 Field(Tuple& t) { return t.f6_; }
01518
01519 template <class Tuple>
01520 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
01521 ConstField(const Tuple& t) { return t.f6_; }
01522 };
01523
01524 template <>
01525 class Get<7> {
01526 public:
01527 template <class Tuple>
01528 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
01529 Field(Tuple& t) { return t.f7_; }
01530
01531 template <class Tuple>
01532 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
01533 ConstField(const Tuple& t) { return t.f7_; }
01534 };
01535
01536 template <>
01537 class Get<8> {
01538 public:
01539 template <class Tuple>
01540 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
01541 Field(Tuple& t) { return t.f8_; }
01542
01543 template <class Tuple>
01544 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
01545 ConstField(const Tuple& t) { return t.f8_; }
01546 };
01547
01548 template <>
01549 class Get<9> {
01550 public:
01551 template <class Tuple>
01552 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
01553 Field(Tuple& t) { return t.f9_; }
01554
01555 template <class Tuple>
01556 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
01557 ConstField(const Tuple& t) { return t.f9_; }
01558 };
01559
01560 }
01561
01562 template <int k, GTEST_10_TYPENAMES_(T)>
01563 GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
01564 get(GTEST_10_TUPLE_(T)& t) {
01565 return gtest_internal::Get<k>::Field(t);
01566 }
01567
01568 template <int k, GTEST_10_TYPENAMES_(T)>
01569 GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
01570 get(const GTEST_10_TUPLE_(T)& t) {
01571 return gtest_internal::Get<k>::ConstField(t);
01572 }
01573
01574
01575
01576
01577
01578 namespace gtest_internal {
01579
01580
01581
01582
01583
01584 template <int kSize1, int kSize2>
01585 struct SameSizeTuplePrefixComparator;
01586
01587 template <>
01588 struct SameSizeTuplePrefixComparator<0, 0> {
01589 template <class Tuple1, class Tuple2>
01590 static bool Eq(const Tuple1& , const Tuple2& ) {
01591 return true;
01592 }
01593 };
01594
01595 template <int k>
01596 struct SameSizeTuplePrefixComparator<k, k> {
01597 template <class Tuple1, class Tuple2>
01598 static bool Eq(const Tuple1& t1, const Tuple2& t2) {
01599 return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
01600 ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
01601 }
01602 };
01603
01604 }
01605
01606 template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
01607 inline bool operator==(const GTEST_10_TUPLE_(T)& t,
01608 const GTEST_10_TUPLE_(U)& u) {
01609 return gtest_internal::SameSizeTuplePrefixComparator<
01610 tuple_size<GTEST_10_TUPLE_(T) >::value,
01611 tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
01612 }
01613
01614 template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
01615 inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
01616 const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
01617
01618
01619
01620
01621 }
01622 }
01623
01624 #undef GTEST_0_TUPLE_
01625 #undef GTEST_1_TUPLE_
01626 #undef GTEST_2_TUPLE_
01627 #undef GTEST_3_TUPLE_
01628 #undef GTEST_4_TUPLE_
01629 #undef GTEST_5_TUPLE_
01630 #undef GTEST_6_TUPLE_
01631 #undef GTEST_7_TUPLE_
01632 #undef GTEST_8_TUPLE_
01633 #undef GTEST_9_TUPLE_
01634 #undef GTEST_10_TUPLE_
01635
01636 #undef GTEST_0_TYPENAMES_
01637 #undef GTEST_1_TYPENAMES_
01638 #undef GTEST_2_TYPENAMES_
01639 #undef GTEST_3_TYPENAMES_
01640 #undef GTEST_4_TYPENAMES_
01641 #undef GTEST_5_TYPENAMES_
01642 #undef GTEST_6_TYPENAMES_
01643 #undef GTEST_7_TYPENAMES_
01644 #undef GTEST_8_TYPENAMES_
01645 #undef GTEST_9_TYPENAMES_
01646 #undef GTEST_10_TYPENAMES_
01647
01648 #undef GTEST_DECLARE_TUPLE_AS_FRIEND_
01649 #undef GTEST_BY_REF_
01650 #undef GTEST_ADD_REF_
01651 #undef GTEST_TUPLE_ELEMENT_
01652
01653 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
01654 # elif GTEST_ENV_HAS_STD_TUPLE_
01655 # include <tuple>
01656
01657
01658
01659
01660 namespace std {
01661 namespace tr1 {
01662 using ::std::get;
01663 using ::std::make_tuple;
01664 using ::std::tuple;
01665 using ::std::tuple_element;
01666 using ::std::tuple_size;
01667 }
01668 }
01669
01670 # elif GTEST_OS_SYMBIAN
01671
01672
01673
01674
01675
01676
01677 # ifdef BOOST_HAS_TR1_TUPLE
01678 # undef BOOST_HAS_TR1_TUPLE
01679 # endif // BOOST_HAS_TR1_TUPLE
01680
01681
01682
01683 # define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
01684 # include <tuple>
01685
01686 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
01687
01688
01689
01690 # if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
01691
01692
01693
01694
01695
01696 # define _TR1_FUNCTIONAL 1
01697 # include <tr1/tuple>
01698 # undef _TR1_FUNCTIONAL // Allows the user to #include
01699
01700 # else
01701 # include <tr1/tuple>
01702 # endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
01703
01704 # else
01705
01706
01707 # include <tuple>
01708 # endif // GTEST_USE_OWN_TR1_TUPLE
01709
01710 #endif // GTEST_HAS_TR1_TUPLE
01711
01712
01713
01714
01715
01716 #ifndef GTEST_HAS_CLONE
01717
01718
01719 # if GTEST_OS_LINUX && !defined(__ia64__)
01720 # if GTEST_OS_LINUX_ANDROID
01721
01722 # if defined(__arm__) && __ANDROID_API__ >= 9
01723 # define GTEST_HAS_CLONE 1
01724 # else
01725 # define GTEST_HAS_CLONE 0
01726 # endif
01727 # else
01728 # define GTEST_HAS_CLONE 1
01729 # endif
01730 # else
01731 # define GTEST_HAS_CLONE 0
01732 # endif // GTEST_OS_LINUX && !defined(__ia64__)
01733
01734 #endif // GTEST_HAS_CLONE
01735
01736
01737
01738 #ifndef GTEST_HAS_STREAM_REDIRECTION
01739
01740
01741 # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
01742 # define GTEST_HAS_STREAM_REDIRECTION 0
01743 # else
01744 # define GTEST_HAS_STREAM_REDIRECTION 1
01745 # endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
01746 #endif // GTEST_HAS_STREAM_REDIRECTION
01747
01748
01749
01750
01751
01752 #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
01753 (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
01754 (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
01755 GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
01756 GTEST_OS_OPENBSD || GTEST_OS_QNX)
01757 # define GTEST_HAS_DEATH_TEST 1
01758 # include <vector>
01759 #endif
01760
01761
01762
01763
01764 #define GTEST_HAS_PARAM_TEST 1
01765
01766
01767
01768
01769
01770 #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
01771 defined(__IBMCPP__) || defined(__HP_aCC)
01772 # define GTEST_HAS_TYPED_TEST 1
01773 # define GTEST_HAS_TYPED_TEST_P 1
01774 #endif
01775
01776
01777
01778
01779
01780 #if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
01781 # define GTEST_HAS_COMBINE 1
01782 #endif
01783
01784
01785 #define GTEST_WIDE_STRING_USES_UTF16_ \
01786 (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
01787
01788
01789 #if GTEST_OS_LINUX
01790 # define GTEST_CAN_STREAM_RESULTS_ 1
01791 #endif
01792
01793
01794
01795
01796
01797
01798
01799
01800
01801
01802
01803 #ifdef __INTEL_COMPILER
01804 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_
01805 #else
01806 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
01807 #endif
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819
01820 #if defined(__GNUC__) && !defined(COMPILER_ICC)
01821 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
01822 #else
01823 # define GTEST_ATTRIBUTE_UNUSED_
01824 #endif
01825
01826
01827
01828 #define GTEST_DISALLOW_ASSIGN_(type)\
01829 void operator=(type const &)
01830
01831
01832
01833 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
01834 type(type const &);\
01835 GTEST_DISALLOW_ASSIGN_(type)
01836
01837
01838
01839
01840
01841
01842 #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
01843 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
01844 #else
01845 # define GTEST_MUST_USE_RESULT_
01846 #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
01847
01848
01849
01850
01851 #ifndef GTEST_HAS_SEH
01852
01853
01854 # if defined(_MSC_VER) || defined(__BORLANDC__)
01855
01856 # define GTEST_HAS_SEH 1
01857 # else
01858
01859 # define GTEST_HAS_SEH 0
01860 # endif
01861
01862 #endif // GTEST_HAS_SEH
01863
01864 #ifdef _MSC_VER
01865
01866 # if GTEST_LINKED_AS_SHARED_LIBRARY
01867 # define GTEST_API_ __declspec(dllimport)
01868 # elif GTEST_CREATE_SHARED_LIBRARY
01869 # define GTEST_API_ __declspec(dllexport)
01870 # endif
01871
01872 #endif // _MSC_VER
01873
01874 #ifndef GTEST_API_
01875 # define GTEST_API_
01876 #endif
01877
01878 #ifdef __GNUC__
01879
01880 # define GTEST_NO_INLINE_ __attribute__((noinline))
01881 #else
01882 # define GTEST_NO_INLINE_
01883 #endif
01884
01885
01886 #if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
01887 # define GTEST_HAS_CXXABI_H_ 1
01888 #else
01889 # define GTEST_HAS_CXXABI_H_ 0
01890 #endif
01891
01892 namespace testing {
01893
01894 class Message;
01895
01896 namespace internal {
01897
01898
01899
01900
01901 class Secret;
01902
01903
01904
01905
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917
01918 template <bool>
01919 struct CompileAssert {
01920 };
01921
01922 #define GTEST_COMPILE_ASSERT_(expr, msg) \
01923 typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
01924 msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
01925
01926
01927
01928
01929
01930
01931
01932
01933
01934
01935
01936
01937
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961
01962
01963
01964
01965
01966
01967
01968
01969
01970 template <typename T1, typename T2>
01971 struct StaticAssertTypeEqHelper;
01972
01973 template <typename T>
01974 struct StaticAssertTypeEqHelper<T, T> {};
01975
01976 #if GTEST_HAS_GLOBAL_STRING
01977 typedef ::string string;
01978 #else
01979 typedef ::std::string string;
01980 #endif // GTEST_HAS_GLOBAL_STRING
01981
01982 #if GTEST_HAS_GLOBAL_WSTRING
01983 typedef ::wstring wstring;
01984 #elif GTEST_HAS_STD_WSTRING
01985 typedef ::std::wstring wstring;
01986 #endif // GTEST_HAS_GLOBAL_WSTRING
01987
01988
01989
01990 GTEST_API_ bool IsTrue(bool condition);
01991
01992
01993
01994
01995
01996 template <typename T>
01997 class scoped_ptr {
01998 public:
01999 typedef T element_type;
02000
02001 explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
02002 ~scoped_ptr() { reset(); }
02003
02004 T& operator*() const { return *ptr_; }
02005 T* operator->() const { return ptr_; }
02006 T* get() const { return ptr_; }
02007
02008 T* release() {
02009 T* const ptr = ptr_;
02010 ptr_ = NULL;
02011 return ptr;
02012 }
02013
02014 void reset(T* p = NULL) {
02015 if (p != ptr_) {
02016 if (IsTrue(sizeof(T) > 0)) {
02017 delete ptr_;
02018 }
02019 ptr_ = p;
02020 }
02021 }
02022
02023 private:
02024 T* ptr_;
02025
02026 GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
02027 };
02028
02029
02030
02031
02032
02033 class GTEST_API_ RE {
02034 public:
02035
02036
02037 RE(const RE& other) { Init(other.pattern()); }
02038
02039
02040 RE(const ::std::string& regex) { Init(regex.c_str()); }
02041
02042 #if GTEST_HAS_GLOBAL_STRING
02043
02044 RE(const ::string& regex) { Init(regex.c_str()); }
02045
02046 #endif // GTEST_HAS_GLOBAL_STRING
02047
02048 RE(const char* regex) { Init(regex); }
02049 ~RE();
02050
02051
02052 const char* pattern() const { return pattern_; }
02053
02054
02055
02056
02057
02058
02059
02060
02061 static bool FullMatch(const ::std::string& str, const RE& re) {
02062 return FullMatch(str.c_str(), re);
02063 }
02064 static bool PartialMatch(const ::std::string& str, const RE& re) {
02065 return PartialMatch(str.c_str(), re);
02066 }
02067
02068 #if GTEST_HAS_GLOBAL_STRING
02069
02070 static bool FullMatch(const ::string& str, const RE& re) {
02071 return FullMatch(str.c_str(), re);
02072 }
02073 static bool PartialMatch(const ::string& str, const RE& re) {
02074 return PartialMatch(str.c_str(), re);
02075 }
02076
02077 #endif // GTEST_HAS_GLOBAL_STRING
02078
02079 static bool FullMatch(const char* str, const RE& re);
02080 static bool PartialMatch(const char* str, const RE& re);
02081
02082 private:
02083 void Init(const char* regex);
02084
02085
02086
02087
02088 const char* pattern_;
02089 bool is_valid_;
02090
02091 #if GTEST_USES_POSIX_RE
02092
02093 regex_t full_regex_;
02094 regex_t partial_regex_;
02095
02096 #else // GTEST_USES_SIMPLE_RE
02097
02098 const char* full_pattern_;
02099
02100 #endif
02101
02102 GTEST_DISALLOW_ASSIGN_(RE);
02103 };
02104
02105
02106
02107 GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
02108
02109
02110
02111
02112 GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
02113 int line);
02114
02115
02116
02117
02118
02119
02120
02121 enum GTestLogSeverity {
02122 GTEST_INFO,
02123 GTEST_WARNING,
02124 GTEST_ERROR,
02125 GTEST_FATAL
02126 };
02127
02128
02129
02130
02131 class GTEST_API_ GTestLog {
02132 public:
02133 GTestLog(GTestLogSeverity severity, const char* file, int line);
02134
02135
02136 ~GTestLog();
02137
02138 ::std::ostream& GetStream() { return ::std::cerr; }
02139
02140 private:
02141 const GTestLogSeverity severity_;
02142
02143 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
02144 };
02145
02146 #define GTEST_LOG_(severity) \
02147 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
02148 __FILE__, __LINE__).GetStream()
02149
02150 inline void LogToStderr() {}
02151 inline void FlushInfoLog() { fflush(NULL); }
02152
02153
02154
02155
02156
02157
02158
02159
02160
02161
02162
02163
02164
02165
02166
02167 #define GTEST_CHECK_(condition) \
02168 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
02169 if (::testing::internal::IsTrue(condition)) \
02170 ; \
02171 else \
02172 GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
02173
02174
02175
02176
02177
02178
02179 #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
02180 if (const int gtest_error = (posix_call)) \
02181 GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
02182 << gtest_error
02183
02184
02185
02186
02187
02188
02189
02190
02191
02192
02193
02194
02195
02196
02197
02198
02199
02200
02201
02202
02203
02204 template<typename To>
02205 inline To ImplicitCast_(To x) { return x; }
02206
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228 template<typename To, typename From>
02229 inline To DownCast_(From* f) {
02230
02231
02232
02233
02234 if (false) {
02235 const To to = NULL;
02236 ::testing::internal::ImplicitCast_<From*>(to);
02237 }
02238
02239 #if GTEST_HAS_RTTI
02240
02241 GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
02242 #endif
02243 return static_cast<To>(f);
02244 }
02245
02246
02247
02248
02249
02250
02251 template <class Derived, class Base>
02252 Derived* CheckedDowncastToActualType(Base* base) {
02253 #if GTEST_HAS_RTTI
02254 GTEST_CHECK_(typeid(*base) == typeid(Derived));
02255 return dynamic_cast<Derived*>(base);
02256 #else
02257 return static_cast<Derived*>(base);
02258 #endif
02259 }
02260
02261 #if GTEST_HAS_STREAM_REDIRECTION
02262
02263
02264
02265
02266
02267
02268
02269 GTEST_API_ void CaptureStdout();
02270 GTEST_API_ std::string GetCapturedStdout();
02271 GTEST_API_ void CaptureStderr();
02272 GTEST_API_ std::string GetCapturedStderr();
02273
02274 #endif // GTEST_HAS_STREAM_REDIRECTION
02275
02276
02277 #if GTEST_HAS_DEATH_TEST
02278
02279 const ::std::vector<testing::internal::string>& GetInjectableArgvs();
02280 void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
02281 new_argvs);
02282
02283
02284 extern ::std::vector<testing::internal::string> g_argvs;
02285
02286 #endif // GTEST_HAS_DEATH_TEST
02287
02288
02289
02290 #if GTEST_HAS_PTHREAD
02291
02292
02293
02294
02295 inline void SleepMilliseconds(int n) {
02296 const timespec time = {
02297 0,
02298 n * 1000L * 1000L,
02299 };
02300 nanosleep(&time, NULL);
02301 }
02302
02303
02304
02305
02306
02307
02308
02309 class Notification {
02310 public:
02311 Notification() : notified_(false) {
02312 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
02313 }
02314 ~Notification() {
02315 pthread_mutex_destroy(&mutex_);
02316 }
02317
02318
02319
02320 void Notify() {
02321 pthread_mutex_lock(&mutex_);
02322 notified_ = true;
02323 pthread_mutex_unlock(&mutex_);
02324 }
02325
02326
02327
02328 void WaitForNotification() {
02329 for (;;) {
02330 pthread_mutex_lock(&mutex_);
02331 const bool notified = notified_;
02332 pthread_mutex_unlock(&mutex_);
02333 if (notified)
02334 break;
02335 SleepMilliseconds(10);
02336 }
02337 }
02338
02339 private:
02340 pthread_mutex_t mutex_;
02341 bool notified_;
02342
02343 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
02344 };
02345
02346
02347
02348
02349
02350
02351 class ThreadWithParamBase {
02352 public:
02353 virtual ~ThreadWithParamBase() {}
02354 virtual void Run() = 0;
02355 };
02356
02357
02358
02359
02360
02361
02362
02363 extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
02364 static_cast<ThreadWithParamBase*>(thread)->Run();
02365 return NULL;
02366 }
02367
02368
02369
02370
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380 template <typename T>
02381 class ThreadWithParam : public ThreadWithParamBase {
02382 public:
02383 typedef void (*UserThreadFunc)(T);
02384
02385 ThreadWithParam(
02386 UserThreadFunc func, T param, Notification* thread_can_start)
02387 : func_(func),
02388 param_(param),
02389 thread_can_start_(thread_can_start),
02390 finished_(false) {
02391 ThreadWithParamBase* const base = this;
02392
02393
02394 GTEST_CHECK_POSIX_SUCCESS_(
02395 pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
02396 }
02397 ~ThreadWithParam() { Join(); }
02398
02399 void Join() {
02400 if (!finished_) {
02401 GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
02402 finished_ = true;
02403 }
02404 }
02405
02406 virtual void Run() {
02407 if (thread_can_start_ != NULL)
02408 thread_can_start_->WaitForNotification();
02409 func_(param_);
02410 }
02411
02412 private:
02413 const UserThreadFunc func_;
02414 const T param_;
02415
02416
02417 Notification* const thread_can_start_;
02418 bool finished_;
02419 pthread_t thread_;
02420
02421 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
02422 };
02423
02424
02425
02426
02427
02428
02429
02430
02431
02432
02433
02434
02435
02436
02437
02438
02439
02440
02441
02442
02443 class MutexBase {
02444 public:
02445
02446 void Lock() {
02447 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
02448 owner_ = pthread_self();
02449 has_owner_ = true;
02450 }
02451
02452
02453 void Unlock() {
02454
02455
02456
02457
02458 has_owner_ = false;
02459 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
02460 }
02461
02462
02463
02464 void AssertHeld() const {
02465 GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
02466 << "The current thread is not holding the mutex @" << this;
02467 }
02468
02469
02470
02471
02472
02473
02474 public:
02475 pthread_mutex_t mutex_;
02476
02477
02478
02479
02480
02481
02482 bool has_owner_;
02483 pthread_t owner_;
02484 };
02485
02486
02487 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
02488 extern ::testing::internal::MutexBase mutex
02489
02490
02491
02492
02493
02494
02495
02496 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
02497 ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
02498
02499
02500
02501 class Mutex : public MutexBase {
02502 public:
02503 Mutex() {
02504 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
02505 has_owner_ = false;
02506 }
02507 ~Mutex() {
02508 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
02509 }
02510
02511 private:
02512 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
02513 };
02514
02515
02516
02517
02518 class GTestMutexLock {
02519 public:
02520 explicit GTestMutexLock(MutexBase* mutex)
02521 : mutex_(mutex) { mutex_->Lock(); }
02522
02523 ~GTestMutexLock() { mutex_->Unlock(); }
02524
02525 private:
02526 MutexBase* const mutex_;
02527
02528 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
02529 };
02530
02531 typedef GTestMutexLock MutexLock;
02532
02533
02534
02535
02536
02537
02538
02539 class ThreadLocalValueHolderBase {
02540 public:
02541 virtual ~ThreadLocalValueHolderBase() {}
02542 };
02543
02544
02545
02546 extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
02547 delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
02548 }
02549
02550
02551
02552
02553
02554
02555
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566
02567
02568
02569
02570
02571
02572
02573
02574
02575
02576
02577
02578
02579 template <typename T>
02580 class ThreadLocal {
02581 public:
02582 ThreadLocal() : key_(CreateKey()),
02583 default_() {}
02584 explicit ThreadLocal(const T& value) : key_(CreateKey()),
02585 default_(value) {}
02586
02587 ~ThreadLocal() {
02588
02589 DeleteThreadLocalValue(pthread_getspecific(key_));
02590
02591
02592
02593 GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
02594 }
02595
02596 T* pointer() { return GetOrCreateValue(); }
02597 const T* pointer() const { return GetOrCreateValue(); }
02598 const T& get() const { return *pointer(); }
02599 void set(const T& value) { *pointer() = value; }
02600
02601 private:
02602
02603 class ValueHolder : public ThreadLocalValueHolderBase {
02604 public:
02605 explicit ValueHolder(const T& value) : value_(value) {}
02606
02607 T* pointer() { return &value_; }
02608
02609 private:
02610 T value_;
02611 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
02612 };
02613
02614 static pthread_key_t CreateKey() {
02615 pthread_key_t key;
02616
02617
02618 GTEST_CHECK_POSIX_SUCCESS_(
02619 pthread_key_create(&key, &DeleteThreadLocalValue));
02620 return key;
02621 }
02622
02623 T* GetOrCreateValue() const {
02624 ThreadLocalValueHolderBase* const holder =
02625 static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
02626 if (holder != NULL) {
02627 return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
02628 }
02629
02630 ValueHolder* const new_holder = new ValueHolder(default_);
02631 ThreadLocalValueHolderBase* const holder_base = new_holder;
02632 GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
02633 return new_holder->pointer();
02634 }
02635
02636
02637 const pthread_key_t key_;
02638 const T default_;
02639
02640 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
02641 };
02642
02643 # define GTEST_IS_THREADSAFE 1
02644
02645 #else // GTEST_HAS_PTHREAD
02646
02647
02648
02649
02650
02651
02652 class Mutex {
02653 public:
02654 Mutex() {}
02655 void Lock() {}
02656 void Unlock() {}
02657 void AssertHeld() const {}
02658 };
02659
02660 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
02661 extern ::testing::internal::Mutex mutex
02662
02663 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
02664
02665 class GTestMutexLock {
02666 public:
02667 explicit GTestMutexLock(Mutex*) {}
02668 };
02669
02670 typedef GTestMutexLock MutexLock;
02671
02672 template <typename T>
02673 class ThreadLocal {
02674 public:
02675 ThreadLocal() : value_() {}
02676 explicit ThreadLocal(const T& value) : value_(value) {}
02677 T* pointer() { return &value_; }
02678 const T* pointer() const { return &value_; }
02679 const T& get() const { return value_; }
02680 void set(const T& value) { value_ = value; }
02681 private:
02682 T value_;
02683 };
02684
02685
02686
02687 # define GTEST_IS_THREADSAFE 0
02688
02689 #endif // GTEST_HAS_PTHREAD
02690
02691
02692
02693 GTEST_API_ size_t GetThreadCount();
02694
02695
02696
02697
02698
02699
02700
02701 #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
02702
02703
02704 # define GTEST_ELLIPSIS_NEEDS_POD_ 1
02705 #else
02706 # define GTEST_CAN_COMPARE_NULL 1
02707 #endif
02708
02709
02710
02711
02712
02713 #if defined(__SYMBIAN32__) || defined(__IBMCPP__)
02714 # define GTEST_NEEDS_IS_POINTER_ 1
02715 #endif
02716
02717 template <bool bool_value>
02718 struct bool_constant {
02719 typedef bool_constant<bool_value> type;
02720 static const bool value = bool_value;
02721 };
02722 template <bool bool_value> const bool bool_constant<bool_value>::value;
02723
02724 typedef bool_constant<false> false_type;
02725 typedef bool_constant<true> true_type;
02726
02727 template <typename T>
02728 struct is_pointer : public false_type {};
02729
02730 template <typename T>
02731 struct is_pointer<T*> : public true_type {};
02732
02733 template <typename Iterator>
02734 struct IteratorTraits {
02735 typedef typename Iterator::value_type value_type;
02736 };
02737
02738 template <typename T>
02739 struct IteratorTraits<T*> {
02740 typedef T value_type;
02741 };
02742
02743 template <typename T>
02744 struct IteratorTraits<const T*> {
02745 typedef T value_type;
02746 };
02747
02748 #if GTEST_OS_WINDOWS
02749 # define GTEST_PATH_SEP_ "\\"
02750 # define GTEST_HAS_ALT_PATH_SEP_ 1
02751
02752 typedef __int64 BiggestInt;
02753 #else
02754 # define GTEST_PATH_SEP_ "/"
02755 # define GTEST_HAS_ALT_PATH_SEP_ 0
02756 typedef long long BiggestInt;
02757 #endif // GTEST_OS_WINDOWS
02758
02759
02760
02761
02762
02763
02764
02765
02766 inline bool IsAlpha(char ch) {
02767 return isalpha(static_cast<unsigned char>(ch)) != 0;
02768 }
02769 inline bool IsAlNum(char ch) {
02770 return isalnum(static_cast<unsigned char>(ch)) != 0;
02771 }
02772 inline bool IsDigit(char ch) {
02773 return isdigit(static_cast<unsigned char>(ch)) != 0;
02774 }
02775 inline bool IsLower(char ch) {
02776 return islower(static_cast<unsigned char>(ch)) != 0;
02777 }
02778 inline bool IsSpace(char ch) {
02779 return isspace(static_cast<unsigned char>(ch)) != 0;
02780 }
02781 inline bool IsUpper(char ch) {
02782 return isupper(static_cast<unsigned char>(ch)) != 0;
02783 }
02784 inline bool IsXDigit(char ch) {
02785 return isxdigit(static_cast<unsigned char>(ch)) != 0;
02786 }
02787 inline bool IsXDigit(wchar_t ch) {
02788 const unsigned char low_byte = static_cast<unsigned char>(ch);
02789 return ch == low_byte && isxdigit(low_byte) != 0;
02790 }
02791
02792 inline char ToLower(char ch) {
02793 return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
02794 }
02795 inline char ToUpper(char ch) {
02796 return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
02797 }
02798
02799
02800
02801
02802
02803
02804
02805 namespace posix {
02806
02807
02808
02809 #if GTEST_OS_WINDOWS
02810
02811 typedef struct _stat StatStruct;
02812
02813 # ifdef __BORLANDC__
02814 inline int IsATTY(int fd) { return isatty(fd); }
02815 inline int StrCaseCmp(const char* s1, const char* s2) {
02816 return stricmp(s1, s2);
02817 }
02818 inline char* StrDup(const char* src) { return strdup(src); }
02819 # else // !__BORLANDC__
02820 # if GTEST_OS_WINDOWS_MOBILE
02821 inline int IsATTY(int ) { return 0; }
02822 # else
02823 inline int IsATTY(int fd) { return _isatty(fd); }
02824 # endif // GTEST_OS_WINDOWS_MOBILE
02825 inline int StrCaseCmp(const char* s1, const char* s2) {
02826 return _stricmp(s1, s2);
02827 }
02828 inline char* StrDup(const char* src) { return _strdup(src); }
02829 # endif // __BORLANDC__
02830
02831 # if GTEST_OS_WINDOWS_MOBILE
02832 inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
02833
02834
02835 # else
02836 inline int FileNo(FILE* file) { return _fileno(file); }
02837 inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
02838 inline int RmDir(const char* dir) { return _rmdir(dir); }
02839 inline bool IsDir(const StatStruct& st) {
02840 return (_S_IFDIR & st.st_mode) != 0;
02841 }
02842 # endif // GTEST_OS_WINDOWS_MOBILE
02843
02844 #else
02845
02846 typedef struct stat StatStruct;
02847
02848 inline int FileNo(FILE* file) { return fileno(file); }
02849 inline int IsATTY(int fd) { return isatty(fd); }
02850 inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
02851 inline int StrCaseCmp(const char* s1, const char* s2) {
02852 return strcasecmp(s1, s2);
02853 }
02854 inline char* StrDup(const char* src) { return strdup(src); }
02855 inline int RmDir(const char* dir) { return rmdir(dir); }
02856 inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
02857
02858 #endif // GTEST_OS_WINDOWS
02859
02860
02861
02862 #ifdef _MSC_VER
02863
02864 # pragma warning(push)
02865 # pragma warning(disable:4996)
02866 #endif
02867
02868 inline const char* StrNCpy(char* dest, const char* src, size_t n) {
02869 return strncpy(dest, src, n);
02870 }
02871
02872
02873
02874
02875
02876 #if !GTEST_OS_WINDOWS_MOBILE
02877 inline int ChDir(const char* dir) { return chdir(dir); }
02878 #endif
02879 inline FILE* FOpen(const char* path, const char* mode) {
02880 return fopen(path, mode);
02881 }
02882 #if !GTEST_OS_WINDOWS_MOBILE
02883 inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
02884 return freopen(path, mode, stream);
02885 }
02886 inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
02887 #endif
02888 inline int FClose(FILE* fp) { return fclose(fp); }
02889 #if !GTEST_OS_WINDOWS_MOBILE
02890 inline int Read(int fd, void* buf, unsigned int count) {
02891 return static_cast<int>(read(fd, buf, count));
02892 }
02893 inline int Write(int fd, const void* buf, unsigned int count) {
02894 return static_cast<int>(write(fd, buf, count));
02895 }
02896 inline int Close(int fd) { return close(fd); }
02897 inline const char* StrError(int errnum) { return strerror(errnum); }
02898 #endif
02899 inline const char* GetEnv(const char* name) {
02900 #if GTEST_OS_WINDOWS_MOBILE
02901
02902 return NULL;
02903 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
02904
02905
02906 const char* const env = getenv(name);
02907 return (env != NULL && env[0] != '\0') ? env : NULL;
02908 #else
02909 return getenv(name);
02910 #endif
02911 }
02912
02913 #ifdef _MSC_VER
02914 # pragma warning(pop) // Restores the warning state.
02915 #endif
02916
02917 #if GTEST_OS_WINDOWS_MOBILE
02918
02919
02920
02921 void Abort();
02922 #else
02923 inline void Abort() { abort(); }
02924 #endif // GTEST_OS_WINDOWS_MOBILE
02925
02926 }
02927
02928
02929
02930
02931
02932
02933 #if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
02934
02935 # define GTEST_SNPRINTF_(buffer, size, format, ...) \
02936 _snprintf_s(buffer, size, size, format, __VA_ARGS__)
02937 #elif defined(_MSC_VER)
02938
02939
02940 # define GTEST_SNPRINTF_ _snprintf
02941 #else
02942 # define GTEST_SNPRINTF_ snprintf
02943 #endif
02944
02945
02946
02947
02948
02949
02950
02951
02952 const BiggestInt kMaxBiggestInt =
02953 ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
02954
02955
02956
02957
02958
02959
02960
02961
02962
02963
02964
02965
02966
02967
02968
02969
02970
02971
02972
02973 template <size_t size>
02974 class TypeWithSize {
02975 public:
02976
02977
02978 typedef void UInt;
02979 };
02980
02981
02982 template <>
02983 class TypeWithSize<4> {
02984 public:
02985
02986
02987
02988
02989 typedef int Int;
02990 typedef unsigned int UInt;
02991 };
02992
02993
02994 template <>
02995 class TypeWithSize<8> {
02996 public:
02997 #if GTEST_OS_WINDOWS
02998 typedef __int64 Int;
02999 typedef unsigned __int64 UInt;
03000 #else
03001 typedef long long Int;
03002 typedef unsigned long long UInt;
03003 #endif // GTEST_OS_WINDOWS
03004 };
03005
03006
03007 typedef TypeWithSize<4>::Int Int32;
03008 typedef TypeWithSize<4>::UInt UInt32;
03009 typedef TypeWithSize<8>::Int Int64;
03010 typedef TypeWithSize<8>::UInt UInt64;
03011 typedef TypeWithSize<8>::Int TimeInMillis;
03012
03013
03014
03015
03016 #define GTEST_FLAG(name) FLAGS_gtest_##name
03017
03018
03019 #define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
03020 #define GTEST_DECLARE_int32_(name) \
03021 GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
03022 #define GTEST_DECLARE_string_(name) \
03023 GTEST_API_ extern ::std::string GTEST_FLAG(name)
03024
03025
03026 #define GTEST_DEFINE_bool_(name, default_val, doc) \
03027 GTEST_API_ bool GTEST_FLAG(name) = (default_val)
03028 #define GTEST_DEFINE_int32_(name, default_val, doc) \
03029 GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
03030 #define GTEST_DEFINE_string_(name, default_val, doc) \
03031 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
03032
03033
03034 #define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
03035 #define GTEST_LOCK_EXCLUDED_(locks)
03036
03037
03038
03039
03040
03041
03042
03043 bool ParseInt32(const Message& src_text, const char* str, Int32* value);
03044
03045
03046
03047 bool BoolFromGTestEnv(const char* flag, bool default_val);
03048 GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
03049 const char* StringFromGTestEnv(const char* flag, const char* default_val);
03050
03051 }
03052 }
03053
03054 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
03055
03056 #if GTEST_OS_LINUX
03057 # include <stdlib.h>
03058 # include <sys/types.h>
03059 # include <sys/wait.h>
03060 # include <unistd.h>
03061 #endif // GTEST_OS_LINUX
03062
03063 #if GTEST_HAS_EXCEPTIONS
03064 # include <stdexcept>
03065 #endif
03066
03067 #include <ctype.h>
03068 #include <float.h>
03069 #include <string.h>
03070 #include <iomanip>
03071 #include <limits>
03072 #include <set>
03073
03074
03075
03076
03077
03078
03079
03080
03081
03082
03083
03084
03085
03086
03087
03088
03089
03090
03091
03092
03093
03094
03095
03096
03097
03098
03099
03100
03101
03102
03103
03104
03105
03106
03107
03108
03109
03110
03111
03112
03113
03114
03115
03116
03117
03118
03119 #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
03120 #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
03121
03122 #include <limits>
03123
03124
03125
03126
03127 void operator<<(const testing::internal::Secret&, int);
03128
03129 namespace testing {
03130
03131
03132
03133
03134
03135
03136
03137
03138
03139
03140
03141
03142
03143
03144
03145
03146
03147
03148
03149
03150
03151
03152
03153
03154
03155
03156
03157 class GTEST_API_ Message {
03158 private:
03159
03160
03161 typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
03162
03163 public:
03164
03165 Message();
03166
03167
03168 Message(const Message& msg) : ss_(new ::std::stringstream) {
03169 *ss_ << msg.GetString();
03170 }
03171
03172
03173 explicit Message(const char* str) : ss_(new ::std::stringstream) {
03174 *ss_ << str;
03175 }
03176
03177 #if GTEST_OS_SYMBIAN
03178
03179 template <typename T>
03180 inline Message& operator <<(const T& value) {
03181 StreamHelper(typename internal::is_pointer<T>::type(), value);
03182 return *this;
03183 }
03184 #else
03185
03186 template <typename T>
03187 inline Message& operator <<(const T& val) {
03188
03189
03190
03191
03192
03193
03194
03195
03196
03197
03198
03199
03200
03201
03202 using ::operator <<;
03203 *ss_ << val;
03204 return *this;
03205 }
03206
03207
03208
03209
03210
03211
03212
03213
03214
03215
03216
03217
03218
03219
03220 template <typename T>
03221 inline Message& operator <<(T* const& pointer) {
03222 if (pointer == NULL) {
03223 *ss_ << "(null)";
03224 } else {
03225 *ss_ << pointer;
03226 }
03227 return *this;
03228 }
03229 #endif // GTEST_OS_SYMBIAN
03230
03231
03232
03233
03234
03235
03236
03237 Message& operator <<(BasicNarrowIoManip val) {
03238 *ss_ << val;
03239 return *this;
03240 }
03241
03242
03243 Message& operator <<(bool b) {
03244 return *this << (b ? "true" : "false");
03245 }
03246
03247
03248
03249 Message& operator <<(const wchar_t* wide_c_str);
03250 Message& operator <<(wchar_t* wide_c_str);
03251
03252 #if GTEST_HAS_STD_WSTRING
03253
03254
03255 Message& operator <<(const ::std::wstring& wstr);
03256 #endif // GTEST_HAS_STD_WSTRING
03257
03258 #if GTEST_HAS_GLOBAL_WSTRING
03259
03260
03261 Message& operator <<(const ::wstring& wstr);
03262 #endif // GTEST_HAS_GLOBAL_WSTRING
03263
03264
03265
03266
03267
03268 std::string GetString() const;
03269
03270 private:
03271
03272 #if GTEST_OS_SYMBIAN
03273
03274
03275
03276
03277 template <typename T>
03278 inline void StreamHelper(internal::true_type , T* pointer) {
03279 if (pointer == NULL) {
03280 *ss_ << "(null)";
03281 } else {
03282 *ss_ << pointer;
03283 }
03284 }
03285 template <typename T>
03286 inline void StreamHelper(internal::false_type ,
03287 const T& value) {
03288
03289
03290 using ::operator <<;
03291 *ss_ << value;
03292 }
03293 #endif // GTEST_OS_SYMBIAN
03294
03295
03296 const internal::scoped_ptr< ::std::stringstream> ss_;
03297
03298
03299
03300 void operator=(const Message&);
03301 };
03302
03303
03304 inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
03305 return os << sb.GetString();
03306 }
03307
03308 namespace internal {
03309
03310
03311
03312
03313
03314 template <typename T>
03315 std::string StreamableToString(const T& streamable) {
03316 return (Message() << streamable).GetString();
03317 }
03318
03319 }
03320 }
03321
03322 #endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
03323
03324
03325
03326
03327
03328
03329
03330
03331
03332
03333
03334
03335
03336
03337
03338
03339
03340
03341
03342
03343
03344
03345
03346
03347
03348
03349
03350
03351
03352
03353
03354
03355
03356
03357
03358
03359
03360
03361
03362
03363 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
03364 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
03365
03366 #ifdef __BORLANDC__
03367
03368 # include <mem.h>
03369 #endif
03370
03371 #include <string.h>
03372 #include <string>
03373
03374
03375 namespace testing {
03376 namespace internal {
03377
03378
03379 class GTEST_API_ String {
03380 public:
03381
03382
03383
03384
03385
03386
03387
03388
03389
03390 static const char* CloneCString(const char* c_str);
03391
03392 #if GTEST_OS_WINDOWS_MOBILE
03393
03394
03395
03396
03397
03398
03399
03400
03401
03402
03403
03404
03405 static LPCWSTR AnsiToUtf16(const char* c_str);
03406
03407
03408
03409
03410
03411
03412
03413
03414
03415 static const char* Utf16ToAnsi(LPCWSTR utf16_str);
03416 #endif
03417
03418
03419
03420
03421
03422
03423 static bool CStringEquals(const char* lhs, const char* rhs);
03424
03425
03426
03427
03428
03429 static std::string ShowWideCString(const wchar_t* wide_c_str);
03430
03431
03432
03433
03434
03435
03436
03437 static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
03438
03439
03440
03441
03442
03443
03444
03445 static bool CaseInsensitiveCStringEquals(const char* lhs,
03446 const char* rhs);
03447
03448
03449
03450
03451
03452
03453
03454
03455
03456
03457
03458
03459
03460 static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
03461 const wchar_t* rhs);
03462
03463
03464
03465 static bool EndsWithCaseInsensitive(
03466 const std::string& str, const std::string& suffix);
03467
03468
03469 static std::string FormatIntWidth2(int value);
03470
03471
03472 static std::string FormatHexInt(int value);
03473
03474
03475 static std::string FormatByte(unsigned char value);
03476
03477 private:
03478 String();
03479 };
03480
03481
03482
03483 GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
03484
03485 }
03486 }
03487
03488 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
03489
03490
03491
03492
03493
03494
03495
03496
03497
03498
03499
03500
03501
03502
03503
03504
03505
03506
03507
03508
03509
03510
03511
03512
03513
03514
03515
03516
03517
03518
03519
03520
03521
03522
03523
03524
03525
03526
03527
03528 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
03529 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
03530
03531
03532 namespace testing {
03533 namespace internal {
03534
03535
03536
03537
03538
03539
03540
03541
03542
03543
03544
03545
03546 class GTEST_API_ FilePath {
03547 public:
03548 FilePath() : pathname_("") { }
03549 FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
03550
03551 explicit FilePath(const std::string& pathname) : pathname_(pathname) {
03552 Normalize();
03553 }
03554
03555 FilePath& operator=(const FilePath& rhs) {
03556 Set(rhs);
03557 return *this;
03558 }
03559
03560 void Set(const FilePath& rhs) {
03561 pathname_ = rhs.pathname_;
03562 }
03563
03564 const std::string& string() const { return pathname_; }
03565 const char* c_str() const { return pathname_.c_str(); }
03566
03567
03568 static FilePath GetCurrentDir();
03569
03570
03571
03572
03573
03574 static FilePath MakeFileName(const FilePath& directory,
03575 const FilePath& base_name,
03576 int number,
03577 const char* extension);
03578
03579
03580
03581
03582 static FilePath ConcatPaths(const FilePath& directory,
03583 const FilePath& relative_path);
03584
03585
03586
03587
03588
03589
03590
03591
03592
03593 static FilePath GenerateUniqueFileName(const FilePath& directory,
03594 const FilePath& base_name,
03595 const char* extension);
03596
03597
03598 bool IsEmpty() const { return pathname_.empty(); }
03599
03600
03601
03602
03603 FilePath RemoveTrailingPathSeparator() const;
03604
03605
03606
03607
03608
03609
03610
03611 FilePath RemoveDirectoryName() const;
03612
03613
03614
03615
03616
03617
03618
03619 FilePath RemoveFileName() const;
03620
03621
03622
03623
03624
03625 FilePath RemoveExtension(const char* extension) const;
03626
03627
03628
03629
03630
03631 bool CreateDirectoriesRecursively() const;
03632
03633
03634
03635
03636
03637 bool CreateFolder() const;
03638
03639
03640
03641 bool FileOrDirectoryExists() const;
03642
03643
03644
03645 bool DirectoryExists() const;
03646
03647
03648
03649
03650 bool IsDirectory() const;
03651
03652
03653
03654 bool IsRootDirectory() const;
03655
03656
03657 bool IsAbsolutePath() const;
03658
03659 private:
03660
03661
03662
03663
03664
03665
03666
03667
03668
03669
03670
03671
03672
03673
03674
03675
03676
03677
03678
03679
03680 void Normalize();
03681
03682
03683
03684
03685 const char* FindLastPathSeparator() const;
03686
03687 std::string pathname_;
03688 };
03689
03690 }
03691 }
03692
03693 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
03694
03695
03696
03697
03698
03699
03700
03701
03702
03703
03704
03705
03706
03707
03708
03709
03710
03711
03712
03713
03714
03715
03716
03717
03718
03719
03720
03721
03722
03723
03724
03725
03726
03727
03728
03729
03730
03731
03732
03733
03734
03735
03736
03737 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
03738 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
03739
03740
03741
03742
03743 # if GTEST_HAS_CXXABI_H_
03744 # include <cxxabi.h>
03745 # elif defined(__HP_aCC)
03746 # include <acxx_demangle.h>
03747 # endif // GTEST_HASH_CXXABI_H_
03748
03749 namespace testing {
03750 namespace internal {
03751
03752
03753
03754
03755 template <typename T>
03756 std::string GetTypeName() {
03757 # if GTEST_HAS_RTTI
03758
03759 const char* const name = typeid(T).name();
03760 # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
03761 int status = 0;
03762
03763
03764 # if GTEST_HAS_CXXABI_H_
03765 using abi::__cxa_demangle;
03766 # endif // GTEST_HAS_CXXABI_H_
03767 char* const readable_name = __cxa_demangle(name, 0, 0, &status);
03768 const std::string name_str(status == 0 ? readable_name : name);
03769 free(readable_name);
03770 return name_str;
03771 # else
03772 return name;
03773 # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
03774
03775 # else
03776
03777 return "<type>";
03778
03779 # endif // GTEST_HAS_RTTI
03780 }
03781
03782 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
03783
03784
03785
03786
03787
03788 template <typename T1, typename T2>
03789 struct AssertTypeEq;
03790
03791 template <typename T>
03792 struct AssertTypeEq<T, T> {
03793 typedef bool type;
03794 };
03795
03796
03797
03798
03799
03800 struct None {};
03801
03802
03803
03804
03805
03806
03807
03808
03809
03810 struct Types0 {};
03811
03812
03813
03814 template <typename T1>
03815 struct Types1 {
03816 typedef T1 Head;
03817 typedef Types0 Tail;
03818 };
03819 template <typename T1, typename T2>
03820 struct Types2 {
03821 typedef T1 Head;
03822 typedef Types1<T2> Tail;
03823 };
03824
03825 template <typename T1, typename T2, typename T3>
03826 struct Types3 {
03827 typedef T1 Head;
03828 typedef Types2<T2, T3> Tail;
03829 };
03830
03831 template <typename T1, typename T2, typename T3, typename T4>
03832 struct Types4 {
03833 typedef T1 Head;
03834 typedef Types3<T2, T3, T4> Tail;
03835 };
03836
03837 template <typename T1, typename T2, typename T3, typename T4, typename T5>
03838 struct Types5 {
03839 typedef T1 Head;
03840 typedef Types4<T2, T3, T4, T5> Tail;
03841 };
03842
03843 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03844 typename T6>
03845 struct Types6 {
03846 typedef T1 Head;
03847 typedef Types5<T2, T3, T4, T5, T6> Tail;
03848 };
03849
03850 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03851 typename T6, typename T7>
03852 struct Types7 {
03853 typedef T1 Head;
03854 typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
03855 };
03856
03857 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03858 typename T6, typename T7, typename T8>
03859 struct Types8 {
03860 typedef T1 Head;
03861 typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
03862 };
03863
03864 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03865 typename T6, typename T7, typename T8, typename T9>
03866 struct Types9 {
03867 typedef T1 Head;
03868 typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
03869 };
03870
03871 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03872 typename T6, typename T7, typename T8, typename T9, typename T10>
03873 struct Types10 {
03874 typedef T1 Head;
03875 typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
03876 };
03877
03878 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03879 typename T6, typename T7, typename T8, typename T9, typename T10,
03880 typename T11>
03881 struct Types11 {
03882 typedef T1 Head;
03883 typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
03884 };
03885
03886 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03887 typename T6, typename T7, typename T8, typename T9, typename T10,
03888 typename T11, typename T12>
03889 struct Types12 {
03890 typedef T1 Head;
03891 typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
03892 };
03893
03894 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03895 typename T6, typename T7, typename T8, typename T9, typename T10,
03896 typename T11, typename T12, typename T13>
03897 struct Types13 {
03898 typedef T1 Head;
03899 typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
03900 };
03901
03902 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03903 typename T6, typename T7, typename T8, typename T9, typename T10,
03904 typename T11, typename T12, typename T13, typename T14>
03905 struct Types14 {
03906 typedef T1 Head;
03907 typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
03908 };
03909
03910 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03911 typename T6, typename T7, typename T8, typename T9, typename T10,
03912 typename T11, typename T12, typename T13, typename T14, typename T15>
03913 struct Types15 {
03914 typedef T1 Head;
03915 typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
03916 T15> Tail;
03917 };
03918
03919 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03920 typename T6, typename T7, typename T8, typename T9, typename T10,
03921 typename T11, typename T12, typename T13, typename T14, typename T15,
03922 typename T16>
03923 struct Types16 {
03924 typedef T1 Head;
03925 typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03926 T16> Tail;
03927 };
03928
03929 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03930 typename T6, typename T7, typename T8, typename T9, typename T10,
03931 typename T11, typename T12, typename T13, typename T14, typename T15,
03932 typename T16, typename T17>
03933 struct Types17 {
03934 typedef T1 Head;
03935 typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03936 T16, T17> Tail;
03937 };
03938
03939 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03940 typename T6, typename T7, typename T8, typename T9, typename T10,
03941 typename T11, typename T12, typename T13, typename T14, typename T15,
03942 typename T16, typename T17, typename T18>
03943 struct Types18 {
03944 typedef T1 Head;
03945 typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03946 T16, T17, T18> Tail;
03947 };
03948
03949 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03950 typename T6, typename T7, typename T8, typename T9, typename T10,
03951 typename T11, typename T12, typename T13, typename T14, typename T15,
03952 typename T16, typename T17, typename T18, typename T19>
03953 struct Types19 {
03954 typedef T1 Head;
03955 typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03956 T16, T17, T18, T19> Tail;
03957 };
03958
03959 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03960 typename T6, typename T7, typename T8, typename T9, typename T10,
03961 typename T11, typename T12, typename T13, typename T14, typename T15,
03962 typename T16, typename T17, typename T18, typename T19, typename T20>
03963 struct Types20 {
03964 typedef T1 Head;
03965 typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03966 T16, T17, T18, T19, T20> Tail;
03967 };
03968
03969 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03970 typename T6, typename T7, typename T8, typename T9, typename T10,
03971 typename T11, typename T12, typename T13, typename T14, typename T15,
03972 typename T16, typename T17, typename T18, typename T19, typename T20,
03973 typename T21>
03974 struct Types21 {
03975 typedef T1 Head;
03976 typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03977 T16, T17, T18, T19, T20, T21> Tail;
03978 };
03979
03980 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03981 typename T6, typename T7, typename T8, typename T9, typename T10,
03982 typename T11, typename T12, typename T13, typename T14, typename T15,
03983 typename T16, typename T17, typename T18, typename T19, typename T20,
03984 typename T21, typename T22>
03985 struct Types22 {
03986 typedef T1 Head;
03987 typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03988 T16, T17, T18, T19, T20, T21, T22> Tail;
03989 };
03990
03991 template <typename T1, typename T2, typename T3, typename T4, typename T5,
03992 typename T6, typename T7, typename T8, typename T9, typename T10,
03993 typename T11, typename T12, typename T13, typename T14, typename T15,
03994 typename T16, typename T17, typename T18, typename T19, typename T20,
03995 typename T21, typename T22, typename T23>
03996 struct Types23 {
03997 typedef T1 Head;
03998 typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
03999 T16, T17, T18, T19, T20, T21, T22, T23> Tail;
04000 };
04001
04002 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04003 typename T6, typename T7, typename T8, typename T9, typename T10,
04004 typename T11, typename T12, typename T13, typename T14, typename T15,
04005 typename T16, typename T17, typename T18, typename T19, typename T20,
04006 typename T21, typename T22, typename T23, typename T24>
04007 struct Types24 {
04008 typedef T1 Head;
04009 typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04010 T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
04011 };
04012
04013 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04014 typename T6, typename T7, typename T8, typename T9, typename T10,
04015 typename T11, typename T12, typename T13, typename T14, typename T15,
04016 typename T16, typename T17, typename T18, typename T19, typename T20,
04017 typename T21, typename T22, typename T23, typename T24, typename T25>
04018 struct Types25 {
04019 typedef T1 Head;
04020 typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04021 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
04022 };
04023
04024 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04025 typename T6, typename T7, typename T8, typename T9, typename T10,
04026 typename T11, typename T12, typename T13, typename T14, typename T15,
04027 typename T16, typename T17, typename T18, typename T19, typename T20,
04028 typename T21, typename T22, typename T23, typename T24, typename T25,
04029 typename T26>
04030 struct Types26 {
04031 typedef T1 Head;
04032 typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04033 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
04034 };
04035
04036 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04037 typename T6, typename T7, typename T8, typename T9, typename T10,
04038 typename T11, typename T12, typename T13, typename T14, typename T15,
04039 typename T16, typename T17, typename T18, typename T19, typename T20,
04040 typename T21, typename T22, typename T23, typename T24, typename T25,
04041 typename T26, typename T27>
04042 struct Types27 {
04043 typedef T1 Head;
04044 typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04045 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
04046 };
04047
04048 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04049 typename T6, typename T7, typename T8, typename T9, typename T10,
04050 typename T11, typename T12, typename T13, typename T14, typename T15,
04051 typename T16, typename T17, typename T18, typename T19, typename T20,
04052 typename T21, typename T22, typename T23, typename T24, typename T25,
04053 typename T26, typename T27, typename T28>
04054 struct Types28 {
04055 typedef T1 Head;
04056 typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04057 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
04058 };
04059
04060 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04061 typename T6, typename T7, typename T8, typename T9, typename T10,
04062 typename T11, typename T12, typename T13, typename T14, typename T15,
04063 typename T16, typename T17, typename T18, typename T19, typename T20,
04064 typename T21, typename T22, typename T23, typename T24, typename T25,
04065 typename T26, typename T27, typename T28, typename T29>
04066 struct Types29 {
04067 typedef T1 Head;
04068 typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04069 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
04070 T29> Tail;
04071 };
04072
04073 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04074 typename T6, typename T7, typename T8, typename T9, typename T10,
04075 typename T11, typename T12, typename T13, typename T14, typename T15,
04076 typename T16, typename T17, typename T18, typename T19, typename T20,
04077 typename T21, typename T22, typename T23, typename T24, typename T25,
04078 typename T26, typename T27, typename T28, typename T29, typename T30>
04079 struct Types30 {
04080 typedef T1 Head;
04081 typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04082 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04083 T30> Tail;
04084 };
04085
04086 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04087 typename T6, typename T7, typename T8, typename T9, typename T10,
04088 typename T11, typename T12, typename T13, typename T14, typename T15,
04089 typename T16, typename T17, typename T18, typename T19, typename T20,
04090 typename T21, typename T22, typename T23, typename T24, typename T25,
04091 typename T26, typename T27, typename T28, typename T29, typename T30,
04092 typename T31>
04093 struct Types31 {
04094 typedef T1 Head;
04095 typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04096 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04097 T30, T31> Tail;
04098 };
04099
04100 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04101 typename T6, typename T7, typename T8, typename T9, typename T10,
04102 typename T11, typename T12, typename T13, typename T14, typename T15,
04103 typename T16, typename T17, typename T18, typename T19, typename T20,
04104 typename T21, typename T22, typename T23, typename T24, typename T25,
04105 typename T26, typename T27, typename T28, typename T29, typename T30,
04106 typename T31, typename T32>
04107 struct Types32 {
04108 typedef T1 Head;
04109 typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04110 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04111 T30, T31, T32> Tail;
04112 };
04113
04114 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04115 typename T6, typename T7, typename T8, typename T9, typename T10,
04116 typename T11, typename T12, typename T13, typename T14, typename T15,
04117 typename T16, typename T17, typename T18, typename T19, typename T20,
04118 typename T21, typename T22, typename T23, typename T24, typename T25,
04119 typename T26, typename T27, typename T28, typename T29, typename T30,
04120 typename T31, typename T32, typename T33>
04121 struct Types33 {
04122 typedef T1 Head;
04123 typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04124 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04125 T30, T31, T32, T33> Tail;
04126 };
04127
04128 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04129 typename T6, typename T7, typename T8, typename T9, typename T10,
04130 typename T11, typename T12, typename T13, typename T14, typename T15,
04131 typename T16, typename T17, typename T18, typename T19, typename T20,
04132 typename T21, typename T22, typename T23, typename T24, typename T25,
04133 typename T26, typename T27, typename T28, typename T29, typename T30,
04134 typename T31, typename T32, typename T33, typename T34>
04135 struct Types34 {
04136 typedef T1 Head;
04137 typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04138 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04139 T30, T31, T32, T33, T34> Tail;
04140 };
04141
04142 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04143 typename T6, typename T7, typename T8, typename T9, typename T10,
04144 typename T11, typename T12, typename T13, typename T14, typename T15,
04145 typename T16, typename T17, typename T18, typename T19, typename T20,
04146 typename T21, typename T22, typename T23, typename T24, typename T25,
04147 typename T26, typename T27, typename T28, typename T29, typename T30,
04148 typename T31, typename T32, typename T33, typename T34, typename T35>
04149 struct Types35 {
04150 typedef T1 Head;
04151 typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04152 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04153 T30, T31, T32, T33, T34, T35> Tail;
04154 };
04155
04156 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04157 typename T6, typename T7, typename T8, typename T9, typename T10,
04158 typename T11, typename T12, typename T13, typename T14, typename T15,
04159 typename T16, typename T17, typename T18, typename T19, typename T20,
04160 typename T21, typename T22, typename T23, typename T24, typename T25,
04161 typename T26, typename T27, typename T28, typename T29, typename T30,
04162 typename T31, typename T32, typename T33, typename T34, typename T35,
04163 typename T36>
04164 struct Types36 {
04165 typedef T1 Head;
04166 typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04167 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04168 T30, T31, T32, T33, T34, T35, T36> Tail;
04169 };
04170
04171 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04172 typename T6, typename T7, typename T8, typename T9, typename T10,
04173 typename T11, typename T12, typename T13, typename T14, typename T15,
04174 typename T16, typename T17, typename T18, typename T19, typename T20,
04175 typename T21, typename T22, typename T23, typename T24, typename T25,
04176 typename T26, typename T27, typename T28, typename T29, typename T30,
04177 typename T31, typename T32, typename T33, typename T34, typename T35,
04178 typename T36, typename T37>
04179 struct Types37 {
04180 typedef T1 Head;
04181 typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04182 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04183 T30, T31, T32, T33, T34, T35, T36, T37> Tail;
04184 };
04185
04186 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04187 typename T6, typename T7, typename T8, typename T9, typename T10,
04188 typename T11, typename T12, typename T13, typename T14, typename T15,
04189 typename T16, typename T17, typename T18, typename T19, typename T20,
04190 typename T21, typename T22, typename T23, typename T24, typename T25,
04191 typename T26, typename T27, typename T28, typename T29, typename T30,
04192 typename T31, typename T32, typename T33, typename T34, typename T35,
04193 typename T36, typename T37, typename T38>
04194 struct Types38 {
04195 typedef T1 Head;
04196 typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04197 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04198 T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
04199 };
04200
04201 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04202 typename T6, typename T7, typename T8, typename T9, typename T10,
04203 typename T11, typename T12, typename T13, typename T14, typename T15,
04204 typename T16, typename T17, typename T18, typename T19, typename T20,
04205 typename T21, typename T22, typename T23, typename T24, typename T25,
04206 typename T26, typename T27, typename T28, typename T29, typename T30,
04207 typename T31, typename T32, typename T33, typename T34, typename T35,
04208 typename T36, typename T37, typename T38, typename T39>
04209 struct Types39 {
04210 typedef T1 Head;
04211 typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04212 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04213 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
04214 };
04215
04216 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04217 typename T6, typename T7, typename T8, typename T9, typename T10,
04218 typename T11, typename T12, typename T13, typename T14, typename T15,
04219 typename T16, typename T17, typename T18, typename T19, typename T20,
04220 typename T21, typename T22, typename T23, typename T24, typename T25,
04221 typename T26, typename T27, typename T28, typename T29, typename T30,
04222 typename T31, typename T32, typename T33, typename T34, typename T35,
04223 typename T36, typename T37, typename T38, typename T39, typename T40>
04224 struct Types40 {
04225 typedef T1 Head;
04226 typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04227 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04228 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
04229 };
04230
04231 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04232 typename T6, typename T7, typename T8, typename T9, typename T10,
04233 typename T11, typename T12, typename T13, typename T14, typename T15,
04234 typename T16, typename T17, typename T18, typename T19, typename T20,
04235 typename T21, typename T22, typename T23, typename T24, typename T25,
04236 typename T26, typename T27, typename T28, typename T29, typename T30,
04237 typename T31, typename T32, typename T33, typename T34, typename T35,
04238 typename T36, typename T37, typename T38, typename T39, typename T40,
04239 typename T41>
04240 struct Types41 {
04241 typedef T1 Head;
04242 typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04243 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04244 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
04245 };
04246
04247 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04248 typename T6, typename T7, typename T8, typename T9, typename T10,
04249 typename T11, typename T12, typename T13, typename T14, typename T15,
04250 typename T16, typename T17, typename T18, typename T19, typename T20,
04251 typename T21, typename T22, typename T23, typename T24, typename T25,
04252 typename T26, typename T27, typename T28, typename T29, typename T30,
04253 typename T31, typename T32, typename T33, typename T34, typename T35,
04254 typename T36, typename T37, typename T38, typename T39, typename T40,
04255 typename T41, typename T42>
04256 struct Types42 {
04257 typedef T1 Head;
04258 typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04259 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04260 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
04261 };
04262
04263 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04264 typename T6, typename T7, typename T8, typename T9, typename T10,
04265 typename T11, typename T12, typename T13, typename T14, typename T15,
04266 typename T16, typename T17, typename T18, typename T19, typename T20,
04267 typename T21, typename T22, typename T23, typename T24, typename T25,
04268 typename T26, typename T27, typename T28, typename T29, typename T30,
04269 typename T31, typename T32, typename T33, typename T34, typename T35,
04270 typename T36, typename T37, typename T38, typename T39, typename T40,
04271 typename T41, typename T42, typename T43>
04272 struct Types43 {
04273 typedef T1 Head;
04274 typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04275 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04276 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
04277 T43> Tail;
04278 };
04279
04280 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04281 typename T6, typename T7, typename T8, typename T9, typename T10,
04282 typename T11, typename T12, typename T13, typename T14, typename T15,
04283 typename T16, typename T17, typename T18, typename T19, typename T20,
04284 typename T21, typename T22, typename T23, typename T24, typename T25,
04285 typename T26, typename T27, typename T28, typename T29, typename T30,
04286 typename T31, typename T32, typename T33, typename T34, typename T35,
04287 typename T36, typename T37, typename T38, typename T39, typename T40,
04288 typename T41, typename T42, typename T43, typename T44>
04289 struct Types44 {
04290 typedef T1 Head;
04291 typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04292 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04293 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04294 T44> Tail;
04295 };
04296
04297 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04298 typename T6, typename T7, typename T8, typename T9, typename T10,
04299 typename T11, typename T12, typename T13, typename T14, typename T15,
04300 typename T16, typename T17, typename T18, typename T19, typename T20,
04301 typename T21, typename T22, typename T23, typename T24, typename T25,
04302 typename T26, typename T27, typename T28, typename T29, typename T30,
04303 typename T31, typename T32, typename T33, typename T34, typename T35,
04304 typename T36, typename T37, typename T38, typename T39, typename T40,
04305 typename T41, typename T42, typename T43, typename T44, typename T45>
04306 struct Types45 {
04307 typedef T1 Head;
04308 typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04309 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04310 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04311 T44, T45> Tail;
04312 };
04313
04314 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04315 typename T6, typename T7, typename T8, typename T9, typename T10,
04316 typename T11, typename T12, typename T13, typename T14, typename T15,
04317 typename T16, typename T17, typename T18, typename T19, typename T20,
04318 typename T21, typename T22, typename T23, typename T24, typename T25,
04319 typename T26, typename T27, typename T28, typename T29, typename T30,
04320 typename T31, typename T32, typename T33, typename T34, typename T35,
04321 typename T36, typename T37, typename T38, typename T39, typename T40,
04322 typename T41, typename T42, typename T43, typename T44, typename T45,
04323 typename T46>
04324 struct Types46 {
04325 typedef T1 Head;
04326 typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04327 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04328 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04329 T44, T45, T46> Tail;
04330 };
04331
04332 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04333 typename T6, typename T7, typename T8, typename T9, typename T10,
04334 typename T11, typename T12, typename T13, typename T14, typename T15,
04335 typename T16, typename T17, typename T18, typename T19, typename T20,
04336 typename T21, typename T22, typename T23, typename T24, typename T25,
04337 typename T26, typename T27, typename T28, typename T29, typename T30,
04338 typename T31, typename T32, typename T33, typename T34, typename T35,
04339 typename T36, typename T37, typename T38, typename T39, typename T40,
04340 typename T41, typename T42, typename T43, typename T44, typename T45,
04341 typename T46, typename T47>
04342 struct Types47 {
04343 typedef T1 Head;
04344 typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04345 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04346 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04347 T44, T45, T46, T47> Tail;
04348 };
04349
04350 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04351 typename T6, typename T7, typename T8, typename T9, typename T10,
04352 typename T11, typename T12, typename T13, typename T14, typename T15,
04353 typename T16, typename T17, typename T18, typename T19, typename T20,
04354 typename T21, typename T22, typename T23, typename T24, typename T25,
04355 typename T26, typename T27, typename T28, typename T29, typename T30,
04356 typename T31, typename T32, typename T33, typename T34, typename T35,
04357 typename T36, typename T37, typename T38, typename T39, typename T40,
04358 typename T41, typename T42, typename T43, typename T44, typename T45,
04359 typename T46, typename T47, typename T48>
04360 struct Types48 {
04361 typedef T1 Head;
04362 typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04363 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04364 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04365 T44, T45, T46, T47, T48> Tail;
04366 };
04367
04368 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04369 typename T6, typename T7, typename T8, typename T9, typename T10,
04370 typename T11, typename T12, typename T13, typename T14, typename T15,
04371 typename T16, typename T17, typename T18, typename T19, typename T20,
04372 typename T21, typename T22, typename T23, typename T24, typename T25,
04373 typename T26, typename T27, typename T28, typename T29, typename T30,
04374 typename T31, typename T32, typename T33, typename T34, typename T35,
04375 typename T36, typename T37, typename T38, typename T39, typename T40,
04376 typename T41, typename T42, typename T43, typename T44, typename T45,
04377 typename T46, typename T47, typename T48, typename T49>
04378 struct Types49 {
04379 typedef T1 Head;
04380 typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04381 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04382 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04383 T44, T45, T46, T47, T48, T49> Tail;
04384 };
04385
04386 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04387 typename T6, typename T7, typename T8, typename T9, typename T10,
04388 typename T11, typename T12, typename T13, typename T14, typename T15,
04389 typename T16, typename T17, typename T18, typename T19, typename T20,
04390 typename T21, typename T22, typename T23, typename T24, typename T25,
04391 typename T26, typename T27, typename T28, typename T29, typename T30,
04392 typename T31, typename T32, typename T33, typename T34, typename T35,
04393 typename T36, typename T37, typename T38, typename T39, typename T40,
04394 typename T41, typename T42, typename T43, typename T44, typename T45,
04395 typename T46, typename T47, typename T48, typename T49, typename T50>
04396 struct Types50 {
04397 typedef T1 Head;
04398 typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04399 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04400 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
04401 T44, T45, T46, T47, T48, T49, T50> Tail;
04402 };
04403
04404
04405 }
04406
04407
04408
04409
04410
04411
04412
04413
04414
04415
04416
04417
04418
04419
04420 template <typename T1 = internal::None, typename T2 = internal::None,
04421 typename T3 = internal::None, typename T4 = internal::None,
04422 typename T5 = internal::None, typename T6 = internal::None,
04423 typename T7 = internal::None, typename T8 = internal::None,
04424 typename T9 = internal::None, typename T10 = internal::None,
04425 typename T11 = internal::None, typename T12 = internal::None,
04426 typename T13 = internal::None, typename T14 = internal::None,
04427 typename T15 = internal::None, typename T16 = internal::None,
04428 typename T17 = internal::None, typename T18 = internal::None,
04429 typename T19 = internal::None, typename T20 = internal::None,
04430 typename T21 = internal::None, typename T22 = internal::None,
04431 typename T23 = internal::None, typename T24 = internal::None,
04432 typename T25 = internal::None, typename T26 = internal::None,
04433 typename T27 = internal::None, typename T28 = internal::None,
04434 typename T29 = internal::None, typename T30 = internal::None,
04435 typename T31 = internal::None, typename T32 = internal::None,
04436 typename T33 = internal::None, typename T34 = internal::None,
04437 typename T35 = internal::None, typename T36 = internal::None,
04438 typename T37 = internal::None, typename T38 = internal::None,
04439 typename T39 = internal::None, typename T40 = internal::None,
04440 typename T41 = internal::None, typename T42 = internal::None,
04441 typename T43 = internal::None, typename T44 = internal::None,
04442 typename T45 = internal::None, typename T46 = internal::None,
04443 typename T47 = internal::None, typename T48 = internal::None,
04444 typename T49 = internal::None, typename T50 = internal::None>
04445 struct Types {
04446 typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04447 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04448 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
04449 T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
04450 };
04451
04452 template <>
04453 struct Types<internal::None, internal::None, internal::None, internal::None,
04454 internal::None, internal::None, internal::None, internal::None,
04455 internal::None, internal::None, internal::None, internal::None,
04456 internal::None, internal::None, internal::None, internal::None,
04457 internal::None, internal::None, internal::None, internal::None,
04458 internal::None, internal::None, internal::None, internal::None,
04459 internal::None, internal::None, internal::None, internal::None,
04460 internal::None, internal::None, internal::None, internal::None,
04461 internal::None, internal::None, internal::None, internal::None,
04462 internal::None, internal::None, internal::None, internal::None,
04463 internal::None, internal::None, internal::None, internal::None,
04464 internal::None, internal::None, internal::None, internal::None,
04465 internal::None, internal::None> {
04466 typedef internal::Types0 type;
04467 };
04468 template <typename T1>
04469 struct Types<T1, internal::None, internal::None, internal::None,
04470 internal::None, internal::None, internal::None, internal::None,
04471 internal::None, internal::None, internal::None, internal::None,
04472 internal::None, internal::None, internal::None, internal::None,
04473 internal::None, internal::None, internal::None, internal::None,
04474 internal::None, internal::None, internal::None, internal::None,
04475 internal::None, internal::None, internal::None, internal::None,
04476 internal::None, internal::None, internal::None, internal::None,
04477 internal::None, internal::None, internal::None, internal::None,
04478 internal::None, internal::None, internal::None, internal::None,
04479 internal::None, internal::None, internal::None, internal::None,
04480 internal::None, internal::None, internal::None, internal::None,
04481 internal::None, internal::None> {
04482 typedef internal::Types1<T1> type;
04483 };
04484 template <typename T1, typename T2>
04485 struct Types<T1, T2, internal::None, internal::None, internal::None,
04486 internal::None, internal::None, internal::None, internal::None,
04487 internal::None, internal::None, internal::None, internal::None,
04488 internal::None, internal::None, internal::None, internal::None,
04489 internal::None, internal::None, internal::None, internal::None,
04490 internal::None, internal::None, internal::None, internal::None,
04491 internal::None, internal::None, internal::None, internal::None,
04492 internal::None, internal::None, internal::None, internal::None,
04493 internal::None, internal::None, internal::None, internal::None,
04494 internal::None, internal::None, internal::None, internal::None,
04495 internal::None, internal::None, internal::None, internal::None,
04496 internal::None, internal::None, internal::None, internal::None,
04497 internal::None> {
04498 typedef internal::Types2<T1, T2> type;
04499 };
04500 template <typename T1, typename T2, typename T3>
04501 struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
04502 internal::None, internal::None, internal::None, internal::None,
04503 internal::None, internal::None, internal::None, internal::None,
04504 internal::None, internal::None, internal::None, internal::None,
04505 internal::None, internal::None, internal::None, internal::None,
04506 internal::None, internal::None, internal::None, internal::None,
04507 internal::None, internal::None, internal::None, internal::None,
04508 internal::None, internal::None, internal::None, internal::None,
04509 internal::None, internal::None, internal::None, internal::None,
04510 internal::None, internal::None, internal::None, internal::None,
04511 internal::None, internal::None, internal::None, internal::None,
04512 internal::None, internal::None, internal::None, internal::None> {
04513 typedef internal::Types3<T1, T2, T3> type;
04514 };
04515 template <typename T1, typename T2, typename T3, typename T4>
04516 struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
04517 internal::None, internal::None, internal::None, internal::None,
04518 internal::None, internal::None, internal::None, internal::None,
04519 internal::None, internal::None, internal::None, internal::None,
04520 internal::None, internal::None, internal::None, internal::None,
04521 internal::None, internal::None, internal::None, internal::None,
04522 internal::None, internal::None, internal::None, internal::None,
04523 internal::None, internal::None, internal::None, internal::None,
04524 internal::None, internal::None, internal::None, internal::None,
04525 internal::None, internal::None, internal::None, internal::None,
04526 internal::None, internal::None, internal::None, internal::None,
04527 internal::None, internal::None, internal::None> {
04528 typedef internal::Types4<T1, T2, T3, T4> type;
04529 };
04530 template <typename T1, typename T2, typename T3, typename T4, typename T5>
04531 struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
04532 internal::None, internal::None, internal::None, internal::None,
04533 internal::None, internal::None, internal::None, internal::None,
04534 internal::None, internal::None, internal::None, internal::None,
04535 internal::None, internal::None, internal::None, internal::None,
04536 internal::None, internal::None, internal::None, internal::None,
04537 internal::None, internal::None, internal::None, internal::None,
04538 internal::None, internal::None, internal::None, internal::None,
04539 internal::None, internal::None, internal::None, internal::None,
04540 internal::None, internal::None, internal::None, internal::None,
04541 internal::None, internal::None, internal::None, internal::None,
04542 internal::None, internal::None, internal::None> {
04543 typedef internal::Types5<T1, T2, T3, T4, T5> type;
04544 };
04545 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04546 typename T6>
04547 struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
04548 internal::None, internal::None, internal::None, internal::None,
04549 internal::None, internal::None, internal::None, internal::None,
04550 internal::None, internal::None, internal::None, internal::None,
04551 internal::None, internal::None, internal::None, internal::None,
04552 internal::None, internal::None, internal::None, internal::None,
04553 internal::None, internal::None, internal::None, internal::None,
04554 internal::None, internal::None, internal::None, internal::None,
04555 internal::None, internal::None, internal::None, internal::None,
04556 internal::None, internal::None, internal::None, internal::None,
04557 internal::None, internal::None, internal::None, internal::None,
04558 internal::None, internal::None> {
04559 typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
04560 };
04561 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04562 typename T6, typename T7>
04563 struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
04564 internal::None, internal::None, internal::None, internal::None,
04565 internal::None, internal::None, internal::None, internal::None,
04566 internal::None, internal::None, internal::None, internal::None,
04567 internal::None, internal::None, internal::None, internal::None,
04568 internal::None, internal::None, internal::None, internal::None,
04569 internal::None, internal::None, internal::None, internal::None,
04570 internal::None, internal::None, internal::None, internal::None,
04571 internal::None, internal::None, internal::None, internal::None,
04572 internal::None, internal::None, internal::None, internal::None,
04573 internal::None, internal::None, internal::None, internal::None,
04574 internal::None> {
04575 typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
04576 };
04577 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04578 typename T6, typename T7, typename T8>
04579 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
04580 internal::None, internal::None, internal::None, internal::None,
04581 internal::None, internal::None, internal::None, internal::None,
04582 internal::None, internal::None, internal::None, internal::None,
04583 internal::None, internal::None, internal::None, internal::None,
04584 internal::None, internal::None, internal::None, internal::None,
04585 internal::None, internal::None, internal::None, internal::None,
04586 internal::None, internal::None, internal::None, internal::None,
04587 internal::None, internal::None, internal::None, internal::None,
04588 internal::None, internal::None, internal::None, internal::None,
04589 internal::None, internal::None, internal::None, internal::None> {
04590 typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
04591 };
04592 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04593 typename T6, typename T7, typename T8, typename T9>
04594 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
04595 internal::None, internal::None, internal::None, internal::None,
04596 internal::None, internal::None, internal::None, internal::None,
04597 internal::None, internal::None, internal::None, internal::None,
04598 internal::None, internal::None, internal::None, internal::None,
04599 internal::None, internal::None, internal::None, internal::None,
04600 internal::None, internal::None, internal::None, internal::None,
04601 internal::None, internal::None, internal::None, internal::None,
04602 internal::None, internal::None, internal::None, internal::None,
04603 internal::None, internal::None, internal::None, internal::None,
04604 internal::None, internal::None, internal::None, internal::None> {
04605 typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
04606 };
04607 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04608 typename T6, typename T7, typename T8, typename T9, typename T10>
04609 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
04610 internal::None, internal::None, internal::None, internal::None,
04611 internal::None, internal::None, internal::None, internal::None,
04612 internal::None, internal::None, internal::None, internal::None,
04613 internal::None, internal::None, internal::None, internal::None,
04614 internal::None, internal::None, internal::None, internal::None,
04615 internal::None, internal::None, internal::None, internal::None,
04616 internal::None, internal::None, internal::None, internal::None,
04617 internal::None, internal::None, internal::None, internal::None,
04618 internal::None, internal::None, internal::None, internal::None,
04619 internal::None, internal::None, internal::None> {
04620 typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
04621 };
04622 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04623 typename T6, typename T7, typename T8, typename T9, typename T10,
04624 typename T11>
04625 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
04626 internal::None, internal::None, internal::None, internal::None,
04627 internal::None, internal::None, internal::None, internal::None,
04628 internal::None, internal::None, internal::None, internal::None,
04629 internal::None, internal::None, internal::None, internal::None,
04630 internal::None, internal::None, internal::None, internal::None,
04631 internal::None, internal::None, internal::None, internal::None,
04632 internal::None, internal::None, internal::None, internal::None,
04633 internal::None, internal::None, internal::None, internal::None,
04634 internal::None, internal::None, internal::None, internal::None,
04635 internal::None, internal::None> {
04636 typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
04637 };
04638 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04639 typename T6, typename T7, typename T8, typename T9, typename T10,
04640 typename T11, typename T12>
04641 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
04642 internal::None, internal::None, internal::None, internal::None,
04643 internal::None, internal::None, internal::None, internal::None,
04644 internal::None, internal::None, internal::None, internal::None,
04645 internal::None, internal::None, internal::None, internal::None,
04646 internal::None, internal::None, internal::None, internal::None,
04647 internal::None, internal::None, internal::None, internal::None,
04648 internal::None, internal::None, internal::None, internal::None,
04649 internal::None, internal::None, internal::None, internal::None,
04650 internal::None, internal::None, internal::None, internal::None,
04651 internal::None> {
04652 typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
04653 T12> type;
04654 };
04655 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04656 typename T6, typename T7, typename T8, typename T9, typename T10,
04657 typename T11, typename T12, typename T13>
04658 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
04659 internal::None, internal::None, internal::None, internal::None,
04660 internal::None, internal::None, internal::None, internal::None,
04661 internal::None, internal::None, internal::None, internal::None,
04662 internal::None, internal::None, internal::None, internal::None,
04663 internal::None, internal::None, internal::None, internal::None,
04664 internal::None, internal::None, internal::None, internal::None,
04665 internal::None, internal::None, internal::None, internal::None,
04666 internal::None, internal::None, internal::None, internal::None,
04667 internal::None, internal::None, internal::None, internal::None,
04668 internal::None> {
04669 typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04670 T13> type;
04671 };
04672 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04673 typename T6, typename T7, typename T8, typename T9, typename T10,
04674 typename T11, typename T12, typename T13, typename T14>
04675 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
04676 internal::None, internal::None, internal::None, internal::None,
04677 internal::None, internal::None, internal::None, internal::None,
04678 internal::None, internal::None, internal::None, internal::None,
04679 internal::None, internal::None, internal::None, internal::None,
04680 internal::None, internal::None, internal::None, internal::None,
04681 internal::None, internal::None, internal::None, internal::None,
04682 internal::None, internal::None, internal::None, internal::None,
04683 internal::None, internal::None, internal::None, internal::None,
04684 internal::None, internal::None, internal::None, internal::None> {
04685 typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04686 T13, T14> type;
04687 };
04688 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04689 typename T6, typename T7, typename T8, typename T9, typename T10,
04690 typename T11, typename T12, typename T13, typename T14, typename T15>
04691 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04692 internal::None, internal::None, internal::None, internal::None,
04693 internal::None, internal::None, internal::None, internal::None,
04694 internal::None, internal::None, internal::None, internal::None,
04695 internal::None, internal::None, internal::None, internal::None,
04696 internal::None, internal::None, internal::None, internal::None,
04697 internal::None, internal::None, internal::None, internal::None,
04698 internal::None, internal::None, internal::None, internal::None,
04699 internal::None, internal::None, internal::None, internal::None,
04700 internal::None, internal::None, internal::None> {
04701 typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04702 T13, T14, T15> type;
04703 };
04704 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04705 typename T6, typename T7, typename T8, typename T9, typename T10,
04706 typename T11, typename T12, typename T13, typename T14, typename T15,
04707 typename T16>
04708 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04709 T16, internal::None, internal::None, internal::None, internal::None,
04710 internal::None, internal::None, internal::None, internal::None,
04711 internal::None, internal::None, internal::None, internal::None,
04712 internal::None, internal::None, internal::None, internal::None,
04713 internal::None, internal::None, internal::None, internal::None,
04714 internal::None, internal::None, internal::None, internal::None,
04715 internal::None, internal::None, internal::None, internal::None,
04716 internal::None, internal::None, internal::None, internal::None,
04717 internal::None, internal::None> {
04718 typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04719 T13, T14, T15, T16> type;
04720 };
04721 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04722 typename T6, typename T7, typename T8, typename T9, typename T10,
04723 typename T11, typename T12, typename T13, typename T14, typename T15,
04724 typename T16, typename T17>
04725 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04726 T16, T17, internal::None, internal::None, internal::None, internal::None,
04727 internal::None, internal::None, internal::None, internal::None,
04728 internal::None, internal::None, internal::None, internal::None,
04729 internal::None, internal::None, internal::None, internal::None,
04730 internal::None, internal::None, internal::None, internal::None,
04731 internal::None, internal::None, internal::None, internal::None,
04732 internal::None, internal::None, internal::None, internal::None,
04733 internal::None, internal::None, internal::None, internal::None,
04734 internal::None> {
04735 typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04736 T13, T14, T15, T16, T17> type;
04737 };
04738 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04739 typename T6, typename T7, typename T8, typename T9, typename T10,
04740 typename T11, typename T12, typename T13, typename T14, typename T15,
04741 typename T16, typename T17, typename T18>
04742 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04743 T16, T17, T18, internal::None, internal::None, internal::None,
04744 internal::None, internal::None, internal::None, internal::None,
04745 internal::None, internal::None, internal::None, internal::None,
04746 internal::None, internal::None, internal::None, internal::None,
04747 internal::None, internal::None, internal::None, internal::None,
04748 internal::None, internal::None, internal::None, internal::None,
04749 internal::None, internal::None, internal::None, internal::None,
04750 internal::None, internal::None, internal::None, internal::None,
04751 internal::None> {
04752 typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04753 T13, T14, T15, T16, T17, T18> type;
04754 };
04755 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04756 typename T6, typename T7, typename T8, typename T9, typename T10,
04757 typename T11, typename T12, typename T13, typename T14, typename T15,
04758 typename T16, typename T17, typename T18, typename T19>
04759 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04760 T16, T17, T18, T19, internal::None, internal::None, internal::None,
04761 internal::None, internal::None, internal::None, internal::None,
04762 internal::None, internal::None, internal::None, internal::None,
04763 internal::None, internal::None, internal::None, internal::None,
04764 internal::None, internal::None, internal::None, internal::None,
04765 internal::None, internal::None, internal::None, internal::None,
04766 internal::None, internal::None, internal::None, internal::None,
04767 internal::None, internal::None, internal::None, internal::None> {
04768 typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04769 T13, T14, T15, T16, T17, T18, T19> type;
04770 };
04771 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04772 typename T6, typename T7, typename T8, typename T9, typename T10,
04773 typename T11, typename T12, typename T13, typename T14, typename T15,
04774 typename T16, typename T17, typename T18, typename T19, typename T20>
04775 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04776 T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
04777 internal::None, internal::None, internal::None, internal::None,
04778 internal::None, internal::None, internal::None, internal::None,
04779 internal::None, internal::None, internal::None, internal::None,
04780 internal::None, internal::None, internal::None, internal::None,
04781 internal::None, internal::None, internal::None, internal::None,
04782 internal::None, internal::None, internal::None, internal::None,
04783 internal::None, internal::None, internal::None> {
04784 typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04785 T13, T14, T15, T16, T17, T18, T19, T20> type;
04786 };
04787 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04788 typename T6, typename T7, typename T8, typename T9, typename T10,
04789 typename T11, typename T12, typename T13, typename T14, typename T15,
04790 typename T16, typename T17, typename T18, typename T19, typename T20,
04791 typename T21>
04792 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04793 T16, T17, T18, T19, T20, T21, internal::None, internal::None,
04794 internal::None, internal::None, internal::None, internal::None,
04795 internal::None, internal::None, internal::None, internal::None,
04796 internal::None, internal::None, internal::None, internal::None,
04797 internal::None, internal::None, internal::None, internal::None,
04798 internal::None, internal::None, internal::None, internal::None,
04799 internal::None, internal::None, internal::None, internal::None,
04800 internal::None, internal::None, internal::None> {
04801 typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04802 T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
04803 };
04804 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04805 typename T6, typename T7, typename T8, typename T9, typename T10,
04806 typename T11, typename T12, typename T13, typename T14, typename T15,
04807 typename T16, typename T17, typename T18, typename T19, typename T20,
04808 typename T21, typename T22>
04809 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04810 T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
04811 internal::None, internal::None, internal::None, internal::None,
04812 internal::None, internal::None, internal::None, internal::None,
04813 internal::None, internal::None, internal::None, internal::None,
04814 internal::None, internal::None, internal::None, internal::None,
04815 internal::None, internal::None, internal::None, internal::None,
04816 internal::None, internal::None, internal::None, internal::None,
04817 internal::None, internal::None> {
04818 typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04819 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
04820 };
04821 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04822 typename T6, typename T7, typename T8, typename T9, typename T10,
04823 typename T11, typename T12, typename T13, typename T14, typename T15,
04824 typename T16, typename T17, typename T18, typename T19, typename T20,
04825 typename T21, typename T22, typename T23>
04826 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04827 T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
04828 internal::None, internal::None, internal::None, internal::None,
04829 internal::None, internal::None, internal::None, internal::None,
04830 internal::None, internal::None, internal::None, internal::None,
04831 internal::None, internal::None, internal::None, internal::None,
04832 internal::None, internal::None, internal::None, internal::None,
04833 internal::None, internal::None, internal::None, internal::None,
04834 internal::None> {
04835 typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04836 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
04837 };
04838 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04839 typename T6, typename T7, typename T8, typename T9, typename T10,
04840 typename T11, typename T12, typename T13, typename T14, typename T15,
04841 typename T16, typename T17, typename T18, typename T19, typename T20,
04842 typename T21, typename T22, typename T23, typename T24>
04843 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04844 T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
04845 internal::None, internal::None, internal::None, internal::None,
04846 internal::None, internal::None, internal::None, internal::None,
04847 internal::None, internal::None, internal::None, internal::None,
04848 internal::None, internal::None, internal::None, internal::None,
04849 internal::None, internal::None, internal::None, internal::None,
04850 internal::None, internal::None, internal::None, internal::None,
04851 internal::None> {
04852 typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04853 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
04854 };
04855 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04856 typename T6, typename T7, typename T8, typename T9, typename T10,
04857 typename T11, typename T12, typename T13, typename T14, typename T15,
04858 typename T16, typename T17, typename T18, typename T19, typename T20,
04859 typename T21, typename T22, typename T23, typename T24, typename T25>
04860 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04861 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
04862 internal::None, internal::None, internal::None, internal::None,
04863 internal::None, internal::None, internal::None, internal::None,
04864 internal::None, internal::None, internal::None, internal::None,
04865 internal::None, internal::None, internal::None, internal::None,
04866 internal::None, internal::None, internal::None, internal::None,
04867 internal::None, internal::None, internal::None, internal::None> {
04868 typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04869 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
04870 };
04871 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04872 typename T6, typename T7, typename T8, typename T9, typename T10,
04873 typename T11, typename T12, typename T13, typename T14, typename T15,
04874 typename T16, typename T17, typename T18, typename T19, typename T20,
04875 typename T21, typename T22, typename T23, typename T24, typename T25,
04876 typename T26>
04877 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04878 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
04879 internal::None, internal::None, internal::None, internal::None,
04880 internal::None, internal::None, internal::None, internal::None,
04881 internal::None, internal::None, internal::None, internal::None,
04882 internal::None, internal::None, internal::None, internal::None,
04883 internal::None, internal::None, internal::None, internal::None,
04884 internal::None, internal::None, internal::None> {
04885 typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04886 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
04887 T26> type;
04888 };
04889 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04890 typename T6, typename T7, typename T8, typename T9, typename T10,
04891 typename T11, typename T12, typename T13, typename T14, typename T15,
04892 typename T16, typename T17, typename T18, typename T19, typename T20,
04893 typename T21, typename T22, typename T23, typename T24, typename T25,
04894 typename T26, typename T27>
04895 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04896 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
04897 internal::None, internal::None, internal::None, internal::None,
04898 internal::None, internal::None, internal::None, internal::None,
04899 internal::None, internal::None, internal::None, internal::None,
04900 internal::None, internal::None, internal::None, internal::None,
04901 internal::None, internal::None, internal::None, internal::None,
04902 internal::None, internal::None> {
04903 typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04904 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04905 T27> type;
04906 };
04907 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04908 typename T6, typename T7, typename T8, typename T9, typename T10,
04909 typename T11, typename T12, typename T13, typename T14, typename T15,
04910 typename T16, typename T17, typename T18, typename T19, typename T20,
04911 typename T21, typename T22, typename T23, typename T24, typename T25,
04912 typename T26, typename T27, typename T28>
04913 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04914 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
04915 internal::None, internal::None, internal::None, internal::None,
04916 internal::None, internal::None, internal::None, internal::None,
04917 internal::None, internal::None, internal::None, internal::None,
04918 internal::None, internal::None, internal::None, internal::None,
04919 internal::None, internal::None, internal::None, internal::None,
04920 internal::None, internal::None> {
04921 typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04922 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04923 T27, T28> type;
04924 };
04925 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04926 typename T6, typename T7, typename T8, typename T9, typename T10,
04927 typename T11, typename T12, typename T13, typename T14, typename T15,
04928 typename T16, typename T17, typename T18, typename T19, typename T20,
04929 typename T21, typename T22, typename T23, typename T24, typename T25,
04930 typename T26, typename T27, typename T28, typename T29>
04931 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04932 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
04933 internal::None, internal::None, internal::None, internal::None,
04934 internal::None, internal::None, internal::None, internal::None,
04935 internal::None, internal::None, internal::None, internal::None,
04936 internal::None, internal::None, internal::None, internal::None,
04937 internal::None, internal::None, internal::None, internal::None,
04938 internal::None> {
04939 typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04940 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04941 T27, T28, T29> type;
04942 };
04943 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04944 typename T6, typename T7, typename T8, typename T9, typename T10,
04945 typename T11, typename T12, typename T13, typename T14, typename T15,
04946 typename T16, typename T17, typename T18, typename T19, typename T20,
04947 typename T21, typename T22, typename T23, typename T24, typename T25,
04948 typename T26, typename T27, typename T28, typename T29, typename T30>
04949 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04950 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
04951 internal::None, internal::None, internal::None, internal::None,
04952 internal::None, internal::None, internal::None, internal::None,
04953 internal::None, internal::None, internal::None, internal::None,
04954 internal::None, internal::None, internal::None, internal::None,
04955 internal::None, internal::None, internal::None, internal::None> {
04956 typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04957 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04958 T27, T28, T29, T30> type;
04959 };
04960 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04961 typename T6, typename T7, typename T8, typename T9, typename T10,
04962 typename T11, typename T12, typename T13, typename T14, typename T15,
04963 typename T16, typename T17, typename T18, typename T19, typename T20,
04964 typename T21, typename T22, typename T23, typename T24, typename T25,
04965 typename T26, typename T27, typename T28, typename T29, typename T30,
04966 typename T31>
04967 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04968 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
04969 T31, internal::None, internal::None, internal::None, internal::None,
04970 internal::None, internal::None, internal::None, internal::None,
04971 internal::None, internal::None, internal::None, internal::None,
04972 internal::None, internal::None, internal::None, internal::None,
04973 internal::None, internal::None, internal::None> {
04974 typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04975 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04976 T27, T28, T29, T30, T31> type;
04977 };
04978 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04979 typename T6, typename T7, typename T8, typename T9, typename T10,
04980 typename T11, typename T12, typename T13, typename T14, typename T15,
04981 typename T16, typename T17, typename T18, typename T19, typename T20,
04982 typename T21, typename T22, typename T23, typename T24, typename T25,
04983 typename T26, typename T27, typename T28, typename T29, typename T30,
04984 typename T31, typename T32>
04985 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
04986 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
04987 T31, T32, internal::None, internal::None, internal::None, internal::None,
04988 internal::None, internal::None, internal::None, internal::None,
04989 internal::None, internal::None, internal::None, internal::None,
04990 internal::None, internal::None, internal::None, internal::None,
04991 internal::None, internal::None> {
04992 typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
04993 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
04994 T27, T28, T29, T30, T31, T32> type;
04995 };
04996 template <typename T1, typename T2, typename T3, typename T4, typename T5,
04997 typename T6, typename T7, typename T8, typename T9, typename T10,
04998 typename T11, typename T12, typename T13, typename T14, typename T15,
04999 typename T16, typename T17, typename T18, typename T19, typename T20,
05000 typename T21, typename T22, typename T23, typename T24, typename T25,
05001 typename T26, typename T27, typename T28, typename T29, typename T30,
05002 typename T31, typename T32, typename T33>
05003 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05004 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05005 T31, T32, T33, internal::None, internal::None, internal::None,
05006 internal::None, internal::None, internal::None, internal::None,
05007 internal::None, internal::None, internal::None, internal::None,
05008 internal::None, internal::None, internal::None, internal::None,
05009 internal::None, internal::None> {
05010 typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05011 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05012 T27, T28, T29, T30, T31, T32, T33> type;
05013 };
05014 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05015 typename T6, typename T7, typename T8, typename T9, typename T10,
05016 typename T11, typename T12, typename T13, typename T14, typename T15,
05017 typename T16, typename T17, typename T18, typename T19, typename T20,
05018 typename T21, typename T22, typename T23, typename T24, typename T25,
05019 typename T26, typename T27, typename T28, typename T29, typename T30,
05020 typename T31, typename T32, typename T33, typename T34>
05021 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05022 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05023 T31, T32, T33, T34, internal::None, internal::None, internal::None,
05024 internal::None, internal::None, internal::None, internal::None,
05025 internal::None, internal::None, internal::None, internal::None,
05026 internal::None, internal::None, internal::None, internal::None,
05027 internal::None> {
05028 typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05029 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05030 T27, T28, T29, T30, T31, T32, T33, T34> type;
05031 };
05032 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05033 typename T6, typename T7, typename T8, typename T9, typename T10,
05034 typename T11, typename T12, typename T13, typename T14, typename T15,
05035 typename T16, typename T17, typename T18, typename T19, typename T20,
05036 typename T21, typename T22, typename T23, typename T24, typename T25,
05037 typename T26, typename T27, typename T28, typename T29, typename T30,
05038 typename T31, typename T32, typename T33, typename T34, typename T35>
05039 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05040 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05041 T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
05042 internal::None, internal::None, internal::None, internal::None,
05043 internal::None, internal::None, internal::None, internal::None,
05044 internal::None, internal::None, internal::None, internal::None> {
05045 typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05046 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05047 T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
05048 };
05049 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05050 typename T6, typename T7, typename T8, typename T9, typename T10,
05051 typename T11, typename T12, typename T13, typename T14, typename T15,
05052 typename T16, typename T17, typename T18, typename T19, typename T20,
05053 typename T21, typename T22, typename T23, typename T24, typename T25,
05054 typename T26, typename T27, typename T28, typename T29, typename T30,
05055 typename T31, typename T32, typename T33, typename T34, typename T35,
05056 typename T36>
05057 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05058 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05059 T31, T32, T33, T34, T35, T36, internal::None, internal::None,
05060 internal::None, internal::None, internal::None, internal::None,
05061 internal::None, internal::None, internal::None, internal::None,
05062 internal::None, internal::None, internal::None, internal::None> {
05063 typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05064 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05065 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
05066 };
05067 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05068 typename T6, typename T7, typename T8, typename T9, typename T10,
05069 typename T11, typename T12, typename T13, typename T14, typename T15,
05070 typename T16, typename T17, typename T18, typename T19, typename T20,
05071 typename T21, typename T22, typename T23, typename T24, typename T25,
05072 typename T26, typename T27, typename T28, typename T29, typename T30,
05073 typename T31, typename T32, typename T33, typename T34, typename T35,
05074 typename T36, typename T37>
05075 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05076 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05077 T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
05078 internal::None, internal::None, internal::None, internal::None,
05079 internal::None, internal::None, internal::None, internal::None,
05080 internal::None, internal::None, internal::None> {
05081 typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05082 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05083 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
05084 };
05085 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05086 typename T6, typename T7, typename T8, typename T9, typename T10,
05087 typename T11, typename T12, typename T13, typename T14, typename T15,
05088 typename T16, typename T17, typename T18, typename T19, typename T20,
05089 typename T21, typename T22, typename T23, typename T24, typename T25,
05090 typename T26, typename T27, typename T28, typename T29, typename T30,
05091 typename T31, typename T32, typename T33, typename T34, typename T35,
05092 typename T36, typename T37, typename T38>
05093 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05094 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05095 T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
05096 internal::None, internal::None, internal::None, internal::None,
05097 internal::None, internal::None, internal::None, internal::None,
05098 internal::None, internal::None> {
05099 typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05100 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05101 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
05102 };
05103 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05104 typename T6, typename T7, typename T8, typename T9, typename T10,
05105 typename T11, typename T12, typename T13, typename T14, typename T15,
05106 typename T16, typename T17, typename T18, typename T19, typename T20,
05107 typename T21, typename T22, typename T23, typename T24, typename T25,
05108 typename T26, typename T27, typename T28, typename T29, typename T30,
05109 typename T31, typename T32, typename T33, typename T34, typename T35,
05110 typename T36, typename T37, typename T38, typename T39>
05111 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05112 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05113 T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
05114 internal::None, internal::None, internal::None, internal::None,
05115 internal::None, internal::None, internal::None, internal::None,
05116 internal::None, internal::None> {
05117 typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05118 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05119 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
05120 };
05121 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05122 typename T6, typename T7, typename T8, typename T9, typename T10,
05123 typename T11, typename T12, typename T13, typename T14, typename T15,
05124 typename T16, typename T17, typename T18, typename T19, typename T20,
05125 typename T21, typename T22, typename T23, typename T24, typename T25,
05126 typename T26, typename T27, typename T28, typename T29, typename T30,
05127 typename T31, typename T32, typename T33, typename T34, typename T35,
05128 typename T36, typename T37, typename T38, typename T39, typename T40>
05129 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05130 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05131 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
05132 internal::None, internal::None, internal::None, internal::None,
05133 internal::None, internal::None, internal::None, internal::None,
05134 internal::None> {
05135 typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05136 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05137 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
05138 T40> type;
05139 };
05140 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05141 typename T6, typename T7, typename T8, typename T9, typename T10,
05142 typename T11, typename T12, typename T13, typename T14, typename T15,
05143 typename T16, typename T17, typename T18, typename T19, typename T20,
05144 typename T21, typename T22, typename T23, typename T24, typename T25,
05145 typename T26, typename T27, typename T28, typename T29, typename T30,
05146 typename T31, typename T32, typename T33, typename T34, typename T35,
05147 typename T36, typename T37, typename T38, typename T39, typename T40,
05148 typename T41>
05149 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05150 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05151 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
05152 internal::None, internal::None, internal::None, internal::None,
05153 internal::None, internal::None, internal::None, internal::None> {
05154 typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05155 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05156 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05157 T41> type;
05158 };
05159 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05160 typename T6, typename T7, typename T8, typename T9, typename T10,
05161 typename T11, typename T12, typename T13, typename T14, typename T15,
05162 typename T16, typename T17, typename T18, typename T19, typename T20,
05163 typename T21, typename T22, typename T23, typename T24, typename T25,
05164 typename T26, typename T27, typename T28, typename T29, typename T30,
05165 typename T31, typename T32, typename T33, typename T34, typename T35,
05166 typename T36, typename T37, typename T38, typename T39, typename T40,
05167 typename T41, typename T42>
05168 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05169 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05170 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
05171 internal::None, internal::None, internal::None, internal::None,
05172 internal::None, internal::None, internal::None> {
05173 typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05174 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05175 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05176 T41, T42> type;
05177 };
05178 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05179 typename T6, typename T7, typename T8, typename T9, typename T10,
05180 typename T11, typename T12, typename T13, typename T14, typename T15,
05181 typename T16, typename T17, typename T18, typename T19, typename T20,
05182 typename T21, typename T22, typename T23, typename T24, typename T25,
05183 typename T26, typename T27, typename T28, typename T29, typename T30,
05184 typename T31, typename T32, typename T33, typename T34, typename T35,
05185 typename T36, typename T37, typename T38, typename T39, typename T40,
05186 typename T41, typename T42, typename T43>
05187 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05188 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05189 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
05190 internal::None, internal::None, internal::None, internal::None,
05191 internal::None, internal::None, internal::None> {
05192 typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05193 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05194 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05195 T41, T42, T43> type;
05196 };
05197 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05198 typename T6, typename T7, typename T8, typename T9, typename T10,
05199 typename T11, typename T12, typename T13, typename T14, typename T15,
05200 typename T16, typename T17, typename T18, typename T19, typename T20,
05201 typename T21, typename T22, typename T23, typename T24, typename T25,
05202 typename T26, typename T27, typename T28, typename T29, typename T30,
05203 typename T31, typename T32, typename T33, typename T34, typename T35,
05204 typename T36, typename T37, typename T38, typename T39, typename T40,
05205 typename T41, typename T42, typename T43, typename T44>
05206 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05207 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05208 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
05209 internal::None, internal::None, internal::None, internal::None,
05210 internal::None, internal::None> {
05211 typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05212 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05213 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05214 T41, T42, T43, T44> type;
05215 };
05216 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05217 typename T6, typename T7, typename T8, typename T9, typename T10,
05218 typename T11, typename T12, typename T13, typename T14, typename T15,
05219 typename T16, typename T17, typename T18, typename T19, typename T20,
05220 typename T21, typename T22, typename T23, typename T24, typename T25,
05221 typename T26, typename T27, typename T28, typename T29, typename T30,
05222 typename T31, typename T32, typename T33, typename T34, typename T35,
05223 typename T36, typename T37, typename T38, typename T39, typename T40,
05224 typename T41, typename T42, typename T43, typename T44, typename T45>
05225 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05226 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05227 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
05228 internal::None, internal::None, internal::None, internal::None,
05229 internal::None> {
05230 typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05231 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05232 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05233 T41, T42, T43, T44, T45> type;
05234 };
05235 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05236 typename T6, typename T7, typename T8, typename T9, typename T10,
05237 typename T11, typename T12, typename T13, typename T14, typename T15,
05238 typename T16, typename T17, typename T18, typename T19, typename T20,
05239 typename T21, typename T22, typename T23, typename T24, typename T25,
05240 typename T26, typename T27, typename T28, typename T29, typename T30,
05241 typename T31, typename T32, typename T33, typename T34, typename T35,
05242 typename T36, typename T37, typename T38, typename T39, typename T40,
05243 typename T41, typename T42, typename T43, typename T44, typename T45,
05244 typename T46>
05245 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05246 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05247 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
05248 T46, internal::None, internal::None, internal::None, internal::None> {
05249 typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05250 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05251 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05252 T41, T42, T43, T44, T45, T46> type;
05253 };
05254 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05255 typename T6, typename T7, typename T8, typename T9, typename T10,
05256 typename T11, typename T12, typename T13, typename T14, typename T15,
05257 typename T16, typename T17, typename T18, typename T19, typename T20,
05258 typename T21, typename T22, typename T23, typename T24, typename T25,
05259 typename T26, typename T27, typename T28, typename T29, typename T30,
05260 typename T31, typename T32, typename T33, typename T34, typename T35,
05261 typename T36, typename T37, typename T38, typename T39, typename T40,
05262 typename T41, typename T42, typename T43, typename T44, typename T45,
05263 typename T46, typename T47>
05264 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05265 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05266 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
05267 T46, T47, internal::None, internal::None, internal::None> {
05268 typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05269 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05270 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05271 T41, T42, T43, T44, T45, T46, T47> type;
05272 };
05273 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05274 typename T6, typename T7, typename T8, typename T9, typename T10,
05275 typename T11, typename T12, typename T13, typename T14, typename T15,
05276 typename T16, typename T17, typename T18, typename T19, typename T20,
05277 typename T21, typename T22, typename T23, typename T24, typename T25,
05278 typename T26, typename T27, typename T28, typename T29, typename T30,
05279 typename T31, typename T32, typename T33, typename T34, typename T35,
05280 typename T36, typename T37, typename T38, typename T39, typename T40,
05281 typename T41, typename T42, typename T43, typename T44, typename T45,
05282 typename T46, typename T47, typename T48>
05283 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05284 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05285 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
05286 T46, T47, T48, internal::None, internal::None> {
05287 typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05288 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05289 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05290 T41, T42, T43, T44, T45, T46, T47, T48> type;
05291 };
05292 template <typename T1, typename T2, typename T3, typename T4, typename T5,
05293 typename T6, typename T7, typename T8, typename T9, typename T10,
05294 typename T11, typename T12, typename T13, typename T14, typename T15,
05295 typename T16, typename T17, typename T18, typename T19, typename T20,
05296 typename T21, typename T22, typename T23, typename T24, typename T25,
05297 typename T26, typename T27, typename T28, typename T29, typename T30,
05298 typename T31, typename T32, typename T33, typename T34, typename T35,
05299 typename T36, typename T37, typename T38, typename T39, typename T40,
05300 typename T41, typename T42, typename T43, typename T44, typename T45,
05301 typename T46, typename T47, typename T48, typename T49>
05302 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
05303 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
05304 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
05305 T46, T47, T48, T49, internal::None> {
05306 typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
05307 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
05308 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
05309 T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
05310 };
05311
05312 namespace internal {
05313
05314 # define GTEST_TEMPLATE_ template <typename T> class
05315
05316
05317
05318
05319
05320
05321
05322
05323
05324 template <GTEST_TEMPLATE_ Tmpl>
05325 struct TemplateSel {
05326 template <typename T>
05327 struct Bind {
05328 typedef Tmpl<T> type;
05329 };
05330 };
05331
05332 # define GTEST_BIND_(TmplSel, T) \
05333 TmplSel::template Bind<T>::type
05334
05335
05336
05337
05338
05339 template <typename T>
05340 struct NoneT {};
05341
05342
05343
05344
05345
05346
05347
05348
05349
05350 struct Templates0 {};
05351
05352
05353
05354 template <GTEST_TEMPLATE_ T1>
05355 struct Templates1 {
05356 typedef TemplateSel<T1> Head;
05357 typedef Templates0 Tail;
05358 };
05359 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
05360 struct Templates2 {
05361 typedef TemplateSel<T1> Head;
05362 typedef Templates1<T2> Tail;
05363 };
05364
05365 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
05366 struct Templates3 {
05367 typedef TemplateSel<T1> Head;
05368 typedef Templates2<T2, T3> Tail;
05369 };
05370
05371 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05372 GTEST_TEMPLATE_ T4>
05373 struct Templates4 {
05374 typedef TemplateSel<T1> Head;
05375 typedef Templates3<T2, T3, T4> Tail;
05376 };
05377
05378 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05379 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
05380 struct Templates5 {
05381 typedef TemplateSel<T1> Head;
05382 typedef Templates4<T2, T3, T4, T5> Tail;
05383 };
05384
05385 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05386 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
05387 struct Templates6 {
05388 typedef TemplateSel<T1> Head;
05389 typedef Templates5<T2, T3, T4, T5, T6> Tail;
05390 };
05391
05392 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05393 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05394 GTEST_TEMPLATE_ T7>
05395 struct Templates7 {
05396 typedef TemplateSel<T1> Head;
05397 typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
05398 };
05399
05400 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05401 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05402 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
05403 struct Templates8 {
05404 typedef TemplateSel<T1> Head;
05405 typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
05406 };
05407
05408 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05409 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05410 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
05411 struct Templates9 {
05412 typedef TemplateSel<T1> Head;
05413 typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
05414 };
05415
05416 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05417 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05418 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05419 GTEST_TEMPLATE_ T10>
05420 struct Templates10 {
05421 typedef TemplateSel<T1> Head;
05422 typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
05423 };
05424
05425 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05426 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05427 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05428 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
05429 struct Templates11 {
05430 typedef TemplateSel<T1> Head;
05431 typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
05432 };
05433
05434 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05435 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05436 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05437 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
05438 struct Templates12 {
05439 typedef TemplateSel<T1> Head;
05440 typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
05441 };
05442
05443 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05444 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05445 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05446 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05447 GTEST_TEMPLATE_ T13>
05448 struct Templates13 {
05449 typedef TemplateSel<T1> Head;
05450 typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
05451 };
05452
05453 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05454 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05455 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05456 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05457 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
05458 struct Templates14 {
05459 typedef TemplateSel<T1> Head;
05460 typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
05461 T14> Tail;
05462 };
05463
05464 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05465 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05466 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05467 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05468 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
05469 struct Templates15 {
05470 typedef TemplateSel<T1> Head;
05471 typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05472 T15> Tail;
05473 };
05474
05475 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05476 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05477 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05478 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05479 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05480 GTEST_TEMPLATE_ T16>
05481 struct Templates16 {
05482 typedef TemplateSel<T1> Head;
05483 typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05484 T15, T16> Tail;
05485 };
05486
05487 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05488 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05489 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05490 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05491 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05492 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
05493 struct Templates17 {
05494 typedef TemplateSel<T1> Head;
05495 typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05496 T15, T16, T17> Tail;
05497 };
05498
05499 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05500 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05501 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05502 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05503 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05504 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
05505 struct Templates18 {
05506 typedef TemplateSel<T1> Head;
05507 typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05508 T15, T16, T17, T18> Tail;
05509 };
05510
05511 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05512 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05513 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05514 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05515 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05516 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05517 GTEST_TEMPLATE_ T19>
05518 struct Templates19 {
05519 typedef TemplateSel<T1> Head;
05520 typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05521 T15, T16, T17, T18, T19> Tail;
05522 };
05523
05524 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05525 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05526 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05527 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05528 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05529 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05530 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
05531 struct Templates20 {
05532 typedef TemplateSel<T1> Head;
05533 typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05534 T15, T16, T17, T18, T19, T20> Tail;
05535 };
05536
05537 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05538 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05539 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05540 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05541 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05542 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05543 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
05544 struct Templates21 {
05545 typedef TemplateSel<T1> Head;
05546 typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05547 T15, T16, T17, T18, T19, T20, T21> Tail;
05548 };
05549
05550 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05551 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05552 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05553 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05554 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05555 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05556 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05557 GTEST_TEMPLATE_ T22>
05558 struct Templates22 {
05559 typedef TemplateSel<T1> Head;
05560 typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05561 T15, T16, T17, T18, T19, T20, T21, T22> Tail;
05562 };
05563
05564 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05565 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05566 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05567 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05568 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05569 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05570 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05571 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
05572 struct Templates23 {
05573 typedef TemplateSel<T1> Head;
05574 typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05575 T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
05576 };
05577
05578 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05579 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05580 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05581 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05582 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05583 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05584 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05585 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
05586 struct Templates24 {
05587 typedef TemplateSel<T1> Head;
05588 typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05589 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
05590 };
05591
05592 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05593 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05594 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05595 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05596 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05597 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05598 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05599 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05600 GTEST_TEMPLATE_ T25>
05601 struct Templates25 {
05602 typedef TemplateSel<T1> Head;
05603 typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05604 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
05605 };
05606
05607 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05608 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05609 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05610 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05611 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05612 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05613 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05614 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05615 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
05616 struct Templates26 {
05617 typedef TemplateSel<T1> Head;
05618 typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05619 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
05620 };
05621
05622 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05623 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05624 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05625 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05626 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05627 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05628 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05629 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05630 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
05631 struct Templates27 {
05632 typedef TemplateSel<T1> Head;
05633 typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05634 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
05635 };
05636
05637 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05638 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05639 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05640 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05641 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05642 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05643 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05644 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05645 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05646 GTEST_TEMPLATE_ T28>
05647 struct Templates28 {
05648 typedef TemplateSel<T1> Head;
05649 typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05650 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
05651 T28> Tail;
05652 };
05653
05654 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05655 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05656 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05657 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05658 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05659 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05660 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05661 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05662 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05663 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
05664 struct Templates29 {
05665 typedef TemplateSel<T1> Head;
05666 typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05667 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05668 T29> Tail;
05669 };
05670
05671 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05672 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05673 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05674 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05675 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05676 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05677 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05678 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05679 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05680 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
05681 struct Templates30 {
05682 typedef TemplateSel<T1> Head;
05683 typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05684 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05685 T29, T30> Tail;
05686 };
05687
05688 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05689 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05690 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05691 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05692 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05693 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05694 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05695 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05696 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05697 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05698 GTEST_TEMPLATE_ T31>
05699 struct Templates31 {
05700 typedef TemplateSel<T1> Head;
05701 typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05702 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05703 T29, T30, T31> Tail;
05704 };
05705
05706 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05707 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05708 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05709 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05710 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05711 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05712 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05713 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05714 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05715 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05716 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
05717 struct Templates32 {
05718 typedef TemplateSel<T1> Head;
05719 typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05720 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05721 T29, T30, T31, T32> Tail;
05722 };
05723
05724 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05725 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05726 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05727 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05728 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05729 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05730 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05731 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05732 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05733 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05734 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
05735 struct Templates33 {
05736 typedef TemplateSel<T1> Head;
05737 typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05738 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05739 T29, T30, T31, T32, T33> Tail;
05740 };
05741
05742 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05743 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05744 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05745 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05746 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05747 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05748 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05749 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05750 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05751 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05752 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05753 GTEST_TEMPLATE_ T34>
05754 struct Templates34 {
05755 typedef TemplateSel<T1> Head;
05756 typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05757 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05758 T29, T30, T31, T32, T33, T34> Tail;
05759 };
05760
05761 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05762 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05763 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05764 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05765 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05766 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05767 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05768 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05769 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05770 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05771 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05772 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
05773 struct Templates35 {
05774 typedef TemplateSel<T1> Head;
05775 typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05776 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05777 T29, T30, T31, T32, T33, T34, T35> Tail;
05778 };
05779
05780 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05781 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05782 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05783 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05784 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05785 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05786 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05787 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05788 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05789 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05790 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05791 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
05792 struct Templates36 {
05793 typedef TemplateSel<T1> Head;
05794 typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05795 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05796 T29, T30, T31, T32, T33, T34, T35, T36> Tail;
05797 };
05798
05799 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05800 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05801 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05802 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05803 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05804 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05805 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05806 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05807 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05808 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05809 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05810 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05811 GTEST_TEMPLATE_ T37>
05812 struct Templates37 {
05813 typedef TemplateSel<T1> Head;
05814 typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05815 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05816 T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
05817 };
05818
05819 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05820 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05821 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05822 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05823 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05824 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05825 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05826 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05827 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05828 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05829 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05830 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05831 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
05832 struct Templates38 {
05833 typedef TemplateSel<T1> Head;
05834 typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05835 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05836 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
05837 };
05838
05839 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05840 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05841 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05842 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05843 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05844 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05845 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05846 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05847 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05848 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05849 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05850 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05851 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
05852 struct Templates39 {
05853 typedef TemplateSel<T1> Head;
05854 typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05855 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05856 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
05857 };
05858
05859 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05860 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05861 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05862 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05863 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05864 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05865 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05866 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05867 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05868 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05869 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05870 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05871 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
05872 GTEST_TEMPLATE_ T40>
05873 struct Templates40 {
05874 typedef TemplateSel<T1> Head;
05875 typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05876 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05877 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
05878 };
05879
05880 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05881 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05882 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05883 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05884 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05885 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05886 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05887 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05888 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05889 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05890 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05891 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05892 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
05893 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
05894 struct Templates41 {
05895 typedef TemplateSel<T1> Head;
05896 typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05897 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05898 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
05899 };
05900
05901 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05902 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05903 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05904 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05905 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05906 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05907 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05908 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05909 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05910 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05911 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05912 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05913 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
05914 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
05915 struct Templates42 {
05916 typedef TemplateSel<T1> Head;
05917 typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05918 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05919 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
05920 T42> Tail;
05921 };
05922
05923 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05924 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05925 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05926 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05927 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05928 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05929 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05930 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05931 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05932 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05933 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05934 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05935 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
05936 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
05937 GTEST_TEMPLATE_ T43>
05938 struct Templates43 {
05939 typedef TemplateSel<T1> Head;
05940 typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05941 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05942 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
05943 T43> Tail;
05944 };
05945
05946 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05947 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05948 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05949 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05950 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05951 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05952 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05953 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05954 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05955 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05956 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05957 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05958 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
05959 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
05960 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
05961 struct Templates44 {
05962 typedef TemplateSel<T1> Head;
05963 typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05964 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05965 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
05966 T43, T44> Tail;
05967 };
05968
05969 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05970 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05971 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05972 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05973 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05974 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05975 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05976 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
05977 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
05978 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
05979 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
05980 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
05981 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
05982 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
05983 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
05984 struct Templates45 {
05985 typedef TemplateSel<T1> Head;
05986 typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
05987 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
05988 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
05989 T43, T44, T45> Tail;
05990 };
05991
05992 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
05993 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
05994 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
05995 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
05996 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
05997 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
05998 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
05999 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06000 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06001 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06002 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06003 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06004 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06005 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06006 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06007 GTEST_TEMPLATE_ T46>
06008 struct Templates46 {
06009 typedef TemplateSel<T1> Head;
06010 typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06011 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
06012 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
06013 T43, T44, T45, T46> Tail;
06014 };
06015
06016 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06017 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06018 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06019 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06020 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06021 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06022 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06023 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06024 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06025 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06026 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06027 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06028 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06029 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06030 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06031 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
06032 struct Templates47 {
06033 typedef TemplateSel<T1> Head;
06034 typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06035 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
06036 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
06037 T43, T44, T45, T46, T47> Tail;
06038 };
06039
06040 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06041 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06042 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06043 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06044 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06045 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06046 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06047 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06048 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06049 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06050 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06051 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06052 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06053 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06054 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06055 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
06056 struct Templates48 {
06057 typedef TemplateSel<T1> Head;
06058 typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06059 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
06060 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
06061 T43, T44, T45, T46, T47, T48> Tail;
06062 };
06063
06064 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06065 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06066 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06067 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06068 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06069 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06070 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06071 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06072 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06073 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06074 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06075 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06076 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06077 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06078 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06079 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
06080 GTEST_TEMPLATE_ T49>
06081 struct Templates49 {
06082 typedef TemplateSel<T1> Head;
06083 typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06084 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
06085 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
06086 T43, T44, T45, T46, T47, T48, T49> Tail;
06087 };
06088
06089 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06090 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06091 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06092 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06093 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06094 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06095 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06096 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06097 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06098 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06099 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06100 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06101 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06102 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06103 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06104 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
06105 GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
06106 struct Templates50 {
06107 typedef TemplateSel<T1> Head;
06108 typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06109 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
06110 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
06111 T43, T44, T45, T46, T47, T48, T49, T50> Tail;
06112 };
06113
06114
06115
06116
06117
06118
06119
06120
06121
06122
06123
06124
06125
06126
06127
06128 template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
06129 GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
06130 GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
06131 GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
06132 GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
06133 GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
06134 GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
06135 GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
06136 GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
06137 GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
06138 GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
06139 GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
06140 GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
06141 GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
06142 GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
06143 GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
06144 GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
06145 GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
06146 GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
06147 GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
06148 GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
06149 GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
06150 GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
06151 GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
06152 GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
06153 struct Templates {
06154 typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06155 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06156 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06157 T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
06158 };
06159
06160 template <>
06161 struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06162 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06163 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06164 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06165 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06166 NoneT> {
06167 typedef Templates0 type;
06168 };
06169 template <GTEST_TEMPLATE_ T1>
06170 struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06171 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06172 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06173 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06174 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06175 NoneT> {
06176 typedef Templates1<T1> type;
06177 };
06178 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
06179 struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06180 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06181 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06182 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06183 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06184 NoneT> {
06185 typedef Templates2<T1, T2> type;
06186 };
06187 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
06188 struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06189 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06190 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06191 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06192 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06193 typedef Templates3<T1, T2, T3> type;
06194 };
06195 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06196 GTEST_TEMPLATE_ T4>
06197 struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06198 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06199 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06200 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06201 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06202 typedef Templates4<T1, T2, T3, T4> type;
06203 };
06204 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06205 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
06206 struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06207 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06208 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06209 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06210 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06211 typedef Templates5<T1, T2, T3, T4, T5> type;
06212 };
06213 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06214 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
06215 struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
06216 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06217 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06218 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06219 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06220 typedef Templates6<T1, T2, T3, T4, T5, T6> type;
06221 };
06222 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06223 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06224 GTEST_TEMPLATE_ T7>
06225 struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
06226 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06227 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06228 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06229 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06230 typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
06231 };
06232 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06233 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06234 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
06235 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
06236 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06237 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06238 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06239 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06240 typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
06241 };
06242 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06243 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06244 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
06245 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
06246 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06247 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06248 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06249 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06250 typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
06251 };
06252 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06253 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06254 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06255 GTEST_TEMPLATE_ T10>
06256 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
06257 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06258 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06259 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06260 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06261 typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
06262 };
06263 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06264 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06265 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06266 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
06267 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
06268 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06269 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06270 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06271 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06272 typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
06273 };
06274 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06275 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06276 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06277 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
06278 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
06279 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06280 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06281 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06282 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06283 typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
06284 };
06285 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06286 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06287 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06288 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06289 GTEST_TEMPLATE_ T13>
06290 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
06291 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06292 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06293 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06294 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06295 typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
06296 T13> type;
06297 };
06298 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06299 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06300 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06301 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06302 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
06303 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06304 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06305 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06306 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06307 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06308 typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06309 T14> type;
06310 };
06311 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06312 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06313 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06314 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06315 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
06316 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06317 T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06318 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06319 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06320 NoneT, NoneT, NoneT, NoneT, NoneT> {
06321 typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06322 T14, T15> type;
06323 };
06324 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06325 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06326 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06327 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06328 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06329 GTEST_TEMPLATE_ T16>
06330 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06331 T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06332 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06333 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06334 NoneT, NoneT, NoneT, NoneT, NoneT> {
06335 typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06336 T14, T15, T16> type;
06337 };
06338 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06339 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06340 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06341 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06342 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06343 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
06344 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06345 T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06346 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06347 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06348 NoneT, NoneT, NoneT, NoneT, NoneT> {
06349 typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06350 T14, T15, T16, T17> type;
06351 };
06352 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06353 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06354 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06355 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06356 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06357 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
06358 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06359 T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06360 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06361 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06362 NoneT, NoneT, NoneT, NoneT> {
06363 typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06364 T14, T15, T16, T17, T18> type;
06365 };
06366 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06367 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06368 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06369 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06370 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06371 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06372 GTEST_TEMPLATE_ T19>
06373 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06374 T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06375 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06376 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06377 NoneT, NoneT, NoneT, NoneT> {
06378 typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06379 T14, T15, T16, T17, T18, T19> type;
06380 };
06381 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06382 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06383 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06384 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06385 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06386 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06387 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
06388 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06389 T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06390 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06391 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06392 NoneT, NoneT, NoneT, NoneT> {
06393 typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06394 T14, T15, T16, T17, T18, T19, T20> type;
06395 };
06396 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06397 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06398 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06399 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06400 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06401 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06402 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
06403 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06404 T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
06405 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06406 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06407 NoneT, NoneT, NoneT, NoneT> {
06408 typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06409 T14, T15, T16, T17, T18, T19, T20, T21> type;
06410 };
06411 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06412 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06413 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06414 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06415 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06416 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06417 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06418 GTEST_TEMPLATE_ T22>
06419 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06420 T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
06421 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06422 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06423 NoneT, NoneT, NoneT> {
06424 typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06425 T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
06426 };
06427 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06428 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06429 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06430 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06431 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06432 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06433 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06434 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
06435 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06436 T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
06437 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06438 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06439 NoneT, NoneT, NoneT> {
06440 typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06441 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
06442 };
06443 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06444 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06445 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06446 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06447 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06448 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06449 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06450 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
06451 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06452 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
06453 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06454 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06455 NoneT, NoneT, NoneT> {
06456 typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06457 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
06458 };
06459 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06460 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06461 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06462 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06463 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06464 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06465 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06466 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06467 GTEST_TEMPLATE_ T25>
06468 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06469 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
06470 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06471 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06472 NoneT, NoneT> {
06473 typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06474 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
06475 };
06476 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06477 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06478 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06479 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06480 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06481 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06482 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06483 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06484 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
06485 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06486 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
06487 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06488 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06489 NoneT, NoneT> {
06490 typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06491 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
06492 };
06493 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06494 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06495 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06496 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06497 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06498 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06499 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06500 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06501 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
06502 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06503 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
06504 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06505 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06506 NoneT, NoneT> {
06507 typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06508 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
06509 T27> type;
06510 };
06511 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06512 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06513 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06514 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06515 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06516 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06517 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06518 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06519 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06520 GTEST_TEMPLATE_ T28>
06521 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06522 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
06523 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06524 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06525 NoneT, NoneT> {
06526 typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06527 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06528 T28> type;
06529 };
06530 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06531 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06532 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06533 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06534 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06535 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06536 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06537 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06538 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06539 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
06540 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06541 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06542 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06543 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06544 NoneT> {
06545 typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06546 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06547 T28, T29> type;
06548 };
06549 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06550 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06551 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06552 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06553 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06554 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06555 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06556 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06557 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06558 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
06559 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06560 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06561 T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06562 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06563 typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06564 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06565 T28, T29, T30> type;
06566 };
06567 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06568 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06569 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06570 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06571 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06572 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06573 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06574 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06575 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06576 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06577 GTEST_TEMPLATE_ T31>
06578 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06579 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06580 T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06581 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06582 typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06583 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06584 T28, T29, T30, T31> type;
06585 };
06586 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06587 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06588 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06589 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06590 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06591 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06592 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06593 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06594 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06595 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06596 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
06597 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06598 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06599 T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06600 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06601 typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06602 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06603 T28, T29, T30, T31, T32> type;
06604 };
06605 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06606 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06607 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06608 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06609 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06610 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06611 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06612 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06613 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06614 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06615 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
06616 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06617 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06618 T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06619 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06620 typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06621 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06622 T28, T29, T30, T31, T32, T33> type;
06623 };
06624 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06625 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06626 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06627 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06628 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06629 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06630 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06631 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06632 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06633 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06634 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06635 GTEST_TEMPLATE_ T34>
06636 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06637 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06638 T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06639 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06640 typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06641 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06642 T28, T29, T30, T31, T32, T33, T34> type;
06643 };
06644 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06645 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06646 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06647 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06648 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06649 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06650 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06651 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06652 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06653 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06654 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06655 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
06656 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06657 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06658 T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
06659 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06660 typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06661 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06662 T28, T29, T30, T31, T32, T33, T34, T35> type;
06663 };
06664 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06665 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06666 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06667 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06668 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06669 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06670 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06671 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06672 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06673 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06674 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06675 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
06676 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06677 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06678 T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
06679 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06680 typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06681 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06682 T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
06683 };
06684 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06685 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06686 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06687 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06688 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06689 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06690 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06691 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06692 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06693 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06694 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06695 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06696 GTEST_TEMPLATE_ T37>
06697 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06698 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06699 T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
06700 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06701 typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06702 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06703 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
06704 };
06705 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06706 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06707 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06708 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06709 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06710 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06711 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06712 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06713 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06714 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06715 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06716 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06717 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
06718 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06719 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06720 T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
06721 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06722 typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06723 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06724 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
06725 };
06726 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06727 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06728 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06729 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06730 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06731 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06732 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06733 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06734 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06735 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06736 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06737 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06738 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
06739 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06740 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06741 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
06742 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06743 typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06744 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06745 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
06746 };
06747 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06748 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06749 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06750 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06751 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06752 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06753 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06754 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06755 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06756 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06757 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06758 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06759 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06760 GTEST_TEMPLATE_ T40>
06761 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06762 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06763 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
06764 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06765 typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06766 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06767 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
06768 };
06769 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06770 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06771 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06772 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06773 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06774 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06775 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06776 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06777 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06778 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06779 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06780 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06781 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06782 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
06783 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06784 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06785 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
06786 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06787 typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06788 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06789 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
06790 T41> type;
06791 };
06792 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06793 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06794 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06795 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06796 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06797 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06798 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06799 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06800 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06801 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06802 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06803 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06804 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06805 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
06806 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06807 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06808 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
06809 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06810 typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06811 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06812 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06813 T42> type;
06814 };
06815 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06816 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06817 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06818 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06819 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06820 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06821 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06822 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06823 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06824 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06825 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06826 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06827 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06828 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06829 GTEST_TEMPLATE_ T43>
06830 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06831 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06832 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
06833 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06834 typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06835 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06836 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06837 T42, T43> type;
06838 };
06839 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06840 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06841 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06842 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06843 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06844 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06845 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06846 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06847 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06848 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06849 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06850 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06851 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06852 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06853 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
06854 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06855 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06856 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
06857 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
06858 typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06859 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06860 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06861 T42, T43, T44> type;
06862 };
06863 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06864 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06865 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06866 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06867 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06868 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06869 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06870 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06871 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06872 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06873 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06874 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06875 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06876 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06877 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
06878 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06879 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06880 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
06881 T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
06882 typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06883 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06884 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06885 T42, T43, T44, T45> type;
06886 };
06887 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06888 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06889 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06890 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06891 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06892 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06893 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06894 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06895 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06896 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06897 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06898 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06899 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06900 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06901 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06902 GTEST_TEMPLATE_ T46>
06903 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06904 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06905 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
06906 T45, T46, NoneT, NoneT, NoneT, NoneT> {
06907 typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06908 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06909 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06910 T42, T43, T44, T45, T46> type;
06911 };
06912 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06913 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06914 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06915 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06916 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06917 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06918 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06919 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06920 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06921 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06922 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06923 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06924 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06925 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06926 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06927 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
06928 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06929 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06930 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
06931 T45, T46, T47, NoneT, NoneT, NoneT> {
06932 typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06933 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06934 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06935 T42, T43, T44, T45, T46, T47> type;
06936 };
06937 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06938 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06939 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06940 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06941 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06942 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06943 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06944 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06945 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06946 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06947 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06948 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06949 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06950 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06951 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06952 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
06953 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06954 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06955 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
06956 T45, T46, T47, T48, NoneT, NoneT> {
06957 typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06958 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06959 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06960 T42, T43, T44, T45, T46, T47, T48> type;
06961 };
06962 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
06963 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
06964 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
06965 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
06966 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
06967 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
06968 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
06969 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
06970 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
06971 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
06972 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
06973 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
06974 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
06975 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
06976 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
06977 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
06978 GTEST_TEMPLATE_ T49>
06979 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
06980 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
06981 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
06982 T45, T46, T47, T48, T49, NoneT> {
06983 typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
06984 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
06985 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
06986 T42, T43, T44, T45, T46, T47, T48, T49> type;
06987 };
06988
06989
06990
06991
06992
06993 template <typename T>
06994 struct TypeList {
06995 typedef Types1<T> type;
06996 };
06997
06998 template <typename T1, typename T2, typename T3, typename T4, typename T5,
06999 typename T6, typename T7, typename T8, typename T9, typename T10,
07000 typename T11, typename T12, typename T13, typename T14, typename T15,
07001 typename T16, typename T17, typename T18, typename T19, typename T20,
07002 typename T21, typename T22, typename T23, typename T24, typename T25,
07003 typename T26, typename T27, typename T28, typename T29, typename T30,
07004 typename T31, typename T32, typename T33, typename T34, typename T35,
07005 typename T36, typename T37, typename T38, typename T39, typename T40,
07006 typename T41, typename T42, typename T43, typename T44, typename T45,
07007 typename T46, typename T47, typename T48, typename T49, typename T50>
07008 struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
07009 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
07010 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
07011 T44, T45, T46, T47, T48, T49, T50> > {
07012 typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
07013 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
07014 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
07015 T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
07016 };
07017
07018 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
07019
07020 }
07021 }
07022
07023 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
07024
07025
07026
07027
07028
07029
07030
07031
07032
07033 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
07034 #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
07035
07036 class ProtocolMessage;
07037 namespace proto2 { class Message; }
07038
07039 namespace testing {
07040
07041
07042
07043 class AssertionResult;
07044 class Message;
07045 class Test;
07046 class TestInfo;
07047 class TestPartResult;
07048 class UnitTest;
07049
07050 template <typename T>
07051 ::std::string PrintToString(const T& value);
07052
07053 namespace internal {
07054
07055 struct TraceInfo;
07056 class ScopedTrace;
07057 class TestInfoImpl;
07058 class UnitTestImpl;
07059
07060
07061 GTEST_API_ extern int g_init_gtest_count;
07062
07063
07064
07065 GTEST_API_ extern const char kStackTraceMarker[];
07066
07067
07068
07069
07070
07071
07072
07073
07074
07075
07076
07077
07078
07079
07080
07081 char IsNullLiteralHelper(Secret* p);
07082 char (&IsNullLiteralHelper(...))[2];
07083
07084
07085
07086
07087 #ifdef GTEST_ELLIPSIS_NEEDS_POD_
07088
07089
07090 # define GTEST_IS_NULL_LITERAL_(x) false
07091 #else
07092 # define GTEST_IS_NULL_LITERAL_(x) \
07093 (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
07094 #endif // GTEST_ELLIPSIS_NEEDS_POD_
07095
07096
07097 GTEST_API_ std::string AppendUserMessage(
07098 const std::string& gtest_msg, const Message& user_msg);
07099
07100 #if GTEST_HAS_EXCEPTIONS
07101
07102
07103
07104
07105
07106
07107
07108 class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
07109 public:
07110 explicit GoogleTestFailureException(const TestPartResult& failure);
07111 };
07112
07113 #endif // GTEST_HAS_EXCEPTIONS
07114
07115
07116 class GTEST_API_ ScopedTrace {
07117 public:
07118
07119
07120 ScopedTrace(const char* file, int line, const Message& message);
07121
07122
07123
07124
07125
07126 ~ScopedTrace();
07127
07128 private:
07129 GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
07130 } GTEST_ATTRIBUTE_UNUSED_;
07131
07132
07133
07134
07135
07136
07137
07138
07139
07140
07141
07142
07143
07144
07145
07146
07147
07148
07149 GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
07150 const char* actual_expression,
07151 const std::string& expected_value,
07152 const std::string& actual_value,
07153 bool ignoring_case);
07154
07155
07156 GTEST_API_ std::string GetBoolAssertionFailureMessage(
07157 const AssertionResult& assertion_result,
07158 const char* expression_text,
07159 const char* actual_predicate_value,
07160 const char* expected_predicate_value);
07161
07162
07163
07164
07165
07166
07167
07168
07169
07170
07171
07172
07173
07174
07175
07176
07177
07178
07179
07180
07181
07182
07183
07184
07185
07186
07187
07188
07189
07190
07191 template <typename RawType>
07192 class FloatingPoint {
07193 public:
07194
07195
07196 typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
07197
07198
07199
07200
07201 static const size_t kBitCount = 8*sizeof(RawType);
07202
07203
07204 static const size_t kFractionBitCount =
07205 std::numeric_limits<RawType>::digits - 1;
07206
07207
07208 static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
07209
07210
07211 static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
07212
07213
07214 static const Bits kFractionBitMask =
07215 ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
07216
07217
07218 static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
07219
07220
07221
07222
07223
07224
07225
07226
07227
07228
07229
07230
07231
07232 static const size_t kMaxUlps = 4;
07233
07234
07235
07236
07237
07238
07239
07240 explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
07241
07242
07243
07244
07245
07246
07247 static RawType ReinterpretBits(const Bits bits) {
07248 FloatingPoint fp(0);
07249 fp.u_.bits_ = bits;
07250 return fp.u_.value_;
07251 }
07252
07253
07254 static RawType Infinity() {
07255 return ReinterpretBits(kExponentBitMask);
07256 }
07257
07258
07259 static RawType Max();
07260
07261
07262
07263
07264 const Bits &bits() const { return u_.bits_; }
07265
07266
07267 Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
07268
07269
07270 Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
07271
07272
07273 Bits sign_bit() const { return kSignBitMask & u_.bits_; }
07274
07275
07276 bool is_nan() const {
07277
07278
07279 return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
07280 }
07281
07282
07283
07284
07285
07286
07287
07288 bool AlmostEquals(const FloatingPoint& rhs) const {
07289
07290
07291 if (is_nan() || rhs.is_nan()) return false;
07292
07293 return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
07294 <= kMaxUlps;
07295 }
07296
07297 private:
07298
07299 union FloatingPointUnion {
07300 RawType value_;
07301 Bits bits_;
07302 };
07303
07304
07305
07306
07307
07308
07309
07310
07311
07312
07313
07314
07315
07316
07317
07318
07319 static Bits SignAndMagnitudeToBiased(const Bits &sam) {
07320 if (kSignBitMask & sam) {
07321
07322 return ~sam + 1;
07323 } else {
07324
07325 return kSignBitMask | sam;
07326 }
07327 }
07328
07329
07330
07331 static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
07332 const Bits &sam2) {
07333 const Bits biased1 = SignAndMagnitudeToBiased(sam1);
07334 const Bits biased2 = SignAndMagnitudeToBiased(sam2);
07335 return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
07336 }
07337
07338 FloatingPointUnion u_;
07339 };
07340
07341
07342
07343 template <>
07344 inline float FloatingPoint<float>::Max() { return FLT_MAX; }
07345 template <>
07346 inline double FloatingPoint<double>::Max() { return DBL_MAX; }
07347
07348
07349
07350 typedef FloatingPoint<float> Float;
07351 typedef FloatingPoint<double> Double;
07352
07353
07354
07355
07356
07357
07358
07359 typedef const void* TypeId;
07360
07361 template <typename T>
07362 class TypeIdHelper {
07363 public:
07364
07365
07366
07367 static bool dummy_;
07368 };
07369
07370 template <typename T>
07371 bool TypeIdHelper<T>::dummy_ = false;
07372
07373
07374
07375
07376 template <typename T>
07377 TypeId GetTypeId() {
07378
07379
07380
07381
07382 return &(TypeIdHelper<T>::dummy_);
07383 }
07384
07385
07386
07387
07388
07389
07390 GTEST_API_ TypeId GetTestTypeId();
07391
07392
07393
07394 class TestFactoryBase {
07395 public:
07396 virtual ~TestFactoryBase() {}
07397
07398
07399
07400 virtual Test* CreateTest() = 0;
07401
07402 protected:
07403 TestFactoryBase() {}
07404
07405 private:
07406 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
07407 };
07408
07409
07410
07411 template <class TestClass>
07412 class TestFactoryImpl : public TestFactoryBase {
07413 public:
07414 virtual Test* CreateTest() { return new TestClass; }
07415 };
07416
07417 #if GTEST_OS_WINDOWS
07418
07419
07420
07421
07422
07423 GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
07424 long hr);
07425 GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
07426 long hr);
07427
07428 #endif // GTEST_OS_WINDOWS
07429
07430
07431 typedef void (*SetUpTestCaseFunc)();
07432 typedef void (*TearDownTestCaseFunc)();
07433
07434
07435
07436
07437
07438
07439
07440
07441
07442
07443
07444
07445
07446
07447
07448
07449
07450
07451 GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
07452 const char* test_case_name,
07453 const char* name,
07454 const char* type_param,
07455 const char* value_param,
07456 TypeId fixture_class_id,
07457 SetUpTestCaseFunc set_up_tc,
07458 TearDownTestCaseFunc tear_down_tc,
07459 TestFactoryBase* factory);
07460
07461
07462
07463
07464 GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
07465
07466 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
07467
07468
07469 class GTEST_API_ TypedTestCasePState {
07470 public:
07471 TypedTestCasePState() : registered_(false) {}
07472
07473
07474
07475
07476 bool AddTestName(const char* file, int line, const char* case_name,
07477 const char* test_name) {
07478 if (registered_) {
07479 fprintf(stderr, "%s Test %s must be defined before "
07480 "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
07481 FormatFileLocation(file, line).c_str(), test_name, case_name);
07482 fflush(stderr);
07483 posix::Abort();
07484 }
07485 defined_test_names_.insert(test_name);
07486 return true;
07487 }
07488
07489
07490
07491
07492 const char* VerifyRegisteredTestNames(
07493 const char* file, int line, const char* registered_tests);
07494
07495 private:
07496 bool registered_;
07497 ::std::set<const char*> defined_test_names_;
07498 };
07499
07500
07501
07502 inline const char* SkipComma(const char* str) {
07503 const char* comma = strchr(str, ',');
07504 if (comma == NULL) {
07505 return NULL;
07506 }
07507 while (IsSpace(*(++comma))) {}
07508 return comma;
07509 }
07510
07511
07512
07513 inline std::string GetPrefixUntilComma(const char* str) {
07514 const char* comma = strchr(str, ',');
07515 return comma == NULL ? str : std::string(str, comma);
07516 }
07517
07518
07519
07520
07521
07522
07523
07524
07525 template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
07526 class TypeParameterizedTest {
07527 public:
07528
07529
07530
07531
07532 static bool Register(const char* prefix, const char* case_name,
07533 const char* test_names, int index) {
07534 typedef typename Types::Head Type;
07535 typedef Fixture<Type> FixtureClass;
07536 typedef typename GTEST_BIND_(TestSel, Type) TestClass;
07537
07538
07539
07540 MakeAndRegisterTestInfo(
07541 (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
07542 + StreamableToString(index)).c_str(),
07543 GetPrefixUntilComma(test_names).c_str(),
07544 GetTypeName<Type>().c_str(),
07545 NULL,
07546 GetTypeId<FixtureClass>(),
07547 TestClass::SetUpTestCase,
07548 TestClass::TearDownTestCase,
07549 new TestFactoryImpl<TestClass>);
07550
07551
07552 return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
07553 ::Register(prefix, case_name, test_names, index + 1);
07554 }
07555 };
07556
07557
07558 template <GTEST_TEMPLATE_ Fixture, class TestSel>
07559 class TypeParameterizedTest<Fixture, TestSel, Types0> {
07560 public:
07561 static bool Register(const char* , const char* ,
07562 const char* , int ) {
07563 return true;
07564 }
07565 };
07566
07567
07568
07569
07570
07571 template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
07572 class TypeParameterizedTestCase {
07573 public:
07574 static bool Register(const char* prefix, const char* case_name,
07575 const char* test_names) {
07576 typedef typename Tests::Head Head;
07577
07578
07579 TypeParameterizedTest<Fixture, Head, Types>::Register(
07580 prefix, case_name, test_names, 0);
07581
07582
07583 return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
07584 ::Register(prefix, case_name, SkipComma(test_names));
07585 }
07586 };
07587
07588
07589 template <GTEST_TEMPLATE_ Fixture, typename Types>
07590 class TypeParameterizedTestCase<Fixture, Templates0, Types> {
07591 public:
07592 static bool Register(const char* , const char* ,
07593 const char* ) {
07594 return true;
07595 }
07596 };
07597
07598 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
07599
07600
07601
07602
07603
07604
07605
07606
07607
07608
07609
07610 GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
07611 UnitTest* unit_test, int skip_count);
07612
07613
07614
07615
07616
07617 GTEST_API_ bool AlwaysTrue();
07618
07619
07620 inline bool AlwaysFalse() { return !AlwaysTrue(); }
07621
07622
07623
07624
07625 struct GTEST_API_ ConstCharPtr {
07626 ConstCharPtr(const char* str) : value(str) {}
07627 operator bool() const { return true; }
07628 const char* value;
07629 };
07630
07631
07632
07633
07634
07635
07636 class GTEST_API_ Random {
07637 public:
07638 static const UInt32 kMaxRange = 1u << 31;
07639
07640 explicit Random(UInt32 seed) : state_(seed) {}
07641
07642 void Reseed(UInt32 seed) { state_ = seed; }
07643
07644
07645
07646 UInt32 Generate(UInt32 range);
07647
07648 private:
07649 UInt32 state_;
07650 GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
07651 };
07652
07653
07654
07655 template <typename T1, typename T2>
07656 struct CompileAssertTypesEqual;
07657
07658 template <typename T>
07659 struct CompileAssertTypesEqual<T, T> {
07660 };
07661
07662
07663
07664
07665 template <typename T>
07666 struct RemoveReference { typedef T type; };
07667 template <typename T>
07668 struct RemoveReference<T&> { typedef T type; };
07669
07670
07671
07672 #define GTEST_REMOVE_REFERENCE_(T) \
07673 typename ::testing::internal::RemoveReference<T>::type
07674
07675
07676
07677
07678 template <typename T>
07679 struct RemoveConst { typedef T type; };
07680 template <typename T>
07681 struct RemoveConst<const T> { typedef T type; };
07682
07683
07684
07685
07686 template <typename T, size_t N>
07687 struct RemoveConst<const T[N]> {
07688 typedef typename RemoveConst<T>::type type[N];
07689 };
07690
07691 #if defined(_MSC_VER) && _MSC_VER < 1400
07692
07693
07694
07695 template <typename T, size_t N>
07696 struct RemoveConst<T[N]> {
07697 typedef typename RemoveConst<T>::type type[N];
07698 };
07699 #endif
07700
07701
07702
07703 #define GTEST_REMOVE_CONST_(T) \
07704 typename ::testing::internal::RemoveConst<T>::type
07705
07706
07707 #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
07708 GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
07709
07710
07711
07712
07713 template <typename T>
07714 struct AddReference { typedef T& type; };
07715 template <typename T>
07716 struct AddReference<T&> { typedef T& type; };
07717
07718
07719
07720 #define GTEST_ADD_REFERENCE_(T) \
07721 typename ::testing::internal::AddReference<T>::type
07722
07723
07724
07725
07726
07727
07728
07729
07730
07731
07732 #define GTEST_REFERENCE_TO_CONST_(T) \
07733 GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
07734
07735
07736
07737
07738 template <typename From, typename To>
07739 class ImplicitlyConvertible {
07740 private:
07741
07742
07743
07744
07745
07746
07747 static From MakeFrom();
07748
07749
07750
07751
07752
07753
07754
07755
07756
07757
07758
07759 static char Helper(To);
07760 static char (&Helper(...))[2];
07761
07762
07763
07764 public:
07765
07766
07767
07768 #ifdef _MSC_VER
07769 # pragma warning(push) // Saves the current warning state.
07770 # pragma warning(disable:4244) // Temporarily disables warning 4244.
07771
07772 static const bool value =
07773 sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
07774 # pragma warning(pop) // Restores the warning state.
07775 #elif defined(__BORLANDC__)
07776
07777
07778
07779 static const bool value = __is_convertible(From, To);
07780 #else
07781 static const bool value =
07782 sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
07783 #endif // _MSV_VER
07784 };
07785 template <typename From, typename To>
07786 const bool ImplicitlyConvertible<From, To>::value;
07787
07788
07789
07790
07791 template <typename T>
07792 struct IsAProtocolMessage
07793 : public bool_constant<
07794 ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
07795 ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
07796 };
07797
07798
07799
07800
07801
07802
07803
07804
07805
07806
07807
07808
07809
07810
07811
07812
07813
07814
07815
07816
07817
07818
07819 typedef int IsContainer;
07820 template <class C>
07821 IsContainer IsContainerTest(int ,
07822 typename C::iterator* = NULL,
07823 typename C::const_iterator* = NULL) {
07824 return 0;
07825 }
07826
07827 typedef char IsNotContainer;
07828 template <class C>
07829 IsNotContainer IsContainerTest(long ) { return '\0'; }
07830
07831
07832
07833
07834
07835 template<bool> struct EnableIf;
07836 template<> struct EnableIf<true> { typedef void type; };
07837
07838
07839
07840
07841
07842
07843
07844 template <typename T, typename U>
07845 bool ArrayEq(const T* lhs, size_t size, const U* rhs);
07846
07847
07848 template <typename T, typename U>
07849 inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
07850
07851
07852 template <typename T, typename U, size_t N>
07853 inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
07854 return internal::ArrayEq(lhs, N, rhs);
07855 }
07856
07857
07858
07859
07860 template <typename T, typename U>
07861 bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
07862 for (size_t i = 0; i != size; i++) {
07863 if (!internal::ArrayEq(lhs[i], rhs[i]))
07864 return false;
07865 }
07866 return true;
07867 }
07868
07869
07870
07871 template <typename Iter, typename Element>
07872 Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
07873 for (Iter it = begin; it != end; ++it) {
07874 if (internal::ArrayEq(*it, elem))
07875 return it;
07876 }
07877 return end;
07878 }
07879
07880
07881
07882
07883
07884 template <typename T, typename U>
07885 void CopyArray(const T* from, size_t size, U* to);
07886
07887
07888 template <typename T, typename U>
07889 inline void CopyArray(const T& from, U* to) { *to = from; }
07890
07891
07892 template <typename T, typename U, size_t N>
07893 inline void CopyArray(const T(&from)[N], U(*to)[N]) {
07894 internal::CopyArray(from, N, *to);
07895 }
07896
07897
07898
07899
07900 template <typename T, typename U>
07901 void CopyArray(const T* from, size_t size, U* to) {
07902 for (size_t i = 0; i != size; i++) {
07903 internal::CopyArray(from[i], to + i);
07904 }
07905 }
07906
07907
07908
07909 enum RelationToSource {
07910 kReference,
07911 kCopy
07912
07913 };
07914
07915
07916
07917
07918
07919
07920
07921
07922
07923 template <typename Element>
07924 class NativeArray {
07925 public:
07926
07927 typedef Element value_type;
07928 typedef Element* iterator;
07929 typedef const Element* const_iterator;
07930
07931
07932 NativeArray(const Element* array, size_t count, RelationToSource relation) {
07933 Init(array, count, relation);
07934 }
07935
07936
07937 NativeArray(const NativeArray& rhs) {
07938 Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
07939 }
07940
07941 ~NativeArray() {
07942
07943
07944 static_cast<void>(StaticAssertTypeEqHelper<Element,
07945 GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
07946 if (relation_to_source_ == kCopy)
07947 delete[] array_;
07948 }
07949
07950
07951 size_t size() const { return size_; }
07952 const_iterator begin() const { return array_; }
07953 const_iterator end() const { return array_ + size_; }
07954 bool operator==(const NativeArray& rhs) const {
07955 return size() == rhs.size() &&
07956 ArrayEq(begin(), size(), rhs.begin());
07957 }
07958
07959 private:
07960
07961
07962 void Init(const Element* array, size_t a_size, RelationToSource relation) {
07963 if (relation == kReference) {
07964 array_ = array;
07965 } else {
07966 Element* const copy = new Element[a_size];
07967 CopyArray(array, a_size, copy);
07968 array_ = copy;
07969 }
07970 size_ = a_size;
07971 relation_to_source_ = relation;
07972 }
07973
07974 const Element* array_;
07975 size_t size_;
07976 RelationToSource relation_to_source_;
07977
07978 GTEST_DISALLOW_ASSIGN_(NativeArray);
07979 };
07980
07981 }
07982 }
07983
07984 #define GTEST_MESSAGE_AT_(file, line, message, result_type) \
07985 ::testing::internal::AssertHelper(result_type, file, line, message) \
07986 = ::testing::Message()
07987
07988 #define GTEST_MESSAGE_(message, result_type) \
07989 GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
07990
07991 #define GTEST_FATAL_FAILURE_(message) \
07992 return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
07993
07994 #define GTEST_NONFATAL_FAILURE_(message) \
07995 GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
07996
07997 #define GTEST_SUCCESS_(message) \
07998 GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
07999
08000
08001
08002
08003 #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
08004 if (::testing::internal::AlwaysTrue()) { statement; }
08005
08006 #define GTEST_TEST_THROW_(statement, expected_exception, fail) \
08007 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08008 if (::testing::internal::ConstCharPtr gtest_msg = "") { \
08009 bool gtest_caught_expected = false; \
08010 try { \
08011 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08012 } \
08013 catch (expected_exception const&) { \
08014 gtest_caught_expected = true; \
08015 } \
08016 catch (...) { \
08017 gtest_msg.value = \
08018 "Expected: " #statement " throws an exception of type " \
08019 #expected_exception ".\n Actual: it throws a different type."; \
08020 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
08021 } \
08022 if (!gtest_caught_expected) { \
08023 gtest_msg.value = \
08024 "Expected: " #statement " throws an exception of type " \
08025 #expected_exception ".\n Actual: it throws nothing."; \
08026 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
08027 } \
08028 } else \
08029 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
08030 fail(gtest_msg.value)
08031
08032 #define GTEST_TEST_NO_THROW_(statement, fail) \
08033 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08034 if (::testing::internal::AlwaysTrue()) { \
08035 try { \
08036 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08037 } \
08038 catch (...) { \
08039 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
08040 } \
08041 } else \
08042 GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
08043 fail("Expected: " #statement " doesn't throw an exception.\n" \
08044 " Actual: it throws.")
08045
08046 #define GTEST_TEST_ANY_THROW_(statement, fail) \
08047 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08048 if (::testing::internal::AlwaysTrue()) { \
08049 bool gtest_caught_any = false; \
08050 try { \
08051 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08052 } \
08053 catch (...) { \
08054 gtest_caught_any = true; \
08055 } \
08056 if (!gtest_caught_any) { \
08057 goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
08058 } \
08059 } else \
08060 GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
08061 fail("Expected: " #statement " throws an exception.\n" \
08062 " Actual: it doesn't.")
08063
08064
08065
08066
08067
08068 #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
08069 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08070 if (const ::testing::AssertionResult gtest_ar_ = \
08071 ::testing::AssertionResult(expression)) \
08072 ; \
08073 else \
08074 fail(::testing::internal::GetBoolAssertionFailureMessage(\
08075 gtest_ar_, text, #actual, #expected).c_str())
08076
08077 #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
08078 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08079 if (::testing::internal::AlwaysTrue()) { \
08080 ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
08081 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08082 if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
08083 goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
08084 } \
08085 } else \
08086 GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
08087 fail("Expected: " #statement " doesn't generate new fatal " \
08088 "failures in the current thread.\n" \
08089 " Actual: it does.")
08090
08091
08092 #define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
08093 test_case_name##_##test_name##_Test
08094
08095
08096 #define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
08097 class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
08098 public:\
08099 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
08100 private:\
08101 virtual void TestBody();\
08102 static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
08103 GTEST_DISALLOW_COPY_AND_ASSIGN_(\
08104 GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
08105 };\
08106 \
08107 ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
08108 ::test_info_ =\
08109 ::testing::internal::MakeAndRegisterTestInfo(\
08110 #test_case_name, #test_name, NULL, NULL, \
08111 (parent_id), \
08112 parent_class::SetUpTestCase, \
08113 parent_class::TearDownTestCase, \
08114 new ::testing::internal::TestFactoryImpl<\
08115 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
08116 void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
08117
08118 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
08119
08120
08121
08122
08123
08124
08125
08126
08127
08128
08129
08130
08131
08132
08133
08134
08135
08136
08137
08138
08139
08140
08141
08142
08143
08144
08145
08146
08147
08148
08149
08150
08151
08152
08153
08154
08155
08156 #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
08157 #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
08158
08159
08160
08161
08162
08163
08164
08165
08166
08167
08168
08169
08170
08171
08172
08173
08174
08175
08176
08177
08178
08179
08180
08181
08182
08183
08184
08185
08186
08187
08188
08189
08190
08191
08192
08193
08194
08195 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
08196 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
08197
08198
08199 #include <stdio.h>
08200
08201 namespace testing {
08202 namespace internal {
08203
08204 GTEST_DECLARE_string_(internal_run_death_test);
08205
08206
08207 const char kDeathTestStyleFlag[] = "death_test_style";
08208 const char kDeathTestUseFork[] = "death_test_use_fork";
08209 const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
08210
08211 #if GTEST_HAS_DEATH_TEST
08212
08213
08214
08215
08216
08217
08218
08219
08220
08221
08222
08223
08224
08225
08226 class GTEST_API_ DeathTest {
08227 public:
08228
08229
08230
08231
08232
08233
08234
08235
08236 static bool Create(const char* statement, const RE* regex,
08237 const char* file, int line, DeathTest** test);
08238 DeathTest();
08239 virtual ~DeathTest() { }
08240
08241
08242 class ReturnSentinel {
08243 public:
08244 explicit ReturnSentinel(DeathTest* test) : test_(test) { }
08245 ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
08246 private:
08247 DeathTest* const test_;
08248 GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
08249 } GTEST_ATTRIBUTE_UNUSED_;
08250
08251
08252
08253
08254
08255
08256 enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
08257
08258
08259 enum AbortReason {
08260 TEST_ENCOUNTERED_RETURN_STATEMENT,
08261 TEST_THREW_EXCEPTION,
08262 TEST_DID_NOT_DIE
08263 };
08264
08265
08266 virtual TestRole AssumeRole() = 0;
08267
08268
08269 virtual int Wait() = 0;
08270
08271
08272
08273
08274
08275
08276
08277
08278 virtual bool Passed(bool exit_status_ok) = 0;
08279
08280
08281 virtual void Abort(AbortReason reason) = 0;
08282
08283
08284
08285 static const char* LastMessage();
08286
08287 static void set_last_death_test_message(const std::string& message);
08288
08289 private:
08290
08291 static std::string last_death_test_message_;
08292
08293 GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
08294 };
08295
08296
08297 class DeathTestFactory {
08298 public:
08299 virtual ~DeathTestFactory() { }
08300 virtual bool Create(const char* statement, const RE* regex,
08301 const char* file, int line, DeathTest** test) = 0;
08302 };
08303
08304
08305 class DefaultDeathTestFactory : public DeathTestFactory {
08306 public:
08307 virtual bool Create(const char* statement, const RE* regex,
08308 const char* file, int line, DeathTest** test);
08309 };
08310
08311
08312
08313 GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
08314
08315
08316
08317 # if GTEST_HAS_EXCEPTIONS
08318 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
08319 try { \
08320 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08321 } catch (const ::std::exception& gtest_exception) { \
08322 fprintf(\
08323 stderr, \
08324 "\n%s: Caught std::exception-derived exception escaping the " \
08325 "death test statement. Exception message: %s\n", \
08326 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
08327 gtest_exception.what()); \
08328 fflush(stderr); \
08329 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
08330 } catch (...) { \
08331 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
08332 }
08333
08334 # else
08335 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
08336 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
08337
08338 # endif
08339
08340
08341
08342 # define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
08343 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08344 if (::testing::internal::AlwaysTrue()) { \
08345 const ::testing::internal::RE& gtest_regex = (regex); \
08346 ::testing::internal::DeathTest* gtest_dt; \
08347 if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
08348 __FILE__, __LINE__, >est_dt)) { \
08349 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
08350 } \
08351 if (gtest_dt != NULL) { \
08352 ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
08353 gtest_dt_ptr(gtest_dt); \
08354 switch (gtest_dt->AssumeRole()) { \
08355 case ::testing::internal::DeathTest::OVERSEE_TEST: \
08356 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
08357 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
08358 } \
08359 break; \
08360 case ::testing::internal::DeathTest::EXECUTE_TEST: { \
08361 ::testing::internal::DeathTest::ReturnSentinel \
08362 gtest_sentinel(gtest_dt); \
08363 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
08364 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
08365 break; \
08366 } \
08367 default: \
08368 break; \
08369 } \
08370 } \
08371 } else \
08372 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
08373 fail(::testing::internal::DeathTest::LastMessage())
08374
08375
08376
08377
08378
08379
08380
08381 # define GTEST_EXECUTE_STATEMENT_(statement, regex) \
08382 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08383 if (::testing::internal::AlwaysTrue()) { \
08384 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08385 } else \
08386 ::testing::Message()
08387
08388
08389
08390
08391 class InternalRunDeathTestFlag {
08392 public:
08393 InternalRunDeathTestFlag(const std::string& a_file,
08394 int a_line,
08395 int an_index,
08396 int a_write_fd)
08397 : file_(a_file), line_(a_line), index_(an_index),
08398 write_fd_(a_write_fd) {}
08399
08400 ~InternalRunDeathTestFlag() {
08401 if (write_fd_ >= 0)
08402 posix::Close(write_fd_);
08403 }
08404
08405 const std::string& file() const { return file_; }
08406 int line() const { return line_; }
08407 int index() const { return index_; }
08408 int write_fd() const { return write_fd_; }
08409
08410 private:
08411 std::string file_;
08412 int line_;
08413 int index_;
08414 int write_fd_;
08415
08416 GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
08417 };
08418
08419
08420
08421
08422 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
08423
08424 #else // GTEST_HAS_DEATH_TEST
08425
08426
08427
08428
08429
08430
08431
08432
08433
08434
08435
08436
08437
08438
08439
08440
08441
08442
08443
08444
08445
08446
08447
08448
08449
08450
08451
08452
08453
08454
08455
08456
08457
08458 # define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
08459 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
08460 if (::testing::internal::AlwaysTrue()) { \
08461 GTEST_LOG_(WARNING) \
08462 << "Death tests are not supported on this platform.\n" \
08463 << "Statement '" #statement "' cannot be verified."; \
08464 } else if (::testing::internal::AlwaysFalse()) { \
08465 ::testing::internal::RE::PartialMatch(".*", (regex)); \
08466 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
08467 terminator; \
08468 } else \
08469 ::testing::Message()
08470
08471 #endif // GTEST_HAS_DEATH_TEST
08472
08473 }
08474 }
08475
08476 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
08477
08478 namespace testing {
08479
08480
08481
08482
08483
08484
08485 GTEST_DECLARE_string_(death_test_style);
08486
08487 #if GTEST_HAS_DEATH_TEST
08488
08489 namespace internal {
08490
08491
08492
08493
08494
08495
08496 GTEST_API_ bool InDeathTestChild();
08497
08498 }
08499
08500
08501
08502
08503
08504
08505
08506
08507
08508
08509
08510
08511
08512
08513
08514
08515
08516
08517
08518
08519
08520
08521
08522
08523
08524
08525
08526
08527
08528
08529
08530
08531
08532
08533
08534
08535
08536
08537
08538
08539
08540
08541
08542
08543
08544
08545
08546
08547
08548
08549
08550
08551
08552
08553
08554
08555
08556
08557
08558
08559
08560
08561
08562
08563
08564
08565
08566
08567
08568
08569
08570
08571
08572
08573
08574
08575
08576
08577
08578
08579
08580
08581
08582
08583
08584
08585
08586
08587
08588
08589
08590
08591
08592
08593
08594
08595
08596
08597
08598
08599
08600
08601
08602
08603 # define ASSERT_EXIT(statement, predicate, regex) \
08604 GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
08605
08606
08607
08608 # define EXPECT_EXIT(statement, predicate, regex) \
08609 GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
08610
08611
08612
08613
08614 # define ASSERT_DEATH(statement, regex) \
08615 ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
08616
08617
08618
08619 # define EXPECT_DEATH(statement, regex) \
08620 EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
08621
08622
08623
08624
08625 class GTEST_API_ ExitedWithCode {
08626 public:
08627 explicit ExitedWithCode(int exit_code);
08628 bool operator()(int exit_status) const;
08629 private:
08630
08631 void operator=(const ExitedWithCode& other);
08632
08633 const int exit_code_;
08634 };
08635
08636 # if !GTEST_OS_WINDOWS
08637
08638
08639 class GTEST_API_ KilledBySignal {
08640 public:
08641 explicit KilledBySignal(int signum);
08642 bool operator()(int exit_status) const;
08643 private:
08644 const int signum_;
08645 };
08646 # endif // !GTEST_OS_WINDOWS
08647
08648
08649
08650
08651
08652
08653
08654
08655
08656
08657
08658
08659
08660
08661
08662
08663
08664
08665
08666
08667
08668
08669
08670
08671
08672
08673
08674
08675
08676
08677
08678
08679
08680
08681
08682
08683
08684
08685
08686
08687
08688
08689
08690
08691 # ifdef NDEBUG
08692
08693 # define EXPECT_DEBUG_DEATH(statement, regex) \
08694 GTEST_EXECUTE_STATEMENT_(statement, regex)
08695
08696 # define ASSERT_DEBUG_DEATH(statement, regex) \
08697 GTEST_EXECUTE_STATEMENT_(statement, regex)
08698
08699 # else
08700
08701 # define EXPECT_DEBUG_DEATH(statement, regex) \
08702 EXPECT_DEATH(statement, regex)
08703
08704 # define ASSERT_DEBUG_DEATH(statement, regex) \
08705 ASSERT_DEATH(statement, regex)
08706
08707 # endif // NDEBUG for EXPECT_DEBUG_DEATH
08708 #endif // GTEST_HAS_DEATH_TEST
08709
08710
08711
08712
08713
08714
08715 #if GTEST_HAS_DEATH_TEST
08716 # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
08717 EXPECT_DEATH(statement, regex)
08718 # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
08719 ASSERT_DEATH(statement, regex)
08720 #else
08721 # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
08722 GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
08723 # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
08724 GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
08725 #endif
08726
08727 }
08728
08729 #endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
08730
08731
08732
08733
08734
08735
08736
08737
08738
08739
08740
08741
08742
08743
08744
08745
08746
08747
08748
08749
08750
08751
08752
08753
08754
08755
08756
08757
08758
08759
08760
08761
08762
08763
08764
08765
08766
08767
08768
08769
08770 #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
08771 #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
08772
08773
08774
08775
08776
08777
08778
08779 #if 0
08780
08781
08782
08783
08784
08785
08786
08787
08788
08789 class FooTest : public ::testing::TestWithParam<const char*> {
08790
08791 };
08792
08793
08794
08795
08796
08797 TEST_P(FooTest, DoesBlah) {
08798
08799
08800 EXPECT_TRUE(foo.Blah(GetParam()));
08801 ...
08802 }
08803
08804 TEST_P(FooTest, HasBlahBlah) {
08805 ...
08806 }
08807
08808
08809
08810
08811
08812
08813
08814
08815
08816
08817
08818
08819
08820
08821
08822
08823
08824
08825
08826
08827
08828
08829
08830
08831
08832 INSTANTIATE_TEST_CASE_P(InstantiationName,
08833 FooTest,
08834 Values("meeny", "miny", "moe"));
08835
08836
08837
08838
08839
08840
08841
08842
08843
08844
08845
08846
08847
08848
08849
08850
08851
08852
08853
08854
08855 const char* pets[] = {"cat", "dog"};
08856 INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
08857
08858
08859
08860
08861
08862
08863
08864
08865
08866
08867
08868
08869
08870
08871
08872
08873
08874
08875
08876
08877
08878
08879
08880
08881
08882
08883
08884
08885
08886
08887
08888
08889
08890
08891 class BaseTest : public ::testing::Test {
08892
08893
08894 };
08895
08896 class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
08897
08898 };
08899
08900 TEST_F(BaseTest, HasFoo) {
08901
08902 }
08903
08904 TEST_P(DerivedTest, DoesBlah) {
08905
08906 EXPECT_TRUE(foo.Blah(GetParam()));
08907 }
08908
08909 #endif // 0
08910
08911
08912 #if !GTEST_OS_SYMBIAN
08913 # include <utility>
08914 #endif
08915
08916
08917
08918
08919
08920
08921
08922
08923
08924
08925
08926
08927
08928
08929
08930
08931
08932
08933
08934
08935
08936
08937
08938
08939
08940
08941
08942
08943
08944
08945
08946
08947
08948
08949
08950
08951
08952 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
08953 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
08954
08955 #include <iterator>
08956 #include <utility>
08957 #include <vector>
08958
08959
08960
08961
08962
08963
08964
08965
08966
08967
08968
08969
08970
08971
08972
08973
08974
08975
08976
08977
08978
08979
08980
08981
08982
08983
08984
08985
08986
08987
08988
08989
08990
08991
08992
08993
08994
08995
08996
08997
08998
08999
09000
09001
09002
09003
09004
09005
09006
09007
09008
09009
09010
09011
09012
09013
09014
09015
09016
09017
09018
09019
09020
09021
09022
09023
09024
09025
09026
09027
09028
09029 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
09030 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
09031
09032 #include <stdlib.h>
09033 #include <assert.h>
09034
09035
09036 namespace testing {
09037 namespace internal {
09038
09039
09040 GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
09041
09042
09043
09044
09045
09046
09047
09048
09049 class linked_ptr_internal {
09050 public:
09051
09052 void join_new() {
09053 next_ = this;
09054 }
09055
09056
09057
09058
09059
09060
09061
09062
09063
09064
09065
09066
09067
09068 void join(linked_ptr_internal const* ptr)
09069 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
09070 MutexLock lock(&g_linked_ptr_mutex);
09071
09072 linked_ptr_internal const* p = ptr;
09073 while (p->next_ != ptr) p = p->next_;
09074 p->next_ = this;
09075 next_ = ptr;
09076 }
09077
09078
09079
09080 bool depart()
09081 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
09082 MutexLock lock(&g_linked_ptr_mutex);
09083
09084 if (next_ == this) return true;
09085 linked_ptr_internal const* p = next_;
09086 while (p->next_ != this) p = p->next_;
09087 p->next_ = next_;
09088 return false;
09089 }
09090
09091 private:
09092 mutable linked_ptr_internal const* next_;
09093 };
09094
09095 template <typename T>
09096 class linked_ptr {
09097 public:
09098 typedef T element_type;
09099
09100
09101
09102 explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
09103 ~linked_ptr() { depart(); }
09104
09105
09106 template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
09107 linked_ptr(linked_ptr const& ptr) {
09108 assert(&ptr != this);
09109 copy(&ptr);
09110 }
09111
09112
09113 template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
09114 depart();
09115 copy(&ptr);
09116 return *this;
09117 }
09118
09119 linked_ptr& operator=(linked_ptr const& ptr) {
09120 if (&ptr != this) {
09121 depart();
09122 copy(&ptr);
09123 }
09124 return *this;
09125 }
09126
09127
09128 void reset(T* ptr = NULL) {
09129 depart();
09130 capture(ptr);
09131 }
09132 T* get() const { return value_; }
09133 T* operator->() const { return value_; }
09134 T& operator*() const { return *value_; }
09135
09136 bool operator==(T* p) const { return value_ == p; }
09137 bool operator!=(T* p) const { return value_ != p; }
09138 template <typename U>
09139 bool operator==(linked_ptr<U> const& ptr) const {
09140 return value_ == ptr.get();
09141 }
09142 template <typename U>
09143 bool operator!=(linked_ptr<U> const& ptr) const {
09144 return value_ != ptr.get();
09145 }
09146
09147 private:
09148 template <typename U>
09149 friend class linked_ptr;
09150
09151 T* value_;
09152 linked_ptr_internal link_;
09153
09154 void depart() {
09155 if (link_.depart()) delete value_;
09156 }
09157
09158 void capture(T* ptr) {
09159 value_ = ptr;
09160 link_.join_new();
09161 }
09162
09163 template <typename U> void copy(linked_ptr<U> const* ptr) {
09164 value_ = ptr->get();
09165 if (value_)
09166 link_.join(&ptr->link_);
09167 else
09168 link_.join_new();
09169 }
09170 };
09171
09172 template<typename T> inline
09173 bool operator==(T* ptr, const linked_ptr<T>& x) {
09174 return ptr == x.get();
09175 }
09176
09177 template<typename T> inline
09178 bool operator!=(T* ptr, const linked_ptr<T>& x) {
09179 return ptr != x.get();
09180 }
09181
09182
09183
09184
09185 template <typename T>
09186 linked_ptr<T> make_linked_ptr(T* ptr) {
09187 return linked_ptr<T>(ptr);
09188 }
09189
09190 }
09191 }
09192
09193 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
09194
09195
09196
09197
09198
09199
09200
09201
09202
09203
09204
09205
09206
09207
09208
09209
09210
09211
09212
09213
09214
09215
09216
09217
09218
09219
09220
09221
09222
09223
09224
09225
09226
09227
09228
09229
09230
09231
09232
09233
09234
09235
09236
09237
09238
09239
09240
09241
09242
09243
09244
09245
09246
09247
09248
09249
09250
09251
09252
09253
09254
09255
09256
09257
09258
09259
09260
09261
09262
09263
09264
09265
09266
09267
09268
09269
09270
09271
09272
09273
09274
09275
09276
09277
09278
09279
09280
09281
09282
09283
09284
09285
09286
09287
09288 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
09289 #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
09290
09291 #include <ostream>
09292 #include <sstream>
09293 #include <string>
09294 #include <utility>
09295 #include <vector>
09296
09297 namespace testing {
09298
09299
09300
09301 namespace internal2 {
09302
09303
09304
09305 GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
09306 size_t count,
09307 ::std::ostream* os);
09308
09309
09310
09311 enum TypeKind {
09312 kProtobuf,
09313 kConvertibleToInteger,
09314
09315 kOtherType
09316 };
09317
09318
09319
09320
09321
09322 template <typename T, TypeKind kTypeKind>
09323 class TypeWithoutFormatter {
09324 public:
09325
09326 static void PrintValue(const T& value, ::std::ostream* os) {
09327 PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
09328 sizeof(value), os);
09329 }
09330 };
09331
09332
09333
09334
09335 const size_t kProtobufOneLinerMaxLength = 50;
09336
09337 template <typename T>
09338 class TypeWithoutFormatter<T, kProtobuf> {
09339 public:
09340 static void PrintValue(const T& value, ::std::ostream* os) {
09341 const ::testing::internal::string short_str = value.ShortDebugString();
09342 const ::testing::internal::string pretty_str =
09343 short_str.length() <= kProtobufOneLinerMaxLength ?
09344 short_str : ("\n" + value.DebugString());
09345 *os << ("<" + pretty_str + ">");
09346 }
09347 };
09348
09349 template <typename T>
09350 class TypeWithoutFormatter<T, kConvertibleToInteger> {
09351 public:
09352
09353
09354
09355
09356
09357
09358
09359 static void PrintValue(const T& value, ::std::ostream* os) {
09360 const internal::BiggestInt kBigInt = value;
09361 *os << kBigInt;
09362 }
09363 };
09364
09365
09366
09367
09368
09369
09370
09371
09372
09373
09374
09375
09376
09377
09378
09379
09380
09381
09382
09383
09384
09385
09386
09387
09388
09389 template <typename Char, typename CharTraits, typename T>
09390 ::std::basic_ostream<Char, CharTraits>& operator<<(
09391 ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
09392 TypeWithoutFormatter<T,
09393 (internal::IsAProtocolMessage<T>::value ? kProtobuf :
09394 internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
09395 kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
09396 return os;
09397 }
09398
09399 }
09400 }
09401
09402
09403
09404 namespace testing_internal {
09405
09406
09407
09408 template <typename T>
09409 void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
09410
09411
09412
09413
09414
09415
09416
09417
09418
09419
09420
09421 using namespace ::testing::internal2;
09422
09423
09424
09425
09426
09427
09428
09429
09430
09431
09432
09433
09434
09435
09436 *os << value;
09437 }
09438
09439 }
09440
09441 namespace testing {
09442 namespace internal {
09443
09444
09445
09446
09447
09448
09449
09450
09451 template <typename T>
09452 class UniversalPrinter;
09453
09454 template <typename T>
09455 void UniversalPrint(const T& value, ::std::ostream* os);
09456
09457
09458
09459 template <typename C>
09460 void DefaultPrintTo(IsContainer ,
09461 false_type ,
09462 const C& container, ::std::ostream* os) {
09463 const size_t kMaxCount = 32;
09464 *os << '{';
09465 size_t count = 0;
09466 for (typename C::const_iterator it = container.begin();
09467 it != container.end(); ++it, ++count) {
09468 if (count > 0) {
09469 *os << ',';
09470 if (count == kMaxCount) {
09471 *os << " ...";
09472 break;
09473 }
09474 }
09475 *os << ' ';
09476
09477
09478 internal::UniversalPrint(*it, os);
09479 }
09480
09481 if (count > 0) {
09482 *os << ' ';
09483 }
09484 *os << '}';
09485 }
09486
09487
09488
09489
09490
09491
09492
09493 template <typename T>
09494 void DefaultPrintTo(IsNotContainer ,
09495 true_type ,
09496 T* p, ::std::ostream* os) {
09497 if (p == NULL) {
09498 *os << "NULL";
09499 } else {
09500
09501
09502
09503
09504
09505 if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
09506
09507
09508
09509 *os << p;
09510 } else {
09511
09512
09513
09514
09515
09516
09517 *os << reinterpret_cast<const void*>(
09518 reinterpret_cast<internal::UInt64>(p));
09519 }
09520 }
09521 }
09522
09523
09524
09525 template <typename T>
09526 void DefaultPrintTo(IsNotContainer ,
09527 false_type ,
09528 const T& value, ::std::ostream* os) {
09529 ::testing_internal::DefaultPrintNonContainerTo(value, os);
09530 }
09531
09532
09533
09534
09535
09536
09537
09538
09539
09540
09541
09542
09543 template <typename T>
09544 void PrintTo(const T& value, ::std::ostream* os) {
09545
09546
09547
09548
09549
09550
09551
09552
09553
09554
09555
09556
09557
09558
09559
09560
09561
09562
09563
09564
09565
09566
09567 DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
09568 }
09569
09570
09571
09572
09573
09574
09575 GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
09576 GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
09577 inline void PrintTo(char c, ::std::ostream* os) {
09578
09579
09580
09581 PrintTo(static_cast<unsigned char>(c), os);
09582 }
09583
09584
09585 inline void PrintTo(bool x, ::std::ostream* os) {
09586 *os << (x ? "true" : "false");
09587 }
09588
09589
09590
09591
09592
09593
09594
09595
09596 GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
09597
09598
09599 GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
09600 inline void PrintTo(char* s, ::std::ostream* os) {
09601 PrintTo(ImplicitCast_<const char*>(s), os);
09602 }
09603
09604
09605
09606 inline void PrintTo(const signed char* s, ::std::ostream* os) {
09607 PrintTo(ImplicitCast_<const void*>(s), os);
09608 }
09609 inline void PrintTo(signed char* s, ::std::ostream* os) {
09610 PrintTo(ImplicitCast_<const void*>(s), os);
09611 }
09612 inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
09613 PrintTo(ImplicitCast_<const void*>(s), os);
09614 }
09615 inline void PrintTo(unsigned char* s, ::std::ostream* os) {
09616 PrintTo(ImplicitCast_<const void*>(s), os);
09617 }
09618
09619
09620
09621
09622
09623
09624 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
09625
09626 GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
09627 inline void PrintTo(wchar_t* s, ::std::ostream* os) {
09628 PrintTo(ImplicitCast_<const wchar_t*>(s), os);
09629 }
09630 #endif
09631
09632
09633
09634
09635
09636
09637 template <typename T>
09638 void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
09639 UniversalPrint(a[0], os);
09640 for (size_t i = 1; i != count; i++) {
09641 *os << ", ";
09642 UniversalPrint(a[i], os);
09643 }
09644 }
09645
09646
09647 #if GTEST_HAS_GLOBAL_STRING
09648 GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
09649 inline void PrintTo(const ::string& s, ::std::ostream* os) {
09650 PrintStringTo(s, os);
09651 }
09652 #endif // GTEST_HAS_GLOBAL_STRING
09653
09654 GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
09655 inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
09656 PrintStringTo(s, os);
09657 }
09658
09659
09660 #if GTEST_HAS_GLOBAL_WSTRING
09661 GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
09662 inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
09663 PrintWideStringTo(s, os);
09664 }
09665 #endif // GTEST_HAS_GLOBAL_WSTRING
09666
09667 #if GTEST_HAS_STD_WSTRING
09668 GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
09669 inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
09670 PrintWideStringTo(s, os);
09671 }
09672 #endif // GTEST_HAS_STD_WSTRING
09673
09674 #if GTEST_HAS_TR1_TUPLE
09675
09676
09677
09678
09679
09680 template <typename T>
09681 void PrintTupleTo(const T& t, ::std::ostream* os);
09682
09683
09684
09685
09686
09687
09688 inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
09689 PrintTupleTo(t, os);
09690 }
09691
09692 template <typename T1>
09693 void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
09694 PrintTupleTo(t, os);
09695 }
09696
09697 template <typename T1, typename T2>
09698 void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
09699 PrintTupleTo(t, os);
09700 }
09701
09702 template <typename T1, typename T2, typename T3>
09703 void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
09704 PrintTupleTo(t, os);
09705 }
09706
09707 template <typename T1, typename T2, typename T3, typename T4>
09708 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
09709 PrintTupleTo(t, os);
09710 }
09711
09712 template <typename T1, typename T2, typename T3, typename T4, typename T5>
09713 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
09714 ::std::ostream* os) {
09715 PrintTupleTo(t, os);
09716 }
09717
09718 template <typename T1, typename T2, typename T3, typename T4, typename T5,
09719 typename T6>
09720 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
09721 ::std::ostream* os) {
09722 PrintTupleTo(t, os);
09723 }
09724
09725 template <typename T1, typename T2, typename T3, typename T4, typename T5,
09726 typename T6, typename T7>
09727 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
09728 ::std::ostream* os) {
09729 PrintTupleTo(t, os);
09730 }
09731
09732 template <typename T1, typename T2, typename T3, typename T4, typename T5,
09733 typename T6, typename T7, typename T8>
09734 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
09735 ::std::ostream* os) {
09736 PrintTupleTo(t, os);
09737 }
09738
09739 template <typename T1, typename T2, typename T3, typename T4, typename T5,
09740 typename T6, typename T7, typename T8, typename T9>
09741 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
09742 ::std::ostream* os) {
09743 PrintTupleTo(t, os);
09744 }
09745
09746 template <typename T1, typename T2, typename T3, typename T4, typename T5,
09747 typename T6, typename T7, typename T8, typename T9, typename T10>
09748 void PrintTo(
09749 const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
09750 ::std::ostream* os) {
09751 PrintTupleTo(t, os);
09752 }
09753 #endif // GTEST_HAS_TR1_TUPLE
09754
09755
09756 template <typename T1, typename T2>
09757 void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
09758 *os << '(';
09759
09760
09761 UniversalPrinter<T1>::Print(value.first, os);
09762 *os << ", ";
09763 UniversalPrinter<T2>::Print(value.second, os);
09764 *os << ')';
09765 }
09766
09767
09768
09769 template <typename T>
09770 class UniversalPrinter {
09771 public:
09772
09773
09774 #ifdef _MSC_VER
09775 # pragma warning(push) // Saves the current warning state.
09776 # pragma warning(disable:4180) // Temporarily disables warning 4180.
09777 #endif // _MSC_VER
09778
09779
09780
09781
09782 static void Print(const T& value, ::std::ostream* os) {
09783
09784
09785
09786
09787
09788
09789
09790
09791 PrintTo(value, os);
09792 }
09793
09794 #ifdef _MSC_VER
09795 # pragma warning(pop) // Restores the warning state.
09796 #endif // _MSC_VER
09797 };
09798
09799
09800
09801 template <typename T>
09802 void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
09803 if (len == 0) {
09804 *os << "{}";
09805 } else {
09806 *os << "{ ";
09807 const size_t kThreshold = 18;
09808 const size_t kChunkSize = 8;
09809
09810
09811
09812
09813 if (len <= kThreshold) {
09814 PrintRawArrayTo(begin, len, os);
09815 } else {
09816 PrintRawArrayTo(begin, kChunkSize, os);
09817 *os << ", ..., ";
09818 PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
09819 }
09820 *os << " }";
09821 }
09822 }
09823
09824 GTEST_API_ void UniversalPrintArray(
09825 const char* begin, size_t len, ::std::ostream* os);
09826
09827
09828 GTEST_API_ void UniversalPrintArray(
09829 const wchar_t* begin, size_t len, ::std::ostream* os);
09830
09831
09832 template <typename T, size_t N>
09833 class UniversalPrinter<T[N]> {
09834 public:
09835
09836
09837 static void Print(const T (&a)[N], ::std::ostream* os) {
09838 UniversalPrintArray(a, N, os);
09839 }
09840 };
09841
09842
09843 template <typename T>
09844 class UniversalPrinter<T&> {
09845 public:
09846
09847
09848 #ifdef _MSC_VER
09849 # pragma warning(push) // Saves the current warning state.
09850 # pragma warning(disable:4180) // Temporarily disables warning 4180.
09851 #endif // _MSC_VER
09852
09853 static void Print(const T& value, ::std::ostream* os) {
09854
09855
09856 *os << "@" << reinterpret_cast<const void*>(&value) << " ";
09857
09858
09859 UniversalPrint(value, os);
09860 }
09861
09862 #ifdef _MSC_VER
09863 # pragma warning(pop) // Restores the warning state.
09864 #endif // _MSC_VER
09865 };
09866
09867
09868
09869
09870
09871 template <typename T>
09872 class UniversalTersePrinter {
09873 public:
09874 static void Print(const T& value, ::std::ostream* os) {
09875 UniversalPrint(value, os);
09876 }
09877 };
09878 template <typename T>
09879 class UniversalTersePrinter<T&> {
09880 public:
09881 static void Print(const T& value, ::std::ostream* os) {
09882 UniversalPrint(value, os);
09883 }
09884 };
09885 template <typename T, size_t N>
09886 class UniversalTersePrinter<T[N]> {
09887 public:
09888 static void Print(const T (&value)[N], ::std::ostream* os) {
09889 UniversalPrinter<T[N]>::Print(value, os);
09890 }
09891 };
09892 template <>
09893 class UniversalTersePrinter<const char*> {
09894 public:
09895 static void Print(const char* str, ::std::ostream* os) {
09896 if (str == NULL) {
09897 *os << "NULL";
09898 } else {
09899 UniversalPrint(string(str), os);
09900 }
09901 }
09902 };
09903 template <>
09904 class UniversalTersePrinter<char*> {
09905 public:
09906 static void Print(char* str, ::std::ostream* os) {
09907 UniversalTersePrinter<const char*>::Print(str, os);
09908 }
09909 };
09910
09911 #if GTEST_HAS_STD_WSTRING
09912 template <>
09913 class UniversalTersePrinter<const wchar_t*> {
09914 public:
09915 static void Print(const wchar_t* str, ::std::ostream* os) {
09916 if (str == NULL) {
09917 *os << "NULL";
09918 } else {
09919 UniversalPrint(::std::wstring(str), os);
09920 }
09921 }
09922 };
09923 #endif
09924
09925 template <>
09926 class UniversalTersePrinter<wchar_t*> {
09927 public:
09928 static void Print(wchar_t* str, ::std::ostream* os) {
09929 UniversalTersePrinter<const wchar_t*>::Print(str, os);
09930 }
09931 };
09932
09933 template <typename T>
09934 void UniversalTersePrint(const T& value, ::std::ostream* os) {
09935 UniversalTersePrinter<T>::Print(value, os);
09936 }
09937
09938
09939
09940
09941
09942 template <typename T>
09943 void UniversalPrint(const T& value, ::std::ostream* os) {
09944
09945
09946 typedef T T1;
09947 UniversalPrinter<T1>::Print(value, os);
09948 }
09949
09950 #if GTEST_HAS_TR1_TUPLE
09951 typedef ::std::vector<string> Strings;
09952
09953
09954
09955
09956
09957
09958
09959
09960
09961 template <size_t N>
09962 struct TuplePrefixPrinter {
09963
09964 template <typename Tuple>
09965 static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
09966 TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
09967 *os << ", ";
09968 UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
09969 ::Print(::std::tr1::get<N - 1>(t), os);
09970 }
09971
09972
09973
09974 template <typename Tuple>
09975 static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
09976 TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
09977 ::std::stringstream ss;
09978 UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
09979 strings->push_back(ss.str());
09980 }
09981 };
09982
09983
09984 template <>
09985 struct TuplePrefixPrinter<0> {
09986 template <typename Tuple>
09987 static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
09988
09989 template <typename Tuple>
09990 static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
09991 };
09992
09993
09994
09995
09996
09997 template <>
09998 struct TuplePrefixPrinter<1> {
09999 template <typename Tuple>
10000 static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
10001 UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
10002 Print(::std::tr1::get<0>(t), os);
10003 }
10004
10005 template <typename Tuple>
10006 static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
10007 ::std::stringstream ss;
10008 UniversalTersePrint(::std::tr1::get<0>(t), &ss);
10009 strings->push_back(ss.str());
10010 }
10011 };
10012
10013
10014
10015 template <typename T>
10016 void PrintTupleTo(const T& t, ::std::ostream* os) {
10017 *os << "(";
10018 TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
10019 PrintPrefixTo(t, os);
10020 *os << ")";
10021 }
10022
10023
10024
10025
10026 template <typename Tuple>
10027 Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
10028 Strings result;
10029 TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
10030 TersePrintPrefixToStrings(value, &result);
10031 return result;
10032 }
10033 #endif // GTEST_HAS_TR1_TUPLE
10034
10035 }
10036
10037 template <typename T>
10038 ::std::string PrintToString(const T& value) {
10039 ::std::stringstream ss;
10040 internal::UniversalTersePrinter<T>::Print(value, &ss);
10041 return ss.str();
10042 }
10043
10044 }
10045
10046 #endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
10047
10048 #if GTEST_HAS_PARAM_TEST
10049
10050 namespace testing {
10051 namespace internal {
10052
10053
10054
10055
10056
10057
10058
10059 GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
10060 const char* file, int line);
10061
10062 template <typename> class ParamGeneratorInterface;
10063 template <typename> class ParamGenerator;
10064
10065
10066
10067 template <typename T>
10068 class ParamIteratorInterface {
10069 public:
10070 virtual ~ParamIteratorInterface() {}
10071
10072
10073
10074 virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
10075
10076
10077
10078
10079 virtual void Advance() = 0;
10080
10081
10082 virtual ParamIteratorInterface* Clone() const = 0;
10083
10084
10085
10086
10087 virtual const T* Current() const = 0;
10088
10089
10090
10091 virtual bool Equals(const ParamIteratorInterface& other) const = 0;
10092 };
10093
10094
10095
10096
10097 template <typename T>
10098 class ParamIterator {
10099 public:
10100 typedef T value_type;
10101 typedef const T& reference;
10102 typedef ptrdiff_t difference_type;
10103
10104
10105 ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
10106 ParamIterator& operator=(const ParamIterator& other) {
10107 if (this != &other)
10108 impl_.reset(other.impl_->Clone());
10109 return *this;
10110 }
10111
10112 const T& operator*() const { return *impl_->Current(); }
10113 const T* operator->() const { return impl_->Current(); }
10114
10115 ParamIterator& operator++() {
10116 impl_->Advance();
10117 return *this;
10118 }
10119
10120 ParamIterator operator++(int ) {
10121 ParamIteratorInterface<T>* clone = impl_->Clone();
10122 impl_->Advance();
10123 return ParamIterator(clone);
10124 }
10125 bool operator==(const ParamIterator& other) const {
10126 return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
10127 }
10128 bool operator!=(const ParamIterator& other) const {
10129 return !(*this == other);
10130 }
10131
10132 private:
10133 friend class ParamGenerator<T>;
10134 explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
10135 scoped_ptr<ParamIteratorInterface<T> > impl_;
10136 };
10137
10138
10139
10140 template <typename T>
10141 class ParamGeneratorInterface {
10142 public:
10143 typedef T ParamType;
10144
10145 virtual ~ParamGeneratorInterface() {}
10146
10147
10148 virtual ParamIteratorInterface<T>* Begin() const = 0;
10149 virtual ParamIteratorInterface<T>* End() const = 0;
10150 };
10151
10152
10153
10154
10155
10156
10157 template<typename T>
10158 class ParamGenerator {
10159 public:
10160 typedef ParamIterator<T> iterator;
10161
10162 explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
10163 ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
10164
10165 ParamGenerator& operator=(const ParamGenerator& other) {
10166 impl_ = other.impl_;
10167 return *this;
10168 }
10169
10170 iterator begin() const { return iterator(impl_->Begin()); }
10171 iterator end() const { return iterator(impl_->End()); }
10172
10173 private:
10174 linked_ptr<const ParamGeneratorInterface<T> > impl_;
10175 };
10176
10177
10178
10179
10180
10181 template <typename T, typename IncrementT>
10182 class RangeGenerator : public ParamGeneratorInterface<T> {
10183 public:
10184 RangeGenerator(T begin, T end, IncrementT step)
10185 : begin_(begin), end_(end),
10186 step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
10187 virtual ~RangeGenerator() {}
10188
10189 virtual ParamIteratorInterface<T>* Begin() const {
10190 return new Iterator(this, begin_, 0, step_);
10191 }
10192 virtual ParamIteratorInterface<T>* End() const {
10193 return new Iterator(this, end_, end_index_, step_);
10194 }
10195
10196 private:
10197 class Iterator : public ParamIteratorInterface<T> {
10198 public:
10199 Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
10200 IncrementT step)
10201 : base_(base), value_(value), index_(index), step_(step) {}
10202 virtual ~Iterator() {}
10203
10204 virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
10205 return base_;
10206 }
10207 virtual void Advance() {
10208 value_ = value_ + step_;
10209 index_++;
10210 }
10211 virtual ParamIteratorInterface<T>* Clone() const {
10212 return new Iterator(*this);
10213 }
10214 virtual const T* Current() const { return &value_; }
10215 virtual bool Equals(const ParamIteratorInterface<T>& other) const {
10216
10217
10218 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
10219 << "The program attempted to compare iterators "
10220 << "from different generators." << std::endl;
10221 const int other_index =
10222 CheckedDowncastToActualType<const Iterator>(&other)->index_;
10223 return index_ == other_index;
10224 }
10225
10226 private:
10227 Iterator(const Iterator& other)
10228 : ParamIteratorInterface<T>(),
10229 base_(other.base_), value_(other.value_), index_(other.index_),
10230 step_(other.step_) {}
10231
10232
10233 void operator=(const Iterator& other);
10234
10235 const ParamGeneratorInterface<T>* const base_;
10236 T value_;
10237 int index_;
10238 const IncrementT step_;
10239 };
10240
10241 static int CalculateEndIndex(const T& begin,
10242 const T& end,
10243 const IncrementT& step) {
10244 int end_index = 0;
10245 for (T i = begin; i < end; i = i + step)
10246 end_index++;
10247 return end_index;
10248 }
10249
10250
10251 void operator=(const RangeGenerator& other);
10252
10253 const T begin_;
10254 const T end_;
10255 const IncrementT step_;
10256
10257
10258 const int end_index_;
10259 };
10260
10261
10262
10263
10264
10265
10266 template <typename T>
10267 class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
10268 public:
10269 template <typename ForwardIterator>
10270 ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
10271 : container_(begin, end) {}
10272 virtual ~ValuesInIteratorRangeGenerator() {}
10273
10274 virtual ParamIteratorInterface<T>* Begin() const {
10275 return new Iterator(this, container_.begin());
10276 }
10277 virtual ParamIteratorInterface<T>* End() const {
10278 return new Iterator(this, container_.end());
10279 }
10280
10281 private:
10282 typedef typename ::std::vector<T> ContainerType;
10283
10284 class Iterator : public ParamIteratorInterface<T> {
10285 public:
10286 Iterator(const ParamGeneratorInterface<T>* base,
10287 typename ContainerType::const_iterator iterator)
10288 : base_(base), iterator_(iterator) {}
10289 virtual ~Iterator() {}
10290
10291 virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
10292 return base_;
10293 }
10294 virtual void Advance() {
10295 ++iterator_;
10296 value_.reset();
10297 }
10298 virtual ParamIteratorInterface<T>* Clone() const {
10299 return new Iterator(*this);
10300 }
10301
10302
10303
10304
10305
10306
10307
10308 virtual const T* Current() const {
10309 if (value_.get() == NULL)
10310 value_.reset(new T(*iterator_));
10311 return value_.get();
10312 }
10313 virtual bool Equals(const ParamIteratorInterface<T>& other) const {
10314
10315
10316 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
10317 << "The program attempted to compare iterators "
10318 << "from different generators." << std::endl;
10319 return iterator_ ==
10320 CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
10321 }
10322
10323 private:
10324 Iterator(const Iterator& other)
10325
10326
10327 : ParamIteratorInterface<T>(),
10328 base_(other.base_),
10329 iterator_(other.iterator_) {}
10330
10331 const ParamGeneratorInterface<T>* const base_;
10332 typename ContainerType::const_iterator iterator_;
10333
10334
10335
10336
10337
10338 mutable scoped_ptr<const T> value_;
10339 };
10340
10341
10342 void operator=(const ValuesInIteratorRangeGenerator& other);
10343
10344 const ContainerType container_;
10345 };
10346
10347
10348
10349
10350
10351 template <class TestClass>
10352 class ParameterizedTestFactory : public TestFactoryBase {
10353 public:
10354 typedef typename TestClass::ParamType ParamType;
10355 explicit ParameterizedTestFactory(ParamType parameter) :
10356 parameter_(parameter) {}
10357 virtual Test* CreateTest() {
10358 TestClass::SetParam(¶meter_);
10359 return new TestClass();
10360 }
10361
10362 private:
10363 const ParamType parameter_;
10364
10365 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
10366 };
10367
10368
10369
10370
10371
10372 template <class ParamType>
10373 class TestMetaFactoryBase {
10374 public:
10375 virtual ~TestMetaFactoryBase() {}
10376
10377 virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
10378 };
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388 template <class TestCase>
10389 class TestMetaFactory
10390 : public TestMetaFactoryBase<typename TestCase::ParamType> {
10391 public:
10392 typedef typename TestCase::ParamType ParamType;
10393
10394 TestMetaFactory() {}
10395
10396 virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
10397 return new ParameterizedTestFactory<TestCase>(parameter);
10398 }
10399
10400 private:
10401 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
10402 };
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414 class ParameterizedTestCaseInfoBase {
10415 public:
10416 virtual ~ParameterizedTestCaseInfoBase() {}
10417
10418
10419 virtual const string& GetTestCaseName() const = 0;
10420
10421 virtual TypeId GetTestCaseTypeId() const = 0;
10422
10423
10424
10425
10426 virtual void RegisterTests() = 0;
10427
10428 protected:
10429 ParameterizedTestCaseInfoBase() {}
10430
10431 private:
10432 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
10433 };
10434
10435
10436
10437
10438
10439
10440
10441
10442 template <class TestCase>
10443 class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
10444 public:
10445
10446
10447
10448 typedef typename TestCase::ParamType ParamType;
10449
10450 typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
10451
10452 explicit ParameterizedTestCaseInfo(const char* name)
10453 : test_case_name_(name) {}
10454
10455
10456 virtual const string& GetTestCaseName() const { return test_case_name_; }
10457
10458 virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
10459
10460
10461
10462
10463
10464
10465 void AddTestPattern(const char* test_case_name,
10466 const char* test_base_name,
10467 TestMetaFactoryBase<ParamType>* meta_factory) {
10468 tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
10469 test_base_name,
10470 meta_factory)));
10471 }
10472
10473
10474 int AddTestCaseInstantiation(const string& instantiation_name,
10475 GeneratorCreationFunc* func,
10476 const char* ,
10477 int ) {
10478 instantiations_.push_back(::std::make_pair(instantiation_name, func));
10479 return 0;
10480 }
10481
10482
10483
10484
10485
10486 virtual void RegisterTests() {
10487 for (typename TestInfoContainer::iterator test_it = tests_.begin();
10488 test_it != tests_.end(); ++test_it) {
10489 linked_ptr<TestInfo> test_info = *test_it;
10490 for (typename InstantiationContainer::iterator gen_it =
10491 instantiations_.begin(); gen_it != instantiations_.end();
10492 ++gen_it) {
10493 const string& instantiation_name = gen_it->first;
10494 ParamGenerator<ParamType> generator((*gen_it->second)());
10495
10496 string test_case_name;
10497 if ( !instantiation_name.empty() )
10498 test_case_name = instantiation_name + "/";
10499 test_case_name += test_info->test_case_base_name;
10500
10501 int i = 0;
10502 for (typename ParamGenerator<ParamType>::iterator param_it =
10503 generator.begin();
10504 param_it != generator.end(); ++param_it, ++i) {
10505 Message test_name_stream;
10506 test_name_stream << test_info->test_base_name << "/" << i;
10507 MakeAndRegisterTestInfo(
10508 test_case_name.c_str(),
10509 test_name_stream.GetString().c_str(),
10510 NULL,
10511 PrintToString(*param_it).c_str(),
10512 GetTestCaseTypeId(),
10513 TestCase::SetUpTestCase,
10514 TestCase::TearDownTestCase,
10515 test_info->test_meta_factory->CreateTestFactory(*param_it));
10516 }
10517 }
10518 }
10519 }
10520
10521 private:
10522
10523
10524 struct TestInfo {
10525 TestInfo(const char* a_test_case_base_name,
10526 const char* a_test_base_name,
10527 TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
10528 test_case_base_name(a_test_case_base_name),
10529 test_base_name(a_test_base_name),
10530 test_meta_factory(a_test_meta_factory) {}
10531
10532 const string test_case_base_name;
10533 const string test_base_name;
10534 const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
10535 };
10536 typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
10537
10538
10539 typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
10540 InstantiationContainer;
10541
10542 const string test_case_name_;
10543 TestInfoContainer tests_;
10544 InstantiationContainer instantiations_;
10545
10546 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
10547 };
10548
10549
10550
10551
10552
10553
10554
10555 class ParameterizedTestCaseRegistry {
10556 public:
10557 ParameterizedTestCaseRegistry() {}
10558 ~ParameterizedTestCaseRegistry() {
10559 for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10560 it != test_case_infos_.end(); ++it) {
10561 delete *it;
10562 }
10563 }
10564
10565
10566
10567 template <class TestCase>
10568 ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
10569 const char* test_case_name,
10570 const char* file,
10571 int line) {
10572 ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
10573 for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10574 it != test_case_infos_.end(); ++it) {
10575 if ((*it)->GetTestCaseName() == test_case_name) {
10576 if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
10577
10578
10579
10580 ReportInvalidTestCaseType(test_case_name, file, line);
10581 posix::Abort();
10582 } else {
10583
10584
10585
10586 typed_test_info = CheckedDowncastToActualType<
10587 ParameterizedTestCaseInfo<TestCase> >(*it);
10588 }
10589 break;
10590 }
10591 }
10592 if (typed_test_info == NULL) {
10593 typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
10594 test_case_infos_.push_back(typed_test_info);
10595 }
10596 return typed_test_info;
10597 }
10598 void RegisterTests() {
10599 for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10600 it != test_case_infos_.end(); ++it) {
10601 (*it)->RegisterTests();
10602 }
10603 }
10604
10605 private:
10606 typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
10607
10608 TestCaseInfoContainer test_case_infos_;
10609
10610 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
10611 };
10612
10613 }
10614 }
10615
10616 #endif // GTEST_HAS_PARAM_TEST
10617
10618 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
10665 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
10666
10667
10668
10669
10670
10671 #if GTEST_HAS_PARAM_TEST
10672
10673 namespace testing {
10674
10675
10676
10677 template <typename ForwardIterator>
10678 internal::ParamGenerator<
10679 typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
10680 ValuesIn(ForwardIterator begin, ForwardIterator end);
10681
10682 template <typename T, size_t N>
10683 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
10684
10685 template <class Container>
10686 internal::ParamGenerator<typename Container::value_type> ValuesIn(
10687 const Container& container);
10688
10689 namespace internal {
10690
10691
10692 template <typename T1>
10693 class ValueArray1 {
10694 public:
10695 explicit ValueArray1(T1 v1) : v1_(v1) {}
10696
10697 template <typename T>
10698 operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
10699
10700 private:
10701
10702 void operator=(const ValueArray1& other);
10703
10704 const T1 v1_;
10705 };
10706
10707 template <typename T1, typename T2>
10708 class ValueArray2 {
10709 public:
10710 ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
10711
10712 template <typename T>
10713 operator ParamGenerator<T>() const {
10714 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
10715 return ValuesIn(array);
10716 }
10717
10718 private:
10719
10720 void operator=(const ValueArray2& other);
10721
10722 const T1 v1_;
10723 const T2 v2_;
10724 };
10725
10726 template <typename T1, typename T2, typename T3>
10727 class ValueArray3 {
10728 public:
10729 ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
10730
10731 template <typename T>
10732 operator ParamGenerator<T>() const {
10733 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10734 static_cast<T>(v3_)};
10735 return ValuesIn(array);
10736 }
10737
10738 private:
10739
10740 void operator=(const ValueArray3& other);
10741
10742 const T1 v1_;
10743 const T2 v2_;
10744 const T3 v3_;
10745 };
10746
10747 template <typename T1, typename T2, typename T3, typename T4>
10748 class ValueArray4 {
10749 public:
10750 ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
10751 v4_(v4) {}
10752
10753 template <typename T>
10754 operator ParamGenerator<T>() const {
10755 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10756 static_cast<T>(v3_), static_cast<T>(v4_)};
10757 return ValuesIn(array);
10758 }
10759
10760 private:
10761
10762 void operator=(const ValueArray4& other);
10763
10764 const T1 v1_;
10765 const T2 v2_;
10766 const T3 v3_;
10767 const T4 v4_;
10768 };
10769
10770 template <typename T1, typename T2, typename T3, typename T4, typename T5>
10771 class ValueArray5 {
10772 public:
10773 ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
10774 v4_(v4), v5_(v5) {}
10775
10776 template <typename T>
10777 operator ParamGenerator<T>() const {
10778 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10779 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
10780 return ValuesIn(array);
10781 }
10782
10783 private:
10784
10785 void operator=(const ValueArray5& other);
10786
10787 const T1 v1_;
10788 const T2 v2_;
10789 const T3 v3_;
10790 const T4 v4_;
10791 const T5 v5_;
10792 };
10793
10794 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10795 typename T6>
10796 class ValueArray6 {
10797 public:
10798 ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
10799 v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
10800
10801 template <typename T>
10802 operator ParamGenerator<T>() const {
10803 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10804 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10805 static_cast<T>(v6_)};
10806 return ValuesIn(array);
10807 }
10808
10809 private:
10810
10811 void operator=(const ValueArray6& other);
10812
10813 const T1 v1_;
10814 const T2 v2_;
10815 const T3 v3_;
10816 const T4 v4_;
10817 const T5 v5_;
10818 const T6 v6_;
10819 };
10820
10821 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10822 typename T6, typename T7>
10823 class ValueArray7 {
10824 public:
10825 ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
10826 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
10827
10828 template <typename T>
10829 operator ParamGenerator<T>() const {
10830 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10831 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10832 static_cast<T>(v6_), static_cast<T>(v7_)};
10833 return ValuesIn(array);
10834 }
10835
10836 private:
10837
10838 void operator=(const ValueArray7& other);
10839
10840 const T1 v1_;
10841 const T2 v2_;
10842 const T3 v3_;
10843 const T4 v4_;
10844 const T5 v5_;
10845 const T6 v6_;
10846 const T7 v7_;
10847 };
10848
10849 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10850 typename T6, typename T7, typename T8>
10851 class ValueArray8 {
10852 public:
10853 ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10854 T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10855 v8_(v8) {}
10856
10857 template <typename T>
10858 operator ParamGenerator<T>() const {
10859 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10860 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10861 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
10862 return ValuesIn(array);
10863 }
10864
10865 private:
10866
10867 void operator=(const ValueArray8& other);
10868
10869 const T1 v1_;
10870 const T2 v2_;
10871 const T3 v3_;
10872 const T4 v4_;
10873 const T5 v5_;
10874 const T6 v6_;
10875 const T7 v7_;
10876 const T8 v8_;
10877 };
10878
10879 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10880 typename T6, typename T7, typename T8, typename T9>
10881 class ValueArray9 {
10882 public:
10883 ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10884 T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10885 v8_(v8), v9_(v9) {}
10886
10887 template <typename T>
10888 operator ParamGenerator<T>() const {
10889 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10890 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10891 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10892 static_cast<T>(v9_)};
10893 return ValuesIn(array);
10894 }
10895
10896 private:
10897
10898 void operator=(const ValueArray9& other);
10899
10900 const T1 v1_;
10901 const T2 v2_;
10902 const T3 v3_;
10903 const T4 v4_;
10904 const T5 v5_;
10905 const T6 v6_;
10906 const T7 v7_;
10907 const T8 v8_;
10908 const T9 v9_;
10909 };
10910
10911 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10912 typename T6, typename T7, typename T8, typename T9, typename T10>
10913 class ValueArray10 {
10914 public:
10915 ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10916 T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10917 v8_(v8), v9_(v9), v10_(v10) {}
10918
10919 template <typename T>
10920 operator ParamGenerator<T>() const {
10921 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10922 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10923 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10924 static_cast<T>(v9_), static_cast<T>(v10_)};
10925 return ValuesIn(array);
10926 }
10927
10928 private:
10929
10930 void operator=(const ValueArray10& other);
10931
10932 const T1 v1_;
10933 const T2 v2_;
10934 const T3 v3_;
10935 const T4 v4_;
10936 const T5 v5_;
10937 const T6 v6_;
10938 const T7 v7_;
10939 const T8 v8_;
10940 const T9 v9_;
10941 const T10 v10_;
10942 };
10943
10944 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10945 typename T6, typename T7, typename T8, typename T9, typename T10,
10946 typename T11>
10947 class ValueArray11 {
10948 public:
10949 ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10950 T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
10951 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
10952
10953 template <typename T>
10954 operator ParamGenerator<T>() const {
10955 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10956 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10957 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10958 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
10959 return ValuesIn(array);
10960 }
10961
10962 private:
10963
10964 void operator=(const ValueArray11& other);
10965
10966 const T1 v1_;
10967 const T2 v2_;
10968 const T3 v3_;
10969 const T4 v4_;
10970 const T5 v5_;
10971 const T6 v6_;
10972 const T7 v7_;
10973 const T8 v8_;
10974 const T9 v9_;
10975 const T10 v10_;
10976 const T11 v11_;
10977 };
10978
10979 template <typename T1, typename T2, typename T3, typename T4, typename T5,
10980 typename T6, typename T7, typename T8, typename T9, typename T10,
10981 typename T11, typename T12>
10982 class ValueArray12 {
10983 public:
10984 ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10985 T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
10986 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
10987
10988 template <typename T>
10989 operator ParamGenerator<T>() const {
10990 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10991 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10992 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10993 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
10994 static_cast<T>(v12_)};
10995 return ValuesIn(array);
10996 }
10997
10998 private:
10999
11000 void operator=(const ValueArray12& other);
11001
11002 const T1 v1_;
11003 const T2 v2_;
11004 const T3 v3_;
11005 const T4 v4_;
11006 const T5 v5_;
11007 const T6 v6_;
11008 const T7 v7_;
11009 const T8 v8_;
11010 const T9 v9_;
11011 const T10 v10_;
11012 const T11 v11_;
11013 const T12 v12_;
11014 };
11015
11016 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11017 typename T6, typename T7, typename T8, typename T9, typename T10,
11018 typename T11, typename T12, typename T13>
11019 class ValueArray13 {
11020 public:
11021 ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11022 T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11023 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11024 v12_(v12), v13_(v13) {}
11025
11026 template <typename T>
11027 operator ParamGenerator<T>() const {
11028 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11029 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11030 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11031 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11032 static_cast<T>(v12_), static_cast<T>(v13_)};
11033 return ValuesIn(array);
11034 }
11035
11036 private:
11037
11038 void operator=(const ValueArray13& other);
11039
11040 const T1 v1_;
11041 const T2 v2_;
11042 const T3 v3_;
11043 const T4 v4_;
11044 const T5 v5_;
11045 const T6 v6_;
11046 const T7 v7_;
11047 const T8 v8_;
11048 const T9 v9_;
11049 const T10 v10_;
11050 const T11 v11_;
11051 const T12 v12_;
11052 const T13 v13_;
11053 };
11054
11055 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11056 typename T6, typename T7, typename T8, typename T9, typename T10,
11057 typename T11, typename T12, typename T13, typename T14>
11058 class ValueArray14 {
11059 public:
11060 ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11061 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
11062 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11063 v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
11064
11065 template <typename T>
11066 operator ParamGenerator<T>() const {
11067 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11068 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11069 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11070 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11071 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
11072 return ValuesIn(array);
11073 }
11074
11075 private:
11076
11077 void operator=(const ValueArray14& other);
11078
11079 const T1 v1_;
11080 const T2 v2_;
11081 const T3 v3_;
11082 const T4 v4_;
11083 const T5 v5_;
11084 const T6 v6_;
11085 const T7 v7_;
11086 const T8 v8_;
11087 const T9 v9_;
11088 const T10 v10_;
11089 const T11 v11_;
11090 const T12 v12_;
11091 const T13 v13_;
11092 const T14 v14_;
11093 };
11094
11095 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11096 typename T6, typename T7, typename T8, typename T9, typename T10,
11097 typename T11, typename T12, typename T13, typename T14, typename T15>
11098 class ValueArray15 {
11099 public:
11100 ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11101 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
11102 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11103 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
11104
11105 template <typename T>
11106 operator ParamGenerator<T>() const {
11107 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11108 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11109 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11110 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11111 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11112 static_cast<T>(v15_)};
11113 return ValuesIn(array);
11114 }
11115
11116 private:
11117
11118 void operator=(const ValueArray15& other);
11119
11120 const T1 v1_;
11121 const T2 v2_;
11122 const T3 v3_;
11123 const T4 v4_;
11124 const T5 v5_;
11125 const T6 v6_;
11126 const T7 v7_;
11127 const T8 v8_;
11128 const T9 v9_;
11129 const T10 v10_;
11130 const T11 v11_;
11131 const T12 v12_;
11132 const T13 v13_;
11133 const T14 v14_;
11134 const T15 v15_;
11135 };
11136
11137 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11138 typename T6, typename T7, typename T8, typename T9, typename T10,
11139 typename T11, typename T12, typename T13, typename T14, typename T15,
11140 typename T16>
11141 class ValueArray16 {
11142 public:
11143 ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11144 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
11145 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
11146 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
11147 v16_(v16) {}
11148
11149 template <typename T>
11150 operator ParamGenerator<T>() const {
11151 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11152 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11153 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11154 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11155 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11156 static_cast<T>(v15_), static_cast<T>(v16_)};
11157 return ValuesIn(array);
11158 }
11159
11160 private:
11161
11162 void operator=(const ValueArray16& other);
11163
11164 const T1 v1_;
11165 const T2 v2_;
11166 const T3 v3_;
11167 const T4 v4_;
11168 const T5 v5_;
11169 const T6 v6_;
11170 const T7 v7_;
11171 const T8 v8_;
11172 const T9 v9_;
11173 const T10 v10_;
11174 const T11 v11_;
11175 const T12 v12_;
11176 const T13 v13_;
11177 const T14 v14_;
11178 const T15 v15_;
11179 const T16 v16_;
11180 };
11181
11182 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11183 typename T6, typename T7, typename T8, typename T9, typename T10,
11184 typename T11, typename T12, typename T13, typename T14, typename T15,
11185 typename T16, typename T17>
11186 class ValueArray17 {
11187 public:
11188 ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11189 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
11190 T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11191 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11192 v15_(v15), v16_(v16), v17_(v17) {}
11193
11194 template <typename T>
11195 operator ParamGenerator<T>() const {
11196 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11197 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11198 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11199 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11200 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11201 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
11202 return ValuesIn(array);
11203 }
11204
11205 private:
11206
11207 void operator=(const ValueArray17& other);
11208
11209 const T1 v1_;
11210 const T2 v2_;
11211 const T3 v3_;
11212 const T4 v4_;
11213 const T5 v5_;
11214 const T6 v6_;
11215 const T7 v7_;
11216 const T8 v8_;
11217 const T9 v9_;
11218 const T10 v10_;
11219 const T11 v11_;
11220 const T12 v12_;
11221 const T13 v13_;
11222 const T14 v14_;
11223 const T15 v15_;
11224 const T16 v16_;
11225 const T17 v17_;
11226 };
11227
11228 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11229 typename T6, typename T7, typename T8, typename T9, typename T10,
11230 typename T11, typename T12, typename T13, typename T14, typename T15,
11231 typename T16, typename T17, typename T18>
11232 class ValueArray18 {
11233 public:
11234 ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11235 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11236 T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11237 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11238 v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
11239
11240 template <typename T>
11241 operator ParamGenerator<T>() const {
11242 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11243 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11244 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11245 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11246 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11247 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11248 static_cast<T>(v18_)};
11249 return ValuesIn(array);
11250 }
11251
11252 private:
11253
11254 void operator=(const ValueArray18& other);
11255
11256 const T1 v1_;
11257 const T2 v2_;
11258 const T3 v3_;
11259 const T4 v4_;
11260 const T5 v5_;
11261 const T6 v6_;
11262 const T7 v7_;
11263 const T8 v8_;
11264 const T9 v9_;
11265 const T10 v10_;
11266 const T11 v11_;
11267 const T12 v12_;
11268 const T13 v13_;
11269 const T14 v14_;
11270 const T15 v15_;
11271 const T16 v16_;
11272 const T17 v17_;
11273 const T18 v18_;
11274 };
11275
11276 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11277 typename T6, typename T7, typename T8, typename T9, typename T10,
11278 typename T11, typename T12, typename T13, typename T14, typename T15,
11279 typename T16, typename T17, typename T18, typename T19>
11280 class ValueArray19 {
11281 public:
11282 ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11283 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11284 T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11285 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11286 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
11287
11288 template <typename T>
11289 operator ParamGenerator<T>() const {
11290 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11291 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11292 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11293 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11294 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11295 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11296 static_cast<T>(v18_), static_cast<T>(v19_)};
11297 return ValuesIn(array);
11298 }
11299
11300 private:
11301
11302 void operator=(const ValueArray19& other);
11303
11304 const T1 v1_;
11305 const T2 v2_;
11306 const T3 v3_;
11307 const T4 v4_;
11308 const T5 v5_;
11309 const T6 v6_;
11310 const T7 v7_;
11311 const T8 v8_;
11312 const T9 v9_;
11313 const T10 v10_;
11314 const T11 v11_;
11315 const T12 v12_;
11316 const T13 v13_;
11317 const T14 v14_;
11318 const T15 v15_;
11319 const T16 v16_;
11320 const T17 v17_;
11321 const T18 v18_;
11322 const T19 v19_;
11323 };
11324
11325 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11326 typename T6, typename T7, typename T8, typename T9, typename T10,
11327 typename T11, typename T12, typename T13, typename T14, typename T15,
11328 typename T16, typename T17, typename T18, typename T19, typename T20>
11329 class ValueArray20 {
11330 public:
11331 ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11332 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11333 T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11334 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11335 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11336 v19_(v19), v20_(v20) {}
11337
11338 template <typename T>
11339 operator ParamGenerator<T>() const {
11340 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11341 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11342 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11343 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11344 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11345 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11346 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
11347 return ValuesIn(array);
11348 }
11349
11350 private:
11351
11352 void operator=(const ValueArray20& other);
11353
11354 const T1 v1_;
11355 const T2 v2_;
11356 const T3 v3_;
11357 const T4 v4_;
11358 const T5 v5_;
11359 const T6 v6_;
11360 const T7 v7_;
11361 const T8 v8_;
11362 const T9 v9_;
11363 const T10 v10_;
11364 const T11 v11_;
11365 const T12 v12_;
11366 const T13 v13_;
11367 const T14 v14_;
11368 const T15 v15_;
11369 const T16 v16_;
11370 const T17 v17_;
11371 const T18 v18_;
11372 const T19 v19_;
11373 const T20 v20_;
11374 };
11375
11376 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11377 typename T6, typename T7, typename T8, typename T9, typename T10,
11378 typename T11, typename T12, typename T13, typename T14, typename T15,
11379 typename T16, typename T17, typename T18, typename T19, typename T20,
11380 typename T21>
11381 class ValueArray21 {
11382 public:
11383 ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11384 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11385 T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11386 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11387 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11388 v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
11389
11390 template <typename T>
11391 operator ParamGenerator<T>() const {
11392 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11393 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11394 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11395 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11396 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11397 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11398 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11399 static_cast<T>(v21_)};
11400 return ValuesIn(array);
11401 }
11402
11403 private:
11404
11405 void operator=(const ValueArray21& other);
11406
11407 const T1 v1_;
11408 const T2 v2_;
11409 const T3 v3_;
11410 const T4 v4_;
11411 const T5 v5_;
11412 const T6 v6_;
11413 const T7 v7_;
11414 const T8 v8_;
11415 const T9 v9_;
11416 const T10 v10_;
11417 const T11 v11_;
11418 const T12 v12_;
11419 const T13 v13_;
11420 const T14 v14_;
11421 const T15 v15_;
11422 const T16 v16_;
11423 const T17 v17_;
11424 const T18 v18_;
11425 const T19 v19_;
11426 const T20 v20_;
11427 const T21 v21_;
11428 };
11429
11430 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11431 typename T6, typename T7, typename T8, typename T9, typename T10,
11432 typename T11, typename T12, typename T13, typename T14, typename T15,
11433 typename T16, typename T17, typename T18, typename T19, typename T20,
11434 typename T21, typename T22>
11435 class ValueArray22 {
11436 public:
11437 ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11438 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11439 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
11440 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11441 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11442 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
11443
11444 template <typename T>
11445 operator ParamGenerator<T>() const {
11446 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11447 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11448 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11449 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11450 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11451 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11452 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11453 static_cast<T>(v21_), static_cast<T>(v22_)};
11454 return ValuesIn(array);
11455 }
11456
11457 private:
11458
11459 void operator=(const ValueArray22& other);
11460
11461 const T1 v1_;
11462 const T2 v2_;
11463 const T3 v3_;
11464 const T4 v4_;
11465 const T5 v5_;
11466 const T6 v6_;
11467 const T7 v7_;
11468 const T8 v8_;
11469 const T9 v9_;
11470 const T10 v10_;
11471 const T11 v11_;
11472 const T12 v12_;
11473 const T13 v13_;
11474 const T14 v14_;
11475 const T15 v15_;
11476 const T16 v16_;
11477 const T17 v17_;
11478 const T18 v18_;
11479 const T19 v19_;
11480 const T20 v20_;
11481 const T21 v21_;
11482 const T22 v22_;
11483 };
11484
11485 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11486 typename T6, typename T7, typename T8, typename T9, typename T10,
11487 typename T11, typename T12, typename T13, typename T14, typename T15,
11488 typename T16, typename T17, typename T18, typename T19, typename T20,
11489 typename T21, typename T22, typename T23>
11490 class ValueArray23 {
11491 public:
11492 ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11493 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11494 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
11495 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11496 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11497 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
11498 v23_(v23) {}
11499
11500 template <typename T>
11501 operator ParamGenerator<T>() const {
11502 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11503 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11504 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11505 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11506 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11507 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11508 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11509 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
11510 return ValuesIn(array);
11511 }
11512
11513 private:
11514
11515 void operator=(const ValueArray23& other);
11516
11517 const T1 v1_;
11518 const T2 v2_;
11519 const T3 v3_;
11520 const T4 v4_;
11521 const T5 v5_;
11522 const T6 v6_;
11523 const T7 v7_;
11524 const T8 v8_;
11525 const T9 v9_;
11526 const T10 v10_;
11527 const T11 v11_;
11528 const T12 v12_;
11529 const T13 v13_;
11530 const T14 v14_;
11531 const T15 v15_;
11532 const T16 v16_;
11533 const T17 v17_;
11534 const T18 v18_;
11535 const T19 v19_;
11536 const T20 v20_;
11537 const T21 v21_;
11538 const T22 v22_;
11539 const T23 v23_;
11540 };
11541
11542 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11543 typename T6, typename T7, typename T8, typename T9, typename T10,
11544 typename T11, typename T12, typename T13, typename T14, typename T15,
11545 typename T16, typename T17, typename T18, typename T19, typename T20,
11546 typename T21, typename T22, typename T23, typename T24>
11547 class ValueArray24 {
11548 public:
11549 ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11550 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11551 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
11552 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
11553 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
11554 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
11555 v22_(v22), v23_(v23), v24_(v24) {}
11556
11557 template <typename T>
11558 operator ParamGenerator<T>() const {
11559 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11560 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11561 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11562 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11563 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11564 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11565 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11566 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11567 static_cast<T>(v24_)};
11568 return ValuesIn(array);
11569 }
11570
11571 private:
11572
11573 void operator=(const ValueArray24& other);
11574
11575 const T1 v1_;
11576 const T2 v2_;
11577 const T3 v3_;
11578 const T4 v4_;
11579 const T5 v5_;
11580 const T6 v6_;
11581 const T7 v7_;
11582 const T8 v8_;
11583 const T9 v9_;
11584 const T10 v10_;
11585 const T11 v11_;
11586 const T12 v12_;
11587 const T13 v13_;
11588 const T14 v14_;
11589 const T15 v15_;
11590 const T16 v16_;
11591 const T17 v17_;
11592 const T18 v18_;
11593 const T19 v19_;
11594 const T20 v20_;
11595 const T21 v21_;
11596 const T22 v22_;
11597 const T23 v23_;
11598 const T24 v24_;
11599 };
11600
11601 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11602 typename T6, typename T7, typename T8, typename T9, typename T10,
11603 typename T11, typename T12, typename T13, typename T14, typename T15,
11604 typename T16, typename T17, typename T18, typename T19, typename T20,
11605 typename T21, typename T22, typename T23, typename T24, typename T25>
11606 class ValueArray25 {
11607 public:
11608 ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11609 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11610 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
11611 T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11612 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11613 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
11614 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
11615
11616 template <typename T>
11617 operator ParamGenerator<T>() const {
11618 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11619 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11620 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11621 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11622 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11623 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11624 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11625 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11626 static_cast<T>(v24_), static_cast<T>(v25_)};
11627 return ValuesIn(array);
11628 }
11629
11630 private:
11631
11632 void operator=(const ValueArray25& other);
11633
11634 const T1 v1_;
11635 const T2 v2_;
11636 const T3 v3_;
11637 const T4 v4_;
11638 const T5 v5_;
11639 const T6 v6_;
11640 const T7 v7_;
11641 const T8 v8_;
11642 const T9 v9_;
11643 const T10 v10_;
11644 const T11 v11_;
11645 const T12 v12_;
11646 const T13 v13_;
11647 const T14 v14_;
11648 const T15 v15_;
11649 const T16 v16_;
11650 const T17 v17_;
11651 const T18 v18_;
11652 const T19 v19_;
11653 const T20 v20_;
11654 const T21 v21_;
11655 const T22 v22_;
11656 const T23 v23_;
11657 const T24 v24_;
11658 const T25 v25_;
11659 };
11660
11661 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11662 typename T6, typename T7, typename T8, typename T9, typename T10,
11663 typename T11, typename T12, typename T13, typename T14, typename T15,
11664 typename T16, typename T17, typename T18, typename T19, typename T20,
11665 typename T21, typename T22, typename T23, typename T24, typename T25,
11666 typename T26>
11667 class ValueArray26 {
11668 public:
11669 ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11670 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11671 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11672 T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11673 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11674 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
11675 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
11676
11677 template <typename T>
11678 operator ParamGenerator<T>() const {
11679 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11680 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11681 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11682 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11683 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11684 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11685 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11686 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11687 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
11688 return ValuesIn(array);
11689 }
11690
11691 private:
11692
11693 void operator=(const ValueArray26& other);
11694
11695 const T1 v1_;
11696 const T2 v2_;
11697 const T3 v3_;
11698 const T4 v4_;
11699 const T5 v5_;
11700 const T6 v6_;
11701 const T7 v7_;
11702 const T8 v8_;
11703 const T9 v9_;
11704 const T10 v10_;
11705 const T11 v11_;
11706 const T12 v12_;
11707 const T13 v13_;
11708 const T14 v14_;
11709 const T15 v15_;
11710 const T16 v16_;
11711 const T17 v17_;
11712 const T18 v18_;
11713 const T19 v19_;
11714 const T20 v20_;
11715 const T21 v21_;
11716 const T22 v22_;
11717 const T23 v23_;
11718 const T24 v24_;
11719 const T25 v25_;
11720 const T26 v26_;
11721 };
11722
11723 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11724 typename T6, typename T7, typename T8, typename T9, typename T10,
11725 typename T11, typename T12, typename T13, typename T14, typename T15,
11726 typename T16, typename T17, typename T18, typename T19, typename T20,
11727 typename T21, typename T22, typename T23, typename T24, typename T25,
11728 typename T26, typename T27>
11729 class ValueArray27 {
11730 public:
11731 ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11732 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11733 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11734 T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11735 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11736 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
11737 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
11738 v26_(v26), v27_(v27) {}
11739
11740 template <typename T>
11741 operator ParamGenerator<T>() const {
11742 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11743 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11744 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11745 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11746 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11747 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11748 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11749 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11750 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11751 static_cast<T>(v27_)};
11752 return ValuesIn(array);
11753 }
11754
11755 private:
11756
11757 void operator=(const ValueArray27& other);
11758
11759 const T1 v1_;
11760 const T2 v2_;
11761 const T3 v3_;
11762 const T4 v4_;
11763 const T5 v5_;
11764 const T6 v6_;
11765 const T7 v7_;
11766 const T8 v8_;
11767 const T9 v9_;
11768 const T10 v10_;
11769 const T11 v11_;
11770 const T12 v12_;
11771 const T13 v13_;
11772 const T14 v14_;
11773 const T15 v15_;
11774 const T16 v16_;
11775 const T17 v17_;
11776 const T18 v18_;
11777 const T19 v19_;
11778 const T20 v20_;
11779 const T21 v21_;
11780 const T22 v22_;
11781 const T23 v23_;
11782 const T24 v24_;
11783 const T25 v25_;
11784 const T26 v26_;
11785 const T27 v27_;
11786 };
11787
11788 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11789 typename T6, typename T7, typename T8, typename T9, typename T10,
11790 typename T11, typename T12, typename T13, typename T14, typename T15,
11791 typename T16, typename T17, typename T18, typename T19, typename T20,
11792 typename T21, typename T22, typename T23, typename T24, typename T25,
11793 typename T26, typename T27, typename T28>
11794 class ValueArray28 {
11795 public:
11796 ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11797 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11798 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11799 T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11800 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11801 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11802 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
11803 v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
11804
11805 template <typename T>
11806 operator ParamGenerator<T>() const {
11807 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11808 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11809 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11810 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11811 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11812 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11813 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11814 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11815 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11816 static_cast<T>(v27_), static_cast<T>(v28_)};
11817 return ValuesIn(array);
11818 }
11819
11820 private:
11821
11822 void operator=(const ValueArray28& other);
11823
11824 const T1 v1_;
11825 const T2 v2_;
11826 const T3 v3_;
11827 const T4 v4_;
11828 const T5 v5_;
11829 const T6 v6_;
11830 const T7 v7_;
11831 const T8 v8_;
11832 const T9 v9_;
11833 const T10 v10_;
11834 const T11 v11_;
11835 const T12 v12_;
11836 const T13 v13_;
11837 const T14 v14_;
11838 const T15 v15_;
11839 const T16 v16_;
11840 const T17 v17_;
11841 const T18 v18_;
11842 const T19 v19_;
11843 const T20 v20_;
11844 const T21 v21_;
11845 const T22 v22_;
11846 const T23 v23_;
11847 const T24 v24_;
11848 const T25 v25_;
11849 const T26 v26_;
11850 const T27 v27_;
11851 const T28 v28_;
11852 };
11853
11854 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11855 typename T6, typename T7, typename T8, typename T9, typename T10,
11856 typename T11, typename T12, typename T13, typename T14, typename T15,
11857 typename T16, typename T17, typename T18, typename T19, typename T20,
11858 typename T21, typename T22, typename T23, typename T24, typename T25,
11859 typename T26, typename T27, typename T28, typename T29>
11860 class ValueArray29 {
11861 public:
11862 ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11863 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11864 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11865 T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11866 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11867 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11868 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
11869 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
11870
11871 template <typename T>
11872 operator ParamGenerator<T>() const {
11873 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11874 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11875 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11876 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11877 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11878 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11879 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11880 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11881 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11882 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
11883 return ValuesIn(array);
11884 }
11885
11886 private:
11887
11888 void operator=(const ValueArray29& other);
11889
11890 const T1 v1_;
11891 const T2 v2_;
11892 const T3 v3_;
11893 const T4 v4_;
11894 const T5 v5_;
11895 const T6 v6_;
11896 const T7 v7_;
11897 const T8 v8_;
11898 const T9 v9_;
11899 const T10 v10_;
11900 const T11 v11_;
11901 const T12 v12_;
11902 const T13 v13_;
11903 const T14 v14_;
11904 const T15 v15_;
11905 const T16 v16_;
11906 const T17 v17_;
11907 const T18 v18_;
11908 const T19 v19_;
11909 const T20 v20_;
11910 const T21 v21_;
11911 const T22 v22_;
11912 const T23 v23_;
11913 const T24 v24_;
11914 const T25 v25_;
11915 const T26 v26_;
11916 const T27 v27_;
11917 const T28 v28_;
11918 const T29 v29_;
11919 };
11920
11921 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11922 typename T6, typename T7, typename T8, typename T9, typename T10,
11923 typename T11, typename T12, typename T13, typename T14, typename T15,
11924 typename T16, typename T17, typename T18, typename T19, typename T20,
11925 typename T21, typename T22, typename T23, typename T24, typename T25,
11926 typename T26, typename T27, typename T28, typename T29, typename T30>
11927 class ValueArray30 {
11928 public:
11929 ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11930 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11931 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11932 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
11933 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11934 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11935 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
11936 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
11937 v29_(v29), v30_(v30) {}
11938
11939 template <typename T>
11940 operator ParamGenerator<T>() const {
11941 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11942 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11943 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11944 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11945 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11946 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11947 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11948 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11949 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11950 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
11951 static_cast<T>(v30_)};
11952 return ValuesIn(array);
11953 }
11954
11955 private:
11956
11957 void operator=(const ValueArray30& other);
11958
11959 const T1 v1_;
11960 const T2 v2_;
11961 const T3 v3_;
11962 const T4 v4_;
11963 const T5 v5_;
11964 const T6 v6_;
11965 const T7 v7_;
11966 const T8 v8_;
11967 const T9 v9_;
11968 const T10 v10_;
11969 const T11 v11_;
11970 const T12 v12_;
11971 const T13 v13_;
11972 const T14 v14_;
11973 const T15 v15_;
11974 const T16 v16_;
11975 const T17 v17_;
11976 const T18 v18_;
11977 const T19 v19_;
11978 const T20 v20_;
11979 const T21 v21_;
11980 const T22 v22_;
11981 const T23 v23_;
11982 const T24 v24_;
11983 const T25 v25_;
11984 const T26 v26_;
11985 const T27 v27_;
11986 const T28 v28_;
11987 const T29 v29_;
11988 const T30 v30_;
11989 };
11990
11991 template <typename T1, typename T2, typename T3, typename T4, typename T5,
11992 typename T6, typename T7, typename T8, typename T9, typename T10,
11993 typename T11, typename T12, typename T13, typename T14, typename T15,
11994 typename T16, typename T17, typename T18, typename T19, typename T20,
11995 typename T21, typename T22, typename T23, typename T24, typename T25,
11996 typename T26, typename T27, typename T28, typename T29, typename T30,
11997 typename T31>
11998 class ValueArray31 {
11999 public:
12000 ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12001 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12002 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12003 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
12004 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12005 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12006 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12007 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12008 v29_(v29), v30_(v30), v31_(v31) {}
12009
12010 template <typename T>
12011 operator ParamGenerator<T>() const {
12012 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12013 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12014 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12015 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12016 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12017 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12018 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12019 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12020 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12021 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12022 static_cast<T>(v30_), static_cast<T>(v31_)};
12023 return ValuesIn(array);
12024 }
12025
12026 private:
12027
12028 void operator=(const ValueArray31& other);
12029
12030 const T1 v1_;
12031 const T2 v2_;
12032 const T3 v3_;
12033 const T4 v4_;
12034 const T5 v5_;
12035 const T6 v6_;
12036 const T7 v7_;
12037 const T8 v8_;
12038 const T9 v9_;
12039 const T10 v10_;
12040 const T11 v11_;
12041 const T12 v12_;
12042 const T13 v13_;
12043 const T14 v14_;
12044 const T15 v15_;
12045 const T16 v16_;
12046 const T17 v17_;
12047 const T18 v18_;
12048 const T19 v19_;
12049 const T20 v20_;
12050 const T21 v21_;
12051 const T22 v22_;
12052 const T23 v23_;
12053 const T24 v24_;
12054 const T25 v25_;
12055 const T26 v26_;
12056 const T27 v27_;
12057 const T28 v28_;
12058 const T29 v29_;
12059 const T30 v30_;
12060 const T31 v31_;
12061 };
12062
12063 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12064 typename T6, typename T7, typename T8, typename T9, typename T10,
12065 typename T11, typename T12, typename T13, typename T14, typename T15,
12066 typename T16, typename T17, typename T18, typename T19, typename T20,
12067 typename T21, typename T22, typename T23, typename T24, typename T25,
12068 typename T26, typename T27, typename T28, typename T29, typename T30,
12069 typename T31, typename T32>
12070 class ValueArray32 {
12071 public:
12072 ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12073 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12074 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12075 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
12076 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
12077 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
12078 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
12079 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
12080 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
12081
12082 template <typename T>
12083 operator ParamGenerator<T>() const {
12084 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12085 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12086 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12087 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12088 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12089 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12090 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12091 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12092 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12093 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12094 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
12095 return ValuesIn(array);
12096 }
12097
12098 private:
12099
12100 void operator=(const ValueArray32& other);
12101
12102 const T1 v1_;
12103 const T2 v2_;
12104 const T3 v3_;
12105 const T4 v4_;
12106 const T5 v5_;
12107 const T6 v6_;
12108 const T7 v7_;
12109 const T8 v8_;
12110 const T9 v9_;
12111 const T10 v10_;
12112 const T11 v11_;
12113 const T12 v12_;
12114 const T13 v13_;
12115 const T14 v14_;
12116 const T15 v15_;
12117 const T16 v16_;
12118 const T17 v17_;
12119 const T18 v18_;
12120 const T19 v19_;
12121 const T20 v20_;
12122 const T21 v21_;
12123 const T22 v22_;
12124 const T23 v23_;
12125 const T24 v24_;
12126 const T25 v25_;
12127 const T26 v26_;
12128 const T27 v27_;
12129 const T28 v28_;
12130 const T29 v29_;
12131 const T30 v30_;
12132 const T31 v31_;
12133 const T32 v32_;
12134 };
12135
12136 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12137 typename T6, typename T7, typename T8, typename T9, typename T10,
12138 typename T11, typename T12, typename T13, typename T14, typename T15,
12139 typename T16, typename T17, typename T18, typename T19, typename T20,
12140 typename T21, typename T22, typename T23, typename T24, typename T25,
12141 typename T26, typename T27, typename T28, typename T29, typename T30,
12142 typename T31, typename T32, typename T33>
12143 class ValueArray33 {
12144 public:
12145 ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12146 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12147 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12148 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
12149 T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12150 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12151 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12152 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12153 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12154 v33_(v33) {}
12155
12156 template <typename T>
12157 operator ParamGenerator<T>() const {
12158 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12159 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12160 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12161 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12162 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12163 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12164 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12165 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12166 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12167 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12168 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12169 static_cast<T>(v33_)};
12170 return ValuesIn(array);
12171 }
12172
12173 private:
12174
12175 void operator=(const ValueArray33& other);
12176
12177 const T1 v1_;
12178 const T2 v2_;
12179 const T3 v3_;
12180 const T4 v4_;
12181 const T5 v5_;
12182 const T6 v6_;
12183 const T7 v7_;
12184 const T8 v8_;
12185 const T9 v9_;
12186 const T10 v10_;
12187 const T11 v11_;
12188 const T12 v12_;
12189 const T13 v13_;
12190 const T14 v14_;
12191 const T15 v15_;
12192 const T16 v16_;
12193 const T17 v17_;
12194 const T18 v18_;
12195 const T19 v19_;
12196 const T20 v20_;
12197 const T21 v21_;
12198 const T22 v22_;
12199 const T23 v23_;
12200 const T24 v24_;
12201 const T25 v25_;
12202 const T26 v26_;
12203 const T27 v27_;
12204 const T28 v28_;
12205 const T29 v29_;
12206 const T30 v30_;
12207 const T31 v31_;
12208 const T32 v32_;
12209 const T33 v33_;
12210 };
12211
12212 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12213 typename T6, typename T7, typename T8, typename T9, typename T10,
12214 typename T11, typename T12, typename T13, typename T14, typename T15,
12215 typename T16, typename T17, typename T18, typename T19, typename T20,
12216 typename T21, typename T22, typename T23, typename T24, typename T25,
12217 typename T26, typename T27, typename T28, typename T29, typename T30,
12218 typename T31, typename T32, typename T33, typename T34>
12219 class ValueArray34 {
12220 public:
12221 ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12222 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12223 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12224 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12225 T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12226 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12227 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12228 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12229 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12230 v33_(v33), v34_(v34) {}
12231
12232 template <typename T>
12233 operator ParamGenerator<T>() const {
12234 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12235 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12236 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12237 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12238 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12239 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12240 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12241 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12242 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12243 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12244 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12245 static_cast<T>(v33_), static_cast<T>(v34_)};
12246 return ValuesIn(array);
12247 }
12248
12249 private:
12250
12251 void operator=(const ValueArray34& other);
12252
12253 const T1 v1_;
12254 const T2 v2_;
12255 const T3 v3_;
12256 const T4 v4_;
12257 const T5 v5_;
12258 const T6 v6_;
12259 const T7 v7_;
12260 const T8 v8_;
12261 const T9 v9_;
12262 const T10 v10_;
12263 const T11 v11_;
12264 const T12 v12_;
12265 const T13 v13_;
12266 const T14 v14_;
12267 const T15 v15_;
12268 const T16 v16_;
12269 const T17 v17_;
12270 const T18 v18_;
12271 const T19 v19_;
12272 const T20 v20_;
12273 const T21 v21_;
12274 const T22 v22_;
12275 const T23 v23_;
12276 const T24 v24_;
12277 const T25 v25_;
12278 const T26 v26_;
12279 const T27 v27_;
12280 const T28 v28_;
12281 const T29 v29_;
12282 const T30 v30_;
12283 const T31 v31_;
12284 const T32 v32_;
12285 const T33 v33_;
12286 const T34 v34_;
12287 };
12288
12289 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12290 typename T6, typename T7, typename T8, typename T9, typename T10,
12291 typename T11, typename T12, typename T13, typename T14, typename T15,
12292 typename T16, typename T17, typename T18, typename T19, typename T20,
12293 typename T21, typename T22, typename T23, typename T24, typename T25,
12294 typename T26, typename T27, typename T28, typename T29, typename T30,
12295 typename T31, typename T32, typename T33, typename T34, typename T35>
12296 class ValueArray35 {
12297 public:
12298 ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12299 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12300 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12301 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12302 T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
12303 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
12304 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
12305 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
12306 v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
12307 v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
12308
12309 template <typename T>
12310 operator ParamGenerator<T>() const {
12311 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12312 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12313 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12314 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12315 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12316 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12317 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12318 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12319 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12320 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12321 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12322 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
12323 return ValuesIn(array);
12324 }
12325
12326 private:
12327
12328 void operator=(const ValueArray35& other);
12329
12330 const T1 v1_;
12331 const T2 v2_;
12332 const T3 v3_;
12333 const T4 v4_;
12334 const T5 v5_;
12335 const T6 v6_;
12336 const T7 v7_;
12337 const T8 v8_;
12338 const T9 v9_;
12339 const T10 v10_;
12340 const T11 v11_;
12341 const T12 v12_;
12342 const T13 v13_;
12343 const T14 v14_;
12344 const T15 v15_;
12345 const T16 v16_;
12346 const T17 v17_;
12347 const T18 v18_;
12348 const T19 v19_;
12349 const T20 v20_;
12350 const T21 v21_;
12351 const T22 v22_;
12352 const T23 v23_;
12353 const T24 v24_;
12354 const T25 v25_;
12355 const T26 v26_;
12356 const T27 v27_;
12357 const T28 v28_;
12358 const T29 v29_;
12359 const T30 v30_;
12360 const T31 v31_;
12361 const T32 v32_;
12362 const T33 v33_;
12363 const T34 v34_;
12364 const T35 v35_;
12365 };
12366
12367 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12368 typename T6, typename T7, typename T8, typename T9, typename T10,
12369 typename T11, typename T12, typename T13, typename T14, typename T15,
12370 typename T16, typename T17, typename T18, typename T19, typename T20,
12371 typename T21, typename T22, typename T23, typename T24, typename T25,
12372 typename T26, typename T27, typename T28, typename T29, typename T30,
12373 typename T31, typename T32, typename T33, typename T34, typename T35,
12374 typename T36>
12375 class ValueArray36 {
12376 public:
12377 ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12378 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12379 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12380 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12381 T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
12382 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
12383 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
12384 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
12385 v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
12386 v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
12387
12388 template <typename T>
12389 operator ParamGenerator<T>() const {
12390 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12391 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12392 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12393 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12394 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12395 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12396 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12397 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12398 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12399 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12400 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12401 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12402 static_cast<T>(v36_)};
12403 return ValuesIn(array);
12404 }
12405
12406 private:
12407
12408 void operator=(const ValueArray36& other);
12409
12410 const T1 v1_;
12411 const T2 v2_;
12412 const T3 v3_;
12413 const T4 v4_;
12414 const T5 v5_;
12415 const T6 v6_;
12416 const T7 v7_;
12417 const T8 v8_;
12418 const T9 v9_;
12419 const T10 v10_;
12420 const T11 v11_;
12421 const T12 v12_;
12422 const T13 v13_;
12423 const T14 v14_;
12424 const T15 v15_;
12425 const T16 v16_;
12426 const T17 v17_;
12427 const T18 v18_;
12428 const T19 v19_;
12429 const T20 v20_;
12430 const T21 v21_;
12431 const T22 v22_;
12432 const T23 v23_;
12433 const T24 v24_;
12434 const T25 v25_;
12435 const T26 v26_;
12436 const T27 v27_;
12437 const T28 v28_;
12438 const T29 v29_;
12439 const T30 v30_;
12440 const T31 v31_;
12441 const T32 v32_;
12442 const T33 v33_;
12443 const T34 v34_;
12444 const T35 v35_;
12445 const T36 v36_;
12446 };
12447
12448 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12449 typename T6, typename T7, typename T8, typename T9, typename T10,
12450 typename T11, typename T12, typename T13, typename T14, typename T15,
12451 typename T16, typename T17, typename T18, typename T19, typename T20,
12452 typename T21, typename T22, typename T23, typename T24, typename T25,
12453 typename T26, typename T27, typename T28, typename T29, typename T30,
12454 typename T31, typename T32, typename T33, typename T34, typename T35,
12455 typename T36, typename T37>
12456 class ValueArray37 {
12457 public:
12458 ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12459 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12460 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12461 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12462 T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
12463 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
12464 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
12465 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
12466 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
12467 v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
12468 v36_(v36), v37_(v37) {}
12469
12470 template <typename T>
12471 operator ParamGenerator<T>() const {
12472 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12473 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12474 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12475 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12476 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12477 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12478 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12479 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12480 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12481 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12482 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12483 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12484 static_cast<T>(v36_), static_cast<T>(v37_)};
12485 return ValuesIn(array);
12486 }
12487
12488 private:
12489
12490 void operator=(const ValueArray37& other);
12491
12492 const T1 v1_;
12493 const T2 v2_;
12494 const T3 v3_;
12495 const T4 v4_;
12496 const T5 v5_;
12497 const T6 v6_;
12498 const T7 v7_;
12499 const T8 v8_;
12500 const T9 v9_;
12501 const T10 v10_;
12502 const T11 v11_;
12503 const T12 v12_;
12504 const T13 v13_;
12505 const T14 v14_;
12506 const T15 v15_;
12507 const T16 v16_;
12508 const T17 v17_;
12509 const T18 v18_;
12510 const T19 v19_;
12511 const T20 v20_;
12512 const T21 v21_;
12513 const T22 v22_;
12514 const T23 v23_;
12515 const T24 v24_;
12516 const T25 v25_;
12517 const T26 v26_;
12518 const T27 v27_;
12519 const T28 v28_;
12520 const T29 v29_;
12521 const T30 v30_;
12522 const T31 v31_;
12523 const T32 v32_;
12524 const T33 v33_;
12525 const T34 v34_;
12526 const T35 v35_;
12527 const T36 v36_;
12528 const T37 v37_;
12529 };
12530
12531 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12532 typename T6, typename T7, typename T8, typename T9, typename T10,
12533 typename T11, typename T12, typename T13, typename T14, typename T15,
12534 typename T16, typename T17, typename T18, typename T19, typename T20,
12535 typename T21, typename T22, typename T23, typename T24, typename T25,
12536 typename T26, typename T27, typename T28, typename T29, typename T30,
12537 typename T31, typename T32, typename T33, typename T34, typename T35,
12538 typename T36, typename T37, typename T38>
12539 class ValueArray38 {
12540 public:
12541 ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12542 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12543 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12544 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12545 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
12546 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12547 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12548 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12549 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12550 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
12551 v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
12552
12553 template <typename T>
12554 operator ParamGenerator<T>() const {
12555 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12556 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12557 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12558 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12559 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12560 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12561 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12562 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12563 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12564 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12565 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12566 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12567 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
12568 return ValuesIn(array);
12569 }
12570
12571 private:
12572
12573 void operator=(const ValueArray38& other);
12574
12575 const T1 v1_;
12576 const T2 v2_;
12577 const T3 v3_;
12578 const T4 v4_;
12579 const T5 v5_;
12580 const T6 v6_;
12581 const T7 v7_;
12582 const T8 v8_;
12583 const T9 v9_;
12584 const T10 v10_;
12585 const T11 v11_;
12586 const T12 v12_;
12587 const T13 v13_;
12588 const T14 v14_;
12589 const T15 v15_;
12590 const T16 v16_;
12591 const T17 v17_;
12592 const T18 v18_;
12593 const T19 v19_;
12594 const T20 v20_;
12595 const T21 v21_;
12596 const T22 v22_;
12597 const T23 v23_;
12598 const T24 v24_;
12599 const T25 v25_;
12600 const T26 v26_;
12601 const T27 v27_;
12602 const T28 v28_;
12603 const T29 v29_;
12604 const T30 v30_;
12605 const T31 v31_;
12606 const T32 v32_;
12607 const T33 v33_;
12608 const T34 v34_;
12609 const T35 v35_;
12610 const T36 v36_;
12611 const T37 v37_;
12612 const T38 v38_;
12613 };
12614
12615 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12616 typename T6, typename T7, typename T8, typename T9, typename T10,
12617 typename T11, typename T12, typename T13, typename T14, typename T15,
12618 typename T16, typename T17, typename T18, typename T19, typename T20,
12619 typename T21, typename T22, typename T23, typename T24, typename T25,
12620 typename T26, typename T27, typename T28, typename T29, typename T30,
12621 typename T31, typename T32, typename T33, typename T34, typename T35,
12622 typename T36, typename T37, typename T38, typename T39>
12623 class ValueArray39 {
12624 public:
12625 ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12626 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12627 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12628 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12629 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
12630 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12631 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12632 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12633 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12634 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
12635 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
12636
12637 template <typename T>
12638 operator ParamGenerator<T>() const {
12639 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12640 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12641 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12642 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12643 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12644 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12645 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12646 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12647 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12648 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12649 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12650 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12651 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12652 static_cast<T>(v39_)};
12653 return ValuesIn(array);
12654 }
12655
12656 private:
12657
12658 void operator=(const ValueArray39& other);
12659
12660 const T1 v1_;
12661 const T2 v2_;
12662 const T3 v3_;
12663 const T4 v4_;
12664 const T5 v5_;
12665 const T6 v6_;
12666 const T7 v7_;
12667 const T8 v8_;
12668 const T9 v9_;
12669 const T10 v10_;
12670 const T11 v11_;
12671 const T12 v12_;
12672 const T13 v13_;
12673 const T14 v14_;
12674 const T15 v15_;
12675 const T16 v16_;
12676 const T17 v17_;
12677 const T18 v18_;
12678 const T19 v19_;
12679 const T20 v20_;
12680 const T21 v21_;
12681 const T22 v22_;
12682 const T23 v23_;
12683 const T24 v24_;
12684 const T25 v25_;
12685 const T26 v26_;
12686 const T27 v27_;
12687 const T28 v28_;
12688 const T29 v29_;
12689 const T30 v30_;
12690 const T31 v31_;
12691 const T32 v32_;
12692 const T33 v33_;
12693 const T34 v34_;
12694 const T35 v35_;
12695 const T36 v36_;
12696 const T37 v37_;
12697 const T38 v38_;
12698 const T39 v39_;
12699 };
12700
12701 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12702 typename T6, typename T7, typename T8, typename T9, typename T10,
12703 typename T11, typename T12, typename T13, typename T14, typename T15,
12704 typename T16, typename T17, typename T18, typename T19, typename T20,
12705 typename T21, typename T22, typename T23, typename T24, typename T25,
12706 typename T26, typename T27, typename T28, typename T29, typename T30,
12707 typename T31, typename T32, typename T33, typename T34, typename T35,
12708 typename T36, typename T37, typename T38, typename T39, typename T40>
12709 class ValueArray40 {
12710 public:
12711 ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12712 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12713 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12714 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12715 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
12716 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
12717 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
12718 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
12719 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
12720 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
12721 v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
12722 v40_(v40) {}
12723
12724 template <typename T>
12725 operator ParamGenerator<T>() const {
12726 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12727 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12728 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12729 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12730 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12731 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12732 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12733 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12734 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12735 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12736 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12737 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12738 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12739 static_cast<T>(v39_), static_cast<T>(v40_)};
12740 return ValuesIn(array);
12741 }
12742
12743 private:
12744
12745 void operator=(const ValueArray40& other);
12746
12747 const T1 v1_;
12748 const T2 v2_;
12749 const T3 v3_;
12750 const T4 v4_;
12751 const T5 v5_;
12752 const T6 v6_;
12753 const T7 v7_;
12754 const T8 v8_;
12755 const T9 v9_;
12756 const T10 v10_;
12757 const T11 v11_;
12758 const T12 v12_;
12759 const T13 v13_;
12760 const T14 v14_;
12761 const T15 v15_;
12762 const T16 v16_;
12763 const T17 v17_;
12764 const T18 v18_;
12765 const T19 v19_;
12766 const T20 v20_;
12767 const T21 v21_;
12768 const T22 v22_;
12769 const T23 v23_;
12770 const T24 v24_;
12771 const T25 v25_;
12772 const T26 v26_;
12773 const T27 v27_;
12774 const T28 v28_;
12775 const T29 v29_;
12776 const T30 v30_;
12777 const T31 v31_;
12778 const T32 v32_;
12779 const T33 v33_;
12780 const T34 v34_;
12781 const T35 v35_;
12782 const T36 v36_;
12783 const T37 v37_;
12784 const T38 v38_;
12785 const T39 v39_;
12786 const T40 v40_;
12787 };
12788
12789 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12790 typename T6, typename T7, typename T8, typename T9, typename T10,
12791 typename T11, typename T12, typename T13, typename T14, typename T15,
12792 typename T16, typename T17, typename T18, typename T19, typename T20,
12793 typename T21, typename T22, typename T23, typename T24, typename T25,
12794 typename T26, typename T27, typename T28, typename T29, typename T30,
12795 typename T31, typename T32, typename T33, typename T34, typename T35,
12796 typename T36, typename T37, typename T38, typename T39, typename T40,
12797 typename T41>
12798 class ValueArray41 {
12799 public:
12800 ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12801 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12802 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12803 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12804 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
12805 T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12806 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12807 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12808 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12809 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12810 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
12811 v39_(v39), v40_(v40), v41_(v41) {}
12812
12813 template <typename T>
12814 operator ParamGenerator<T>() const {
12815 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12816 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12817 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12818 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12819 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12820 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12821 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12822 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12823 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12824 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12825 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12826 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12827 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12828 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
12829 return ValuesIn(array);
12830 }
12831
12832 private:
12833
12834 void operator=(const ValueArray41& other);
12835
12836 const T1 v1_;
12837 const T2 v2_;
12838 const T3 v3_;
12839 const T4 v4_;
12840 const T5 v5_;
12841 const T6 v6_;
12842 const T7 v7_;
12843 const T8 v8_;
12844 const T9 v9_;
12845 const T10 v10_;
12846 const T11 v11_;
12847 const T12 v12_;
12848 const T13 v13_;
12849 const T14 v14_;
12850 const T15 v15_;
12851 const T16 v16_;
12852 const T17 v17_;
12853 const T18 v18_;
12854 const T19 v19_;
12855 const T20 v20_;
12856 const T21 v21_;
12857 const T22 v22_;
12858 const T23 v23_;
12859 const T24 v24_;
12860 const T25 v25_;
12861 const T26 v26_;
12862 const T27 v27_;
12863 const T28 v28_;
12864 const T29 v29_;
12865 const T30 v30_;
12866 const T31 v31_;
12867 const T32 v32_;
12868 const T33 v33_;
12869 const T34 v34_;
12870 const T35 v35_;
12871 const T36 v36_;
12872 const T37 v37_;
12873 const T38 v38_;
12874 const T39 v39_;
12875 const T40 v40_;
12876 const T41 v41_;
12877 };
12878
12879 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12880 typename T6, typename T7, typename T8, typename T9, typename T10,
12881 typename T11, typename T12, typename T13, typename T14, typename T15,
12882 typename T16, typename T17, typename T18, typename T19, typename T20,
12883 typename T21, typename T22, typename T23, typename T24, typename T25,
12884 typename T26, typename T27, typename T28, typename T29, typename T30,
12885 typename T31, typename T32, typename T33, typename T34, typename T35,
12886 typename T36, typename T37, typename T38, typename T39, typename T40,
12887 typename T41, typename T42>
12888 class ValueArray42 {
12889 public:
12890 ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12891 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12892 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12893 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12894 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
12895 T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12896 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12897 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12898 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12899 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12900 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
12901 v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
12902
12903 template <typename T>
12904 operator ParamGenerator<T>() const {
12905 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12906 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12907 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12908 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12909 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12910 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12911 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12912 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12913 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12914 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12915 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12916 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12917 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12918 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
12919 static_cast<T>(v42_)};
12920 return ValuesIn(array);
12921 }
12922
12923 private:
12924
12925 void operator=(const ValueArray42& other);
12926
12927 const T1 v1_;
12928 const T2 v2_;
12929 const T3 v3_;
12930 const T4 v4_;
12931 const T5 v5_;
12932 const T6 v6_;
12933 const T7 v7_;
12934 const T8 v8_;
12935 const T9 v9_;
12936 const T10 v10_;
12937 const T11 v11_;
12938 const T12 v12_;
12939 const T13 v13_;
12940 const T14 v14_;
12941 const T15 v15_;
12942 const T16 v16_;
12943 const T17 v17_;
12944 const T18 v18_;
12945 const T19 v19_;
12946 const T20 v20_;
12947 const T21 v21_;
12948 const T22 v22_;
12949 const T23 v23_;
12950 const T24 v24_;
12951 const T25 v25_;
12952 const T26 v26_;
12953 const T27 v27_;
12954 const T28 v28_;
12955 const T29 v29_;
12956 const T30 v30_;
12957 const T31 v31_;
12958 const T32 v32_;
12959 const T33 v33_;
12960 const T34 v34_;
12961 const T35 v35_;
12962 const T36 v36_;
12963 const T37 v37_;
12964 const T38 v38_;
12965 const T39 v39_;
12966 const T40 v40_;
12967 const T41 v41_;
12968 const T42 v42_;
12969 };
12970
12971 template <typename T1, typename T2, typename T3, typename T4, typename T5,
12972 typename T6, typename T7, typename T8, typename T9, typename T10,
12973 typename T11, typename T12, typename T13, typename T14, typename T15,
12974 typename T16, typename T17, typename T18, typename T19, typename T20,
12975 typename T21, typename T22, typename T23, typename T24, typename T25,
12976 typename T26, typename T27, typename T28, typename T29, typename T30,
12977 typename T31, typename T32, typename T33, typename T34, typename T35,
12978 typename T36, typename T37, typename T38, typename T39, typename T40,
12979 typename T41, typename T42, typename T43>
12980 class ValueArray43 {
12981 public:
12982 ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12983 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12984 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12985 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12986 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
12987 T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
12988 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
12989 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
12990 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
12991 v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
12992 v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
12993 v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
12994
12995 template <typename T>
12996 operator ParamGenerator<T>() const {
12997 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12998 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12999 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13000 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13001 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13002 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13003 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13004 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13005 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13006 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13007 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13008 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13009 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13010 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13011 static_cast<T>(v42_), static_cast<T>(v43_)};
13012 return ValuesIn(array);
13013 }
13014
13015 private:
13016
13017 void operator=(const ValueArray43& other);
13018
13019 const T1 v1_;
13020 const T2 v2_;
13021 const T3 v3_;
13022 const T4 v4_;
13023 const T5 v5_;
13024 const T6 v6_;
13025 const T7 v7_;
13026 const T8 v8_;
13027 const T9 v9_;
13028 const T10 v10_;
13029 const T11 v11_;
13030 const T12 v12_;
13031 const T13 v13_;
13032 const T14 v14_;
13033 const T15 v15_;
13034 const T16 v16_;
13035 const T17 v17_;
13036 const T18 v18_;
13037 const T19 v19_;
13038 const T20 v20_;
13039 const T21 v21_;
13040 const T22 v22_;
13041 const T23 v23_;
13042 const T24 v24_;
13043 const T25 v25_;
13044 const T26 v26_;
13045 const T27 v27_;
13046 const T28 v28_;
13047 const T29 v29_;
13048 const T30 v30_;
13049 const T31 v31_;
13050 const T32 v32_;
13051 const T33 v33_;
13052 const T34 v34_;
13053 const T35 v35_;
13054 const T36 v36_;
13055 const T37 v37_;
13056 const T38 v38_;
13057 const T39 v39_;
13058 const T40 v40_;
13059 const T41 v41_;
13060 const T42 v42_;
13061 const T43 v43_;
13062 };
13063
13064 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13065 typename T6, typename T7, typename T8, typename T9, typename T10,
13066 typename T11, typename T12, typename T13, typename T14, typename T15,
13067 typename T16, typename T17, typename T18, typename T19, typename T20,
13068 typename T21, typename T22, typename T23, typename T24, typename T25,
13069 typename T26, typename T27, typename T28, typename T29, typename T30,
13070 typename T31, typename T32, typename T33, typename T34, typename T35,
13071 typename T36, typename T37, typename T38, typename T39, typename T40,
13072 typename T41, typename T42, typename T43, typename T44>
13073 class ValueArray44 {
13074 public:
13075 ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13076 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13077 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13078 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13079 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13080 T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
13081 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
13082 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
13083 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
13084 v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
13085 v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
13086 v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
13087 v43_(v43), v44_(v44) {}
13088
13089 template <typename T>
13090 operator ParamGenerator<T>() const {
13091 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13092 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13093 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13094 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13095 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13096 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13097 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13098 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13099 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13100 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13101 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13102 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13103 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13104 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13105 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
13106 return ValuesIn(array);
13107 }
13108
13109 private:
13110
13111 void operator=(const ValueArray44& other);
13112
13113 const T1 v1_;
13114 const T2 v2_;
13115 const T3 v3_;
13116 const T4 v4_;
13117 const T5 v5_;
13118 const T6 v6_;
13119 const T7 v7_;
13120 const T8 v8_;
13121 const T9 v9_;
13122 const T10 v10_;
13123 const T11 v11_;
13124 const T12 v12_;
13125 const T13 v13_;
13126 const T14 v14_;
13127 const T15 v15_;
13128 const T16 v16_;
13129 const T17 v17_;
13130 const T18 v18_;
13131 const T19 v19_;
13132 const T20 v20_;
13133 const T21 v21_;
13134 const T22 v22_;
13135 const T23 v23_;
13136 const T24 v24_;
13137 const T25 v25_;
13138 const T26 v26_;
13139 const T27 v27_;
13140 const T28 v28_;
13141 const T29 v29_;
13142 const T30 v30_;
13143 const T31 v31_;
13144 const T32 v32_;
13145 const T33 v33_;
13146 const T34 v34_;
13147 const T35 v35_;
13148 const T36 v36_;
13149 const T37 v37_;
13150 const T38 v38_;
13151 const T39 v39_;
13152 const T40 v40_;
13153 const T41 v41_;
13154 const T42 v42_;
13155 const T43 v43_;
13156 const T44 v44_;
13157 };
13158
13159 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13160 typename T6, typename T7, typename T8, typename T9, typename T10,
13161 typename T11, typename T12, typename T13, typename T14, typename T15,
13162 typename T16, typename T17, typename T18, typename T19, typename T20,
13163 typename T21, typename T22, typename T23, typename T24, typename T25,
13164 typename T26, typename T27, typename T28, typename T29, typename T30,
13165 typename T31, typename T32, typename T33, typename T34, typename T35,
13166 typename T36, typename T37, typename T38, typename T39, typename T40,
13167 typename T41, typename T42, typename T43, typename T44, typename T45>
13168 class ValueArray45 {
13169 public:
13170 ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13171 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13172 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13173 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13174 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13175 T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
13176 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
13177 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
13178 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
13179 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
13180 v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
13181 v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
13182 v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
13183
13184 template <typename T>
13185 operator ParamGenerator<T>() const {
13186 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13187 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13188 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13189 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13190 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13191 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13192 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13193 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13194 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13195 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13196 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13197 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13198 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13199 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13200 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13201 static_cast<T>(v45_)};
13202 return ValuesIn(array);
13203 }
13204
13205 private:
13206
13207 void operator=(const ValueArray45& other);
13208
13209 const T1 v1_;
13210 const T2 v2_;
13211 const T3 v3_;
13212 const T4 v4_;
13213 const T5 v5_;
13214 const T6 v6_;
13215 const T7 v7_;
13216 const T8 v8_;
13217 const T9 v9_;
13218 const T10 v10_;
13219 const T11 v11_;
13220 const T12 v12_;
13221 const T13 v13_;
13222 const T14 v14_;
13223 const T15 v15_;
13224 const T16 v16_;
13225 const T17 v17_;
13226 const T18 v18_;
13227 const T19 v19_;
13228 const T20 v20_;
13229 const T21 v21_;
13230 const T22 v22_;
13231 const T23 v23_;
13232 const T24 v24_;
13233 const T25 v25_;
13234 const T26 v26_;
13235 const T27 v27_;
13236 const T28 v28_;
13237 const T29 v29_;
13238 const T30 v30_;
13239 const T31 v31_;
13240 const T32 v32_;
13241 const T33 v33_;
13242 const T34 v34_;
13243 const T35 v35_;
13244 const T36 v36_;
13245 const T37 v37_;
13246 const T38 v38_;
13247 const T39 v39_;
13248 const T40 v40_;
13249 const T41 v41_;
13250 const T42 v42_;
13251 const T43 v43_;
13252 const T44 v44_;
13253 const T45 v45_;
13254 };
13255
13256 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13257 typename T6, typename T7, typename T8, typename T9, typename T10,
13258 typename T11, typename T12, typename T13, typename T14, typename T15,
13259 typename T16, typename T17, typename T18, typename T19, typename T20,
13260 typename T21, typename T22, typename T23, typename T24, typename T25,
13261 typename T26, typename T27, typename T28, typename T29, typename T30,
13262 typename T31, typename T32, typename T33, typename T34, typename T35,
13263 typename T36, typename T37, typename T38, typename T39, typename T40,
13264 typename T41, typename T42, typename T43, typename T44, typename T45,
13265 typename T46>
13266 class ValueArray46 {
13267 public:
13268 ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13269 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13270 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13271 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13272 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13273 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
13274 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13275 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13276 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13277 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13278 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
13279 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
13280 v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
13281
13282 template <typename T>
13283 operator ParamGenerator<T>() const {
13284 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13285 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13286 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13287 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13288 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13289 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13290 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13291 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13292 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13293 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13294 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13295 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13296 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13297 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13298 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13299 static_cast<T>(v45_), static_cast<T>(v46_)};
13300 return ValuesIn(array);
13301 }
13302
13303 private:
13304
13305 void operator=(const ValueArray46& other);
13306
13307 const T1 v1_;
13308 const T2 v2_;
13309 const T3 v3_;
13310 const T4 v4_;
13311 const T5 v5_;
13312 const T6 v6_;
13313 const T7 v7_;
13314 const T8 v8_;
13315 const T9 v9_;
13316 const T10 v10_;
13317 const T11 v11_;
13318 const T12 v12_;
13319 const T13 v13_;
13320 const T14 v14_;
13321 const T15 v15_;
13322 const T16 v16_;
13323 const T17 v17_;
13324 const T18 v18_;
13325 const T19 v19_;
13326 const T20 v20_;
13327 const T21 v21_;
13328 const T22 v22_;
13329 const T23 v23_;
13330 const T24 v24_;
13331 const T25 v25_;
13332 const T26 v26_;
13333 const T27 v27_;
13334 const T28 v28_;
13335 const T29 v29_;
13336 const T30 v30_;
13337 const T31 v31_;
13338 const T32 v32_;
13339 const T33 v33_;
13340 const T34 v34_;
13341 const T35 v35_;
13342 const T36 v36_;
13343 const T37 v37_;
13344 const T38 v38_;
13345 const T39 v39_;
13346 const T40 v40_;
13347 const T41 v41_;
13348 const T42 v42_;
13349 const T43 v43_;
13350 const T44 v44_;
13351 const T45 v45_;
13352 const T46 v46_;
13353 };
13354
13355 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13356 typename T6, typename T7, typename T8, typename T9, typename T10,
13357 typename T11, typename T12, typename T13, typename T14, typename T15,
13358 typename T16, typename T17, typename T18, typename T19, typename T20,
13359 typename T21, typename T22, typename T23, typename T24, typename T25,
13360 typename T26, typename T27, typename T28, typename T29, typename T30,
13361 typename T31, typename T32, typename T33, typename T34, typename T35,
13362 typename T36, typename T37, typename T38, typename T39, typename T40,
13363 typename T41, typename T42, typename T43, typename T44, typename T45,
13364 typename T46, typename T47>
13365 class ValueArray47 {
13366 public:
13367 ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13368 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13369 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13370 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13371 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13372 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
13373 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13374 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13375 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13376 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13377 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
13378 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
13379 v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
13380 v47_(v47) {}
13381
13382 template <typename T>
13383 operator ParamGenerator<T>() const {
13384 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13385 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13386 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13387 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13388 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13389 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13390 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13391 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13392 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13393 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13394 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13395 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13396 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13397 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13398 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13399 static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
13400 return ValuesIn(array);
13401 }
13402
13403 private:
13404
13405 void operator=(const ValueArray47& other);
13406
13407 const T1 v1_;
13408 const T2 v2_;
13409 const T3 v3_;
13410 const T4 v4_;
13411 const T5 v5_;
13412 const T6 v6_;
13413 const T7 v7_;
13414 const T8 v8_;
13415 const T9 v9_;
13416 const T10 v10_;
13417 const T11 v11_;
13418 const T12 v12_;
13419 const T13 v13_;
13420 const T14 v14_;
13421 const T15 v15_;
13422 const T16 v16_;
13423 const T17 v17_;
13424 const T18 v18_;
13425 const T19 v19_;
13426 const T20 v20_;
13427 const T21 v21_;
13428 const T22 v22_;
13429 const T23 v23_;
13430 const T24 v24_;
13431 const T25 v25_;
13432 const T26 v26_;
13433 const T27 v27_;
13434 const T28 v28_;
13435 const T29 v29_;
13436 const T30 v30_;
13437 const T31 v31_;
13438 const T32 v32_;
13439 const T33 v33_;
13440 const T34 v34_;
13441 const T35 v35_;
13442 const T36 v36_;
13443 const T37 v37_;
13444 const T38 v38_;
13445 const T39 v39_;
13446 const T40 v40_;
13447 const T41 v41_;
13448 const T42 v42_;
13449 const T43 v43_;
13450 const T44 v44_;
13451 const T45 v45_;
13452 const T46 v46_;
13453 const T47 v47_;
13454 };
13455
13456 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13457 typename T6, typename T7, typename T8, typename T9, typename T10,
13458 typename T11, typename T12, typename T13, typename T14, typename T15,
13459 typename T16, typename T17, typename T18, typename T19, typename T20,
13460 typename T21, typename T22, typename T23, typename T24, typename T25,
13461 typename T26, typename T27, typename T28, typename T29, typename T30,
13462 typename T31, typename T32, typename T33, typename T34, typename T35,
13463 typename T36, typename T37, typename T38, typename T39, typename T40,
13464 typename T41, typename T42, typename T43, typename T44, typename T45,
13465 typename T46, typename T47, typename T48>
13466 class ValueArray48 {
13467 public:
13468 ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13469 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13470 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13471 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13472 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13473 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
13474 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
13475 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
13476 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
13477 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
13478 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
13479 v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
13480 v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
13481 v46_(v46), v47_(v47), v48_(v48) {}
13482
13483 template <typename T>
13484 operator ParamGenerator<T>() const {
13485 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13486 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13487 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13488 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13489 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13490 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13491 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13492 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13493 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13494 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13495 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13496 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13497 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13498 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13499 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13500 static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13501 static_cast<T>(v48_)};
13502 return ValuesIn(array);
13503 }
13504
13505 private:
13506
13507 void operator=(const ValueArray48& other);
13508
13509 const T1 v1_;
13510 const T2 v2_;
13511 const T3 v3_;
13512 const T4 v4_;
13513 const T5 v5_;
13514 const T6 v6_;
13515 const T7 v7_;
13516 const T8 v8_;
13517 const T9 v9_;
13518 const T10 v10_;
13519 const T11 v11_;
13520 const T12 v12_;
13521 const T13 v13_;
13522 const T14 v14_;
13523 const T15 v15_;
13524 const T16 v16_;
13525 const T17 v17_;
13526 const T18 v18_;
13527 const T19 v19_;
13528 const T20 v20_;
13529 const T21 v21_;
13530 const T22 v22_;
13531 const T23 v23_;
13532 const T24 v24_;
13533 const T25 v25_;
13534 const T26 v26_;
13535 const T27 v27_;
13536 const T28 v28_;
13537 const T29 v29_;
13538 const T30 v30_;
13539 const T31 v31_;
13540 const T32 v32_;
13541 const T33 v33_;
13542 const T34 v34_;
13543 const T35 v35_;
13544 const T36 v36_;
13545 const T37 v37_;
13546 const T38 v38_;
13547 const T39 v39_;
13548 const T40 v40_;
13549 const T41 v41_;
13550 const T42 v42_;
13551 const T43 v43_;
13552 const T44 v44_;
13553 const T45 v45_;
13554 const T46 v46_;
13555 const T47 v47_;
13556 const T48 v48_;
13557 };
13558
13559 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13560 typename T6, typename T7, typename T8, typename T9, typename T10,
13561 typename T11, typename T12, typename T13, typename T14, typename T15,
13562 typename T16, typename T17, typename T18, typename T19, typename T20,
13563 typename T21, typename T22, typename T23, typename T24, typename T25,
13564 typename T26, typename T27, typename T28, typename T29, typename T30,
13565 typename T31, typename T32, typename T33, typename T34, typename T35,
13566 typename T36, typename T37, typename T38, typename T39, typename T40,
13567 typename T41, typename T42, typename T43, typename T44, typename T45,
13568 typename T46, typename T47, typename T48, typename T49>
13569 class ValueArray49 {
13570 public:
13571 ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13572 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13573 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13574 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13575 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13576 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
13577 T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
13578 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
13579 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
13580 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
13581 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
13582 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
13583 v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
13584 v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
13585
13586 template <typename T>
13587 operator ParamGenerator<T>() const {
13588 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13589 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13590 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13591 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13592 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13593 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13594 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13595 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13596 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13597 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13598 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13599 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13600 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13601 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13602 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13603 static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13604 static_cast<T>(v48_), static_cast<T>(v49_)};
13605 return ValuesIn(array);
13606 }
13607
13608 private:
13609
13610 void operator=(const ValueArray49& other);
13611
13612 const T1 v1_;
13613 const T2 v2_;
13614 const T3 v3_;
13615 const T4 v4_;
13616 const T5 v5_;
13617 const T6 v6_;
13618 const T7 v7_;
13619 const T8 v8_;
13620 const T9 v9_;
13621 const T10 v10_;
13622 const T11 v11_;
13623 const T12 v12_;
13624 const T13 v13_;
13625 const T14 v14_;
13626 const T15 v15_;
13627 const T16 v16_;
13628 const T17 v17_;
13629 const T18 v18_;
13630 const T19 v19_;
13631 const T20 v20_;
13632 const T21 v21_;
13633 const T22 v22_;
13634 const T23 v23_;
13635 const T24 v24_;
13636 const T25 v25_;
13637 const T26 v26_;
13638 const T27 v27_;
13639 const T28 v28_;
13640 const T29 v29_;
13641 const T30 v30_;
13642 const T31 v31_;
13643 const T32 v32_;
13644 const T33 v33_;
13645 const T34 v34_;
13646 const T35 v35_;
13647 const T36 v36_;
13648 const T37 v37_;
13649 const T38 v38_;
13650 const T39 v39_;
13651 const T40 v40_;
13652 const T41 v41_;
13653 const T42 v42_;
13654 const T43 v43_;
13655 const T44 v44_;
13656 const T45 v45_;
13657 const T46 v46_;
13658 const T47 v47_;
13659 const T48 v48_;
13660 const T49 v49_;
13661 };
13662
13663 template <typename T1, typename T2, typename T3, typename T4, typename T5,
13664 typename T6, typename T7, typename T8, typename T9, typename T10,
13665 typename T11, typename T12, typename T13, typename T14, typename T15,
13666 typename T16, typename T17, typename T18, typename T19, typename T20,
13667 typename T21, typename T22, typename T23, typename T24, typename T25,
13668 typename T26, typename T27, typename T28, typename T29, typename T30,
13669 typename T31, typename T32, typename T33, typename T34, typename T35,
13670 typename T36, typename T37, typename T38, typename T39, typename T40,
13671 typename T41, typename T42, typename T43, typename T44, typename T45,
13672 typename T46, typename T47, typename T48, typename T49, typename T50>
13673 class ValueArray50 {
13674 public:
13675 ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13676 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13677 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13678 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13679 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13680 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
13681 T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
13682 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
13683 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
13684 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
13685 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
13686 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
13687 v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
13688 v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
13689
13690 template <typename T>
13691 operator ParamGenerator<T>() const {
13692 const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13693 static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13694 static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13695 static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13696 static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13697 static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13698 static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13699 static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13700 static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13701 static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13702 static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13703 static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13704 static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13705 static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13706 static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13707 static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13708 static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
13709 return ValuesIn(array);
13710 }
13711
13712 private:
13713
13714 void operator=(const ValueArray50& other);
13715
13716 const T1 v1_;
13717 const T2 v2_;
13718 const T3 v3_;
13719 const T4 v4_;
13720 const T5 v5_;
13721 const T6 v6_;
13722 const T7 v7_;
13723 const T8 v8_;
13724 const T9 v9_;
13725 const T10 v10_;
13726 const T11 v11_;
13727 const T12 v12_;
13728 const T13 v13_;
13729 const T14 v14_;
13730 const T15 v15_;
13731 const T16 v16_;
13732 const T17 v17_;
13733 const T18 v18_;
13734 const T19 v19_;
13735 const T20 v20_;
13736 const T21 v21_;
13737 const T22 v22_;
13738 const T23 v23_;
13739 const T24 v24_;
13740 const T25 v25_;
13741 const T26 v26_;
13742 const T27 v27_;
13743 const T28 v28_;
13744 const T29 v29_;
13745 const T30 v30_;
13746 const T31 v31_;
13747 const T32 v32_;
13748 const T33 v33_;
13749 const T34 v34_;
13750 const T35 v35_;
13751 const T36 v36_;
13752 const T37 v37_;
13753 const T38 v38_;
13754 const T39 v39_;
13755 const T40 v40_;
13756 const T41 v41_;
13757 const T42 v42_;
13758 const T43 v43_;
13759 const T44 v44_;
13760 const T45 v45_;
13761 const T46 v46_;
13762 const T47 v47_;
13763 const T48 v48_;
13764 const T49 v49_;
13765 const T50 v50_;
13766 };
13767
13768 # if GTEST_HAS_COMBINE
13769
13770
13771
13772
13773
13774 template <typename T1, typename T2>
13775 class CartesianProductGenerator2
13776 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
13777 public:
13778 typedef ::std::tr1::tuple<T1, T2> ParamType;
13779
13780 CartesianProductGenerator2(const ParamGenerator<T1>& g1,
13781 const ParamGenerator<T2>& g2)
13782 : g1_(g1), g2_(g2) {}
13783 virtual ~CartesianProductGenerator2() {}
13784
13785 virtual ParamIteratorInterface<ParamType>* Begin() const {
13786 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
13787 }
13788 virtual ParamIteratorInterface<ParamType>* End() const {
13789 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
13790 }
13791
13792 private:
13793 class Iterator : public ParamIteratorInterface<ParamType> {
13794 public:
13795 Iterator(const ParamGeneratorInterface<ParamType>* base,
13796 const ParamGenerator<T1>& g1,
13797 const typename ParamGenerator<T1>::iterator& current1,
13798 const ParamGenerator<T2>& g2,
13799 const typename ParamGenerator<T2>::iterator& current2)
13800 : base_(base),
13801 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
13802 begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {
13803 ComputeCurrentValue();
13804 }
13805 virtual ~Iterator() {}
13806
13807 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
13808 return base_;
13809 }
13810
13811
13812 virtual void Advance() {
13813 assert(!AtEnd());
13814 ++current2_;
13815 if (current2_ == end2_) {
13816 current2_ = begin2_;
13817 ++current1_;
13818 }
13819 ComputeCurrentValue();
13820 }
13821 virtual ParamIteratorInterface<ParamType>* Clone() const {
13822 return new Iterator(*this);
13823 }
13824 virtual const ParamType* Current() const { return ¤t_value_; }
13825 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
13826
13827
13828 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
13829 << "The program attempted to compare iterators "
13830 << "from different generators." << std::endl;
13831 const Iterator* typed_other =
13832 CheckedDowncastToActualType<const Iterator>(&other);
13833
13834
13835
13836 return (AtEnd() && typed_other->AtEnd()) ||
13837 (
13838 current1_ == typed_other->current1_ &&
13839 current2_ == typed_other->current2_);
13840 }
13841
13842 private:
13843 Iterator(const Iterator& other)
13844 : base_(other.base_),
13845 begin1_(other.begin1_),
13846 end1_(other.end1_),
13847 current1_(other.current1_),
13848 begin2_(other.begin2_),
13849 end2_(other.end2_),
13850 current2_(other.current2_) {
13851 ComputeCurrentValue();
13852 }
13853
13854 void ComputeCurrentValue() {
13855 if (!AtEnd())
13856 current_value_ = ParamType(*current1_, *current2_);
13857 }
13858 bool AtEnd() const {
13859
13860
13861 return
13862 current1_ == end1_ ||
13863 current2_ == end2_;
13864 }
13865
13866
13867 void operator=(const Iterator& other);
13868
13869 const ParamGeneratorInterface<ParamType>* const base_;
13870
13871
13872 const typename ParamGenerator<T1>::iterator begin1_;
13873 const typename ParamGenerator<T1>::iterator end1_;
13874 typename ParamGenerator<T1>::iterator current1_;
13875 const typename ParamGenerator<T2>::iterator begin2_;
13876 const typename ParamGenerator<T2>::iterator end2_;
13877 typename ParamGenerator<T2>::iterator current2_;
13878 ParamType current_value_;
13879 };
13880
13881
13882 void operator=(const CartesianProductGenerator2& other);
13883
13884 const ParamGenerator<T1> g1_;
13885 const ParamGenerator<T2> g2_;
13886 };
13887
13888
13889 template <typename T1, typename T2, typename T3>
13890 class CartesianProductGenerator3
13891 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
13892 public:
13893 typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
13894
13895 CartesianProductGenerator3(const ParamGenerator<T1>& g1,
13896 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
13897 : g1_(g1), g2_(g2), g3_(g3) {}
13898 virtual ~CartesianProductGenerator3() {}
13899
13900 virtual ParamIteratorInterface<ParamType>* Begin() const {
13901 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
13902 g3_.begin());
13903 }
13904 virtual ParamIteratorInterface<ParamType>* End() const {
13905 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
13906 }
13907
13908 private:
13909 class Iterator : public ParamIteratorInterface<ParamType> {
13910 public:
13911 Iterator(const ParamGeneratorInterface<ParamType>* base,
13912 const ParamGenerator<T1>& g1,
13913 const typename ParamGenerator<T1>::iterator& current1,
13914 const ParamGenerator<T2>& g2,
13915 const typename ParamGenerator<T2>::iterator& current2,
13916 const ParamGenerator<T3>& g3,
13917 const typename ParamGenerator<T3>::iterator& current3)
13918 : base_(base),
13919 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
13920 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
13921 begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {
13922 ComputeCurrentValue();
13923 }
13924 virtual ~Iterator() {}
13925
13926 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
13927 return base_;
13928 }
13929
13930
13931 virtual void Advance() {
13932 assert(!AtEnd());
13933 ++current3_;
13934 if (current3_ == end3_) {
13935 current3_ = begin3_;
13936 ++current2_;
13937 }
13938 if (current2_ == end2_) {
13939 current2_ = begin2_;
13940 ++current1_;
13941 }
13942 ComputeCurrentValue();
13943 }
13944 virtual ParamIteratorInterface<ParamType>* Clone() const {
13945 return new Iterator(*this);
13946 }
13947 virtual const ParamType* Current() const { return ¤t_value_; }
13948 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
13949
13950
13951 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
13952 << "The program attempted to compare iterators "
13953 << "from different generators." << std::endl;
13954 const Iterator* typed_other =
13955 CheckedDowncastToActualType<const Iterator>(&other);
13956
13957
13958
13959 return (AtEnd() && typed_other->AtEnd()) ||
13960 (
13961 current1_ == typed_other->current1_ &&
13962 current2_ == typed_other->current2_ &&
13963 current3_ == typed_other->current3_);
13964 }
13965
13966 private:
13967 Iterator(const Iterator& other)
13968 : base_(other.base_),
13969 begin1_(other.begin1_),
13970 end1_(other.end1_),
13971 current1_(other.current1_),
13972 begin2_(other.begin2_),
13973 end2_(other.end2_),
13974 current2_(other.current2_),
13975 begin3_(other.begin3_),
13976 end3_(other.end3_),
13977 current3_(other.current3_) {
13978 ComputeCurrentValue();
13979 }
13980
13981 void ComputeCurrentValue() {
13982 if (!AtEnd())
13983 current_value_ = ParamType(*current1_, *current2_, *current3_);
13984 }
13985 bool AtEnd() const {
13986
13987
13988 return
13989 current1_ == end1_ ||
13990 current2_ == end2_ ||
13991 current3_ == end3_;
13992 }
13993
13994
13995 void operator=(const Iterator& other);
13996
13997 const ParamGeneratorInterface<ParamType>* const base_;
13998
13999
14000 const typename ParamGenerator<T1>::iterator begin1_;
14001 const typename ParamGenerator<T1>::iterator end1_;
14002 typename ParamGenerator<T1>::iterator current1_;
14003 const typename ParamGenerator<T2>::iterator begin2_;
14004 const typename ParamGenerator<T2>::iterator end2_;
14005 typename ParamGenerator<T2>::iterator current2_;
14006 const typename ParamGenerator<T3>::iterator begin3_;
14007 const typename ParamGenerator<T3>::iterator end3_;
14008 typename ParamGenerator<T3>::iterator current3_;
14009 ParamType current_value_;
14010 };
14011
14012
14013 void operator=(const CartesianProductGenerator3& other);
14014
14015 const ParamGenerator<T1> g1_;
14016 const ParamGenerator<T2> g2_;
14017 const ParamGenerator<T3> g3_;
14018 };
14019
14020
14021 template <typename T1, typename T2, typename T3, typename T4>
14022 class CartesianProductGenerator4
14023 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
14024 public:
14025 typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
14026
14027 CartesianProductGenerator4(const ParamGenerator<T1>& g1,
14028 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14029 const ParamGenerator<T4>& g4)
14030 : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
14031 virtual ~CartesianProductGenerator4() {}
14032
14033 virtual ParamIteratorInterface<ParamType>* Begin() const {
14034 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14035 g3_.begin(), g4_, g4_.begin());
14036 }
14037 virtual ParamIteratorInterface<ParamType>* End() const {
14038 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14039 g4_, g4_.end());
14040 }
14041
14042 private:
14043 class Iterator : public ParamIteratorInterface<ParamType> {
14044 public:
14045 Iterator(const ParamGeneratorInterface<ParamType>* base,
14046 const ParamGenerator<T1>& g1,
14047 const typename ParamGenerator<T1>::iterator& current1,
14048 const ParamGenerator<T2>& g2,
14049 const typename ParamGenerator<T2>::iterator& current2,
14050 const ParamGenerator<T3>& g3,
14051 const typename ParamGenerator<T3>::iterator& current3,
14052 const ParamGenerator<T4>& g4,
14053 const typename ParamGenerator<T4>::iterator& current4)
14054 : base_(base),
14055 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14056 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14057 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14058 begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {
14059 ComputeCurrentValue();
14060 }
14061 virtual ~Iterator() {}
14062
14063 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14064 return base_;
14065 }
14066
14067
14068 virtual void Advance() {
14069 assert(!AtEnd());
14070 ++current4_;
14071 if (current4_ == end4_) {
14072 current4_ = begin4_;
14073 ++current3_;
14074 }
14075 if (current3_ == end3_) {
14076 current3_ = begin3_;
14077 ++current2_;
14078 }
14079 if (current2_ == end2_) {
14080 current2_ = begin2_;
14081 ++current1_;
14082 }
14083 ComputeCurrentValue();
14084 }
14085 virtual ParamIteratorInterface<ParamType>* Clone() const {
14086 return new Iterator(*this);
14087 }
14088 virtual const ParamType* Current() const { return ¤t_value_; }
14089 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14090
14091
14092 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14093 << "The program attempted to compare iterators "
14094 << "from different generators." << std::endl;
14095 const Iterator* typed_other =
14096 CheckedDowncastToActualType<const Iterator>(&other);
14097
14098
14099
14100 return (AtEnd() && typed_other->AtEnd()) ||
14101 (
14102 current1_ == typed_other->current1_ &&
14103 current2_ == typed_other->current2_ &&
14104 current3_ == typed_other->current3_ &&
14105 current4_ == typed_other->current4_);
14106 }
14107
14108 private:
14109 Iterator(const Iterator& other)
14110 : base_(other.base_),
14111 begin1_(other.begin1_),
14112 end1_(other.end1_),
14113 current1_(other.current1_),
14114 begin2_(other.begin2_),
14115 end2_(other.end2_),
14116 current2_(other.current2_),
14117 begin3_(other.begin3_),
14118 end3_(other.end3_),
14119 current3_(other.current3_),
14120 begin4_(other.begin4_),
14121 end4_(other.end4_),
14122 current4_(other.current4_) {
14123 ComputeCurrentValue();
14124 }
14125
14126 void ComputeCurrentValue() {
14127 if (!AtEnd())
14128 current_value_ = ParamType(*current1_, *current2_, *current3_,
14129 *current4_);
14130 }
14131 bool AtEnd() const {
14132
14133
14134 return
14135 current1_ == end1_ ||
14136 current2_ == end2_ ||
14137 current3_ == end3_ ||
14138 current4_ == end4_;
14139 }
14140
14141
14142 void operator=(const Iterator& other);
14143
14144 const ParamGeneratorInterface<ParamType>* const base_;
14145
14146
14147 const typename ParamGenerator<T1>::iterator begin1_;
14148 const typename ParamGenerator<T1>::iterator end1_;
14149 typename ParamGenerator<T1>::iterator current1_;
14150 const typename ParamGenerator<T2>::iterator begin2_;
14151 const typename ParamGenerator<T2>::iterator end2_;
14152 typename ParamGenerator<T2>::iterator current2_;
14153 const typename ParamGenerator<T3>::iterator begin3_;
14154 const typename ParamGenerator<T3>::iterator end3_;
14155 typename ParamGenerator<T3>::iterator current3_;
14156 const typename ParamGenerator<T4>::iterator begin4_;
14157 const typename ParamGenerator<T4>::iterator end4_;
14158 typename ParamGenerator<T4>::iterator current4_;
14159 ParamType current_value_;
14160 };
14161
14162
14163 void operator=(const CartesianProductGenerator4& other);
14164
14165 const ParamGenerator<T1> g1_;
14166 const ParamGenerator<T2> g2_;
14167 const ParamGenerator<T3> g3_;
14168 const ParamGenerator<T4> g4_;
14169 };
14170
14171
14172 template <typename T1, typename T2, typename T3, typename T4, typename T5>
14173 class CartesianProductGenerator5
14174 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
14175 public:
14176 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
14177
14178 CartesianProductGenerator5(const ParamGenerator<T1>& g1,
14179 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14180 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
14181 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
14182 virtual ~CartesianProductGenerator5() {}
14183
14184 virtual ParamIteratorInterface<ParamType>* Begin() const {
14185 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14186 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
14187 }
14188 virtual ParamIteratorInterface<ParamType>* End() const {
14189 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14190 g4_, g4_.end(), g5_, g5_.end());
14191 }
14192
14193 private:
14194 class Iterator : public ParamIteratorInterface<ParamType> {
14195 public:
14196 Iterator(const ParamGeneratorInterface<ParamType>* base,
14197 const ParamGenerator<T1>& g1,
14198 const typename ParamGenerator<T1>::iterator& current1,
14199 const ParamGenerator<T2>& g2,
14200 const typename ParamGenerator<T2>::iterator& current2,
14201 const ParamGenerator<T3>& g3,
14202 const typename ParamGenerator<T3>::iterator& current3,
14203 const ParamGenerator<T4>& g4,
14204 const typename ParamGenerator<T4>::iterator& current4,
14205 const ParamGenerator<T5>& g5,
14206 const typename ParamGenerator<T5>::iterator& current5)
14207 : base_(base),
14208 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14209 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14210 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14211 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14212 begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {
14213 ComputeCurrentValue();
14214 }
14215 virtual ~Iterator() {}
14216
14217 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14218 return base_;
14219 }
14220
14221
14222 virtual void Advance() {
14223 assert(!AtEnd());
14224 ++current5_;
14225 if (current5_ == end5_) {
14226 current5_ = begin5_;
14227 ++current4_;
14228 }
14229 if (current4_ == end4_) {
14230 current4_ = begin4_;
14231 ++current3_;
14232 }
14233 if (current3_ == end3_) {
14234 current3_ = begin3_;
14235 ++current2_;
14236 }
14237 if (current2_ == end2_) {
14238 current2_ = begin2_;
14239 ++current1_;
14240 }
14241 ComputeCurrentValue();
14242 }
14243 virtual ParamIteratorInterface<ParamType>* Clone() const {
14244 return new Iterator(*this);
14245 }
14246 virtual const ParamType* Current() const { return ¤t_value_; }
14247 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14248
14249
14250 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14251 << "The program attempted to compare iterators "
14252 << "from different generators." << std::endl;
14253 const Iterator* typed_other =
14254 CheckedDowncastToActualType<const Iterator>(&other);
14255
14256
14257
14258 return (AtEnd() && typed_other->AtEnd()) ||
14259 (
14260 current1_ == typed_other->current1_ &&
14261 current2_ == typed_other->current2_ &&
14262 current3_ == typed_other->current3_ &&
14263 current4_ == typed_other->current4_ &&
14264 current5_ == typed_other->current5_);
14265 }
14266
14267 private:
14268 Iterator(const Iterator& other)
14269 : base_(other.base_),
14270 begin1_(other.begin1_),
14271 end1_(other.end1_),
14272 current1_(other.current1_),
14273 begin2_(other.begin2_),
14274 end2_(other.end2_),
14275 current2_(other.current2_),
14276 begin3_(other.begin3_),
14277 end3_(other.end3_),
14278 current3_(other.current3_),
14279 begin4_(other.begin4_),
14280 end4_(other.end4_),
14281 current4_(other.current4_),
14282 begin5_(other.begin5_),
14283 end5_(other.end5_),
14284 current5_(other.current5_) {
14285 ComputeCurrentValue();
14286 }
14287
14288 void ComputeCurrentValue() {
14289 if (!AtEnd())
14290 current_value_ = ParamType(*current1_, *current2_, *current3_,
14291 *current4_, *current5_);
14292 }
14293 bool AtEnd() const {
14294
14295
14296 return
14297 current1_ == end1_ ||
14298 current2_ == end2_ ||
14299 current3_ == end3_ ||
14300 current4_ == end4_ ||
14301 current5_ == end5_;
14302 }
14303
14304
14305 void operator=(const Iterator& other);
14306
14307 const ParamGeneratorInterface<ParamType>* const base_;
14308
14309
14310 const typename ParamGenerator<T1>::iterator begin1_;
14311 const typename ParamGenerator<T1>::iterator end1_;
14312 typename ParamGenerator<T1>::iterator current1_;
14313 const typename ParamGenerator<T2>::iterator begin2_;
14314 const typename ParamGenerator<T2>::iterator end2_;
14315 typename ParamGenerator<T2>::iterator current2_;
14316 const typename ParamGenerator<T3>::iterator begin3_;
14317 const typename ParamGenerator<T3>::iterator end3_;
14318 typename ParamGenerator<T3>::iterator current3_;
14319 const typename ParamGenerator<T4>::iterator begin4_;
14320 const typename ParamGenerator<T4>::iterator end4_;
14321 typename ParamGenerator<T4>::iterator current4_;
14322 const typename ParamGenerator<T5>::iterator begin5_;
14323 const typename ParamGenerator<T5>::iterator end5_;
14324 typename ParamGenerator<T5>::iterator current5_;
14325 ParamType current_value_;
14326 };
14327
14328
14329 void operator=(const CartesianProductGenerator5& other);
14330
14331 const ParamGenerator<T1> g1_;
14332 const ParamGenerator<T2> g2_;
14333 const ParamGenerator<T3> g3_;
14334 const ParamGenerator<T4> g4_;
14335 const ParamGenerator<T5> g5_;
14336 };
14337
14338
14339 template <typename T1, typename T2, typename T3, typename T4, typename T5,
14340 typename T6>
14341 class CartesianProductGenerator6
14342 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
14343 T6> > {
14344 public:
14345 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
14346
14347 CartesianProductGenerator6(const ParamGenerator<T1>& g1,
14348 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14349 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14350 const ParamGenerator<T6>& g6)
14351 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
14352 virtual ~CartesianProductGenerator6() {}
14353
14354 virtual ParamIteratorInterface<ParamType>* Begin() const {
14355 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14356 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
14357 }
14358 virtual ParamIteratorInterface<ParamType>* End() const {
14359 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14360 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
14361 }
14362
14363 private:
14364 class Iterator : public ParamIteratorInterface<ParamType> {
14365 public:
14366 Iterator(const ParamGeneratorInterface<ParamType>* base,
14367 const ParamGenerator<T1>& g1,
14368 const typename ParamGenerator<T1>::iterator& current1,
14369 const ParamGenerator<T2>& g2,
14370 const typename ParamGenerator<T2>::iterator& current2,
14371 const ParamGenerator<T3>& g3,
14372 const typename ParamGenerator<T3>::iterator& current3,
14373 const ParamGenerator<T4>& g4,
14374 const typename ParamGenerator<T4>::iterator& current4,
14375 const ParamGenerator<T5>& g5,
14376 const typename ParamGenerator<T5>::iterator& current5,
14377 const ParamGenerator<T6>& g6,
14378 const typename ParamGenerator<T6>::iterator& current6)
14379 : base_(base),
14380 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14381 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14382 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14383 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14384 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14385 begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {
14386 ComputeCurrentValue();
14387 }
14388 virtual ~Iterator() {}
14389
14390 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14391 return base_;
14392 }
14393
14394
14395 virtual void Advance() {
14396 assert(!AtEnd());
14397 ++current6_;
14398 if (current6_ == end6_) {
14399 current6_ = begin6_;
14400 ++current5_;
14401 }
14402 if (current5_ == end5_) {
14403 current5_ = begin5_;
14404 ++current4_;
14405 }
14406 if (current4_ == end4_) {
14407 current4_ = begin4_;
14408 ++current3_;
14409 }
14410 if (current3_ == end3_) {
14411 current3_ = begin3_;
14412 ++current2_;
14413 }
14414 if (current2_ == end2_) {
14415 current2_ = begin2_;
14416 ++current1_;
14417 }
14418 ComputeCurrentValue();
14419 }
14420 virtual ParamIteratorInterface<ParamType>* Clone() const {
14421 return new Iterator(*this);
14422 }
14423 virtual const ParamType* Current() const { return ¤t_value_; }
14424 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14425
14426
14427 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14428 << "The program attempted to compare iterators "
14429 << "from different generators." << std::endl;
14430 const Iterator* typed_other =
14431 CheckedDowncastToActualType<const Iterator>(&other);
14432
14433
14434
14435 return (AtEnd() && typed_other->AtEnd()) ||
14436 (
14437 current1_ == typed_other->current1_ &&
14438 current2_ == typed_other->current2_ &&
14439 current3_ == typed_other->current3_ &&
14440 current4_ == typed_other->current4_ &&
14441 current5_ == typed_other->current5_ &&
14442 current6_ == typed_other->current6_);
14443 }
14444
14445 private:
14446 Iterator(const Iterator& other)
14447 : base_(other.base_),
14448 begin1_(other.begin1_),
14449 end1_(other.end1_),
14450 current1_(other.current1_),
14451 begin2_(other.begin2_),
14452 end2_(other.end2_),
14453 current2_(other.current2_),
14454 begin3_(other.begin3_),
14455 end3_(other.end3_),
14456 current3_(other.current3_),
14457 begin4_(other.begin4_),
14458 end4_(other.end4_),
14459 current4_(other.current4_),
14460 begin5_(other.begin5_),
14461 end5_(other.end5_),
14462 current5_(other.current5_),
14463 begin6_(other.begin6_),
14464 end6_(other.end6_),
14465 current6_(other.current6_) {
14466 ComputeCurrentValue();
14467 }
14468
14469 void ComputeCurrentValue() {
14470 if (!AtEnd())
14471 current_value_ = ParamType(*current1_, *current2_, *current3_,
14472 *current4_, *current5_, *current6_);
14473 }
14474 bool AtEnd() const {
14475
14476
14477 return
14478 current1_ == end1_ ||
14479 current2_ == end2_ ||
14480 current3_ == end3_ ||
14481 current4_ == end4_ ||
14482 current5_ == end5_ ||
14483 current6_ == end6_;
14484 }
14485
14486
14487 void operator=(const Iterator& other);
14488
14489 const ParamGeneratorInterface<ParamType>* const base_;
14490
14491
14492 const typename ParamGenerator<T1>::iterator begin1_;
14493 const typename ParamGenerator<T1>::iterator end1_;
14494 typename ParamGenerator<T1>::iterator current1_;
14495 const typename ParamGenerator<T2>::iterator begin2_;
14496 const typename ParamGenerator<T2>::iterator end2_;
14497 typename ParamGenerator<T2>::iterator current2_;
14498 const typename ParamGenerator<T3>::iterator begin3_;
14499 const typename ParamGenerator<T3>::iterator end3_;
14500 typename ParamGenerator<T3>::iterator current3_;
14501 const typename ParamGenerator<T4>::iterator begin4_;
14502 const typename ParamGenerator<T4>::iterator end4_;
14503 typename ParamGenerator<T4>::iterator current4_;
14504 const typename ParamGenerator<T5>::iterator begin5_;
14505 const typename ParamGenerator<T5>::iterator end5_;
14506 typename ParamGenerator<T5>::iterator current5_;
14507 const typename ParamGenerator<T6>::iterator begin6_;
14508 const typename ParamGenerator<T6>::iterator end6_;
14509 typename ParamGenerator<T6>::iterator current6_;
14510 ParamType current_value_;
14511 };
14512
14513
14514 void operator=(const CartesianProductGenerator6& other);
14515
14516 const ParamGenerator<T1> g1_;
14517 const ParamGenerator<T2> g2_;
14518 const ParamGenerator<T3> g3_;
14519 const ParamGenerator<T4> g4_;
14520 const ParamGenerator<T5> g5_;
14521 const ParamGenerator<T6> g6_;
14522 };
14523
14524
14525 template <typename T1, typename T2, typename T3, typename T4, typename T5,
14526 typename T6, typename T7>
14527 class CartesianProductGenerator7
14528 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14529 T7> > {
14530 public:
14531 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
14532
14533 CartesianProductGenerator7(const ParamGenerator<T1>& g1,
14534 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14535 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14536 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
14537 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
14538 virtual ~CartesianProductGenerator7() {}
14539
14540 virtual ParamIteratorInterface<ParamType>* Begin() const {
14541 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14542 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14543 g7_.begin());
14544 }
14545 virtual ParamIteratorInterface<ParamType>* End() const {
14546 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14547 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
14548 }
14549
14550 private:
14551 class Iterator : public ParamIteratorInterface<ParamType> {
14552 public:
14553 Iterator(const ParamGeneratorInterface<ParamType>* base,
14554 const ParamGenerator<T1>& g1,
14555 const typename ParamGenerator<T1>::iterator& current1,
14556 const ParamGenerator<T2>& g2,
14557 const typename ParamGenerator<T2>::iterator& current2,
14558 const ParamGenerator<T3>& g3,
14559 const typename ParamGenerator<T3>::iterator& current3,
14560 const ParamGenerator<T4>& g4,
14561 const typename ParamGenerator<T4>::iterator& current4,
14562 const ParamGenerator<T5>& g5,
14563 const typename ParamGenerator<T5>::iterator& current5,
14564 const ParamGenerator<T6>& g6,
14565 const typename ParamGenerator<T6>::iterator& current6,
14566 const ParamGenerator<T7>& g7,
14567 const typename ParamGenerator<T7>::iterator& current7)
14568 : base_(base),
14569 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14570 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14571 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14572 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14573 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14574 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
14575 begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {
14576 ComputeCurrentValue();
14577 }
14578 virtual ~Iterator() {}
14579
14580 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14581 return base_;
14582 }
14583
14584
14585 virtual void Advance() {
14586 assert(!AtEnd());
14587 ++current7_;
14588 if (current7_ == end7_) {
14589 current7_ = begin7_;
14590 ++current6_;
14591 }
14592 if (current6_ == end6_) {
14593 current6_ = begin6_;
14594 ++current5_;
14595 }
14596 if (current5_ == end5_) {
14597 current5_ = begin5_;
14598 ++current4_;
14599 }
14600 if (current4_ == end4_) {
14601 current4_ = begin4_;
14602 ++current3_;
14603 }
14604 if (current3_ == end3_) {
14605 current3_ = begin3_;
14606 ++current2_;
14607 }
14608 if (current2_ == end2_) {
14609 current2_ = begin2_;
14610 ++current1_;
14611 }
14612 ComputeCurrentValue();
14613 }
14614 virtual ParamIteratorInterface<ParamType>* Clone() const {
14615 return new Iterator(*this);
14616 }
14617 virtual const ParamType* Current() const { return ¤t_value_; }
14618 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14619
14620
14621 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14622 << "The program attempted to compare iterators "
14623 << "from different generators." << std::endl;
14624 const Iterator* typed_other =
14625 CheckedDowncastToActualType<const Iterator>(&other);
14626
14627
14628
14629 return (AtEnd() && typed_other->AtEnd()) ||
14630 (
14631 current1_ == typed_other->current1_ &&
14632 current2_ == typed_other->current2_ &&
14633 current3_ == typed_other->current3_ &&
14634 current4_ == typed_other->current4_ &&
14635 current5_ == typed_other->current5_ &&
14636 current6_ == typed_other->current6_ &&
14637 current7_ == typed_other->current7_);
14638 }
14639
14640 private:
14641 Iterator(const Iterator& other)
14642 : base_(other.base_),
14643 begin1_(other.begin1_),
14644 end1_(other.end1_),
14645 current1_(other.current1_),
14646 begin2_(other.begin2_),
14647 end2_(other.end2_),
14648 current2_(other.current2_),
14649 begin3_(other.begin3_),
14650 end3_(other.end3_),
14651 current3_(other.current3_),
14652 begin4_(other.begin4_),
14653 end4_(other.end4_),
14654 current4_(other.current4_),
14655 begin5_(other.begin5_),
14656 end5_(other.end5_),
14657 current5_(other.current5_),
14658 begin6_(other.begin6_),
14659 end6_(other.end6_),
14660 current6_(other.current6_),
14661 begin7_(other.begin7_),
14662 end7_(other.end7_),
14663 current7_(other.current7_) {
14664 ComputeCurrentValue();
14665 }
14666
14667 void ComputeCurrentValue() {
14668 if (!AtEnd())
14669 current_value_ = ParamType(*current1_, *current2_, *current3_,
14670 *current4_, *current5_, *current6_, *current7_);
14671 }
14672 bool AtEnd() const {
14673
14674
14675 return
14676 current1_ == end1_ ||
14677 current2_ == end2_ ||
14678 current3_ == end3_ ||
14679 current4_ == end4_ ||
14680 current5_ == end5_ ||
14681 current6_ == end6_ ||
14682 current7_ == end7_;
14683 }
14684
14685
14686 void operator=(const Iterator& other);
14687
14688 const ParamGeneratorInterface<ParamType>* const base_;
14689
14690
14691 const typename ParamGenerator<T1>::iterator begin1_;
14692 const typename ParamGenerator<T1>::iterator end1_;
14693 typename ParamGenerator<T1>::iterator current1_;
14694 const typename ParamGenerator<T2>::iterator begin2_;
14695 const typename ParamGenerator<T2>::iterator end2_;
14696 typename ParamGenerator<T2>::iterator current2_;
14697 const typename ParamGenerator<T3>::iterator begin3_;
14698 const typename ParamGenerator<T3>::iterator end3_;
14699 typename ParamGenerator<T3>::iterator current3_;
14700 const typename ParamGenerator<T4>::iterator begin4_;
14701 const typename ParamGenerator<T4>::iterator end4_;
14702 typename ParamGenerator<T4>::iterator current4_;
14703 const typename ParamGenerator<T5>::iterator begin5_;
14704 const typename ParamGenerator<T5>::iterator end5_;
14705 typename ParamGenerator<T5>::iterator current5_;
14706 const typename ParamGenerator<T6>::iterator begin6_;
14707 const typename ParamGenerator<T6>::iterator end6_;
14708 typename ParamGenerator<T6>::iterator current6_;
14709 const typename ParamGenerator<T7>::iterator begin7_;
14710 const typename ParamGenerator<T7>::iterator end7_;
14711 typename ParamGenerator<T7>::iterator current7_;
14712 ParamType current_value_;
14713 };
14714
14715
14716 void operator=(const CartesianProductGenerator7& other);
14717
14718 const ParamGenerator<T1> g1_;
14719 const ParamGenerator<T2> g2_;
14720 const ParamGenerator<T3> g3_;
14721 const ParamGenerator<T4> g4_;
14722 const ParamGenerator<T5> g5_;
14723 const ParamGenerator<T6> g6_;
14724 const ParamGenerator<T7> g7_;
14725 };
14726
14727
14728 template <typename T1, typename T2, typename T3, typename T4, typename T5,
14729 typename T6, typename T7, typename T8>
14730 class CartesianProductGenerator8
14731 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14732 T7, T8> > {
14733 public:
14734 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
14735
14736 CartesianProductGenerator8(const ParamGenerator<T1>& g1,
14737 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14738 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14739 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
14740 const ParamGenerator<T8>& g8)
14741 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
14742 g8_(g8) {}
14743 virtual ~CartesianProductGenerator8() {}
14744
14745 virtual ParamIteratorInterface<ParamType>* Begin() const {
14746 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14747 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14748 g7_.begin(), g8_, g8_.begin());
14749 }
14750 virtual ParamIteratorInterface<ParamType>* End() const {
14751 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14752 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
14753 g8_.end());
14754 }
14755
14756 private:
14757 class Iterator : public ParamIteratorInterface<ParamType> {
14758 public:
14759 Iterator(const ParamGeneratorInterface<ParamType>* base,
14760 const ParamGenerator<T1>& g1,
14761 const typename ParamGenerator<T1>::iterator& current1,
14762 const ParamGenerator<T2>& g2,
14763 const typename ParamGenerator<T2>::iterator& current2,
14764 const ParamGenerator<T3>& g3,
14765 const typename ParamGenerator<T3>::iterator& current3,
14766 const ParamGenerator<T4>& g4,
14767 const typename ParamGenerator<T4>::iterator& current4,
14768 const ParamGenerator<T5>& g5,
14769 const typename ParamGenerator<T5>::iterator& current5,
14770 const ParamGenerator<T6>& g6,
14771 const typename ParamGenerator<T6>::iterator& current6,
14772 const ParamGenerator<T7>& g7,
14773 const typename ParamGenerator<T7>::iterator& current7,
14774 const ParamGenerator<T8>& g8,
14775 const typename ParamGenerator<T8>::iterator& current8)
14776 : base_(base),
14777 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14778 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14779 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14780 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14781 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14782 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
14783 begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
14784 begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {
14785 ComputeCurrentValue();
14786 }
14787 virtual ~Iterator() {}
14788
14789 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14790 return base_;
14791 }
14792
14793
14794 virtual void Advance() {
14795 assert(!AtEnd());
14796 ++current8_;
14797 if (current8_ == end8_) {
14798 current8_ = begin8_;
14799 ++current7_;
14800 }
14801 if (current7_ == end7_) {
14802 current7_ = begin7_;
14803 ++current6_;
14804 }
14805 if (current6_ == end6_) {
14806 current6_ = begin6_;
14807 ++current5_;
14808 }
14809 if (current5_ == end5_) {
14810 current5_ = begin5_;
14811 ++current4_;
14812 }
14813 if (current4_ == end4_) {
14814 current4_ = begin4_;
14815 ++current3_;
14816 }
14817 if (current3_ == end3_) {
14818 current3_ = begin3_;
14819 ++current2_;
14820 }
14821 if (current2_ == end2_) {
14822 current2_ = begin2_;
14823 ++current1_;
14824 }
14825 ComputeCurrentValue();
14826 }
14827 virtual ParamIteratorInterface<ParamType>* Clone() const {
14828 return new Iterator(*this);
14829 }
14830 virtual const ParamType* Current() const { return ¤t_value_; }
14831 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14832
14833
14834 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14835 << "The program attempted to compare iterators "
14836 << "from different generators." << std::endl;
14837 const Iterator* typed_other =
14838 CheckedDowncastToActualType<const Iterator>(&other);
14839
14840
14841
14842 return (AtEnd() && typed_other->AtEnd()) ||
14843 (
14844 current1_ == typed_other->current1_ &&
14845 current2_ == typed_other->current2_ &&
14846 current3_ == typed_other->current3_ &&
14847 current4_ == typed_other->current4_ &&
14848 current5_ == typed_other->current5_ &&
14849 current6_ == typed_other->current6_ &&
14850 current7_ == typed_other->current7_ &&
14851 current8_ == typed_other->current8_);
14852 }
14853
14854 private:
14855 Iterator(const Iterator& other)
14856 : base_(other.base_),
14857 begin1_(other.begin1_),
14858 end1_(other.end1_),
14859 current1_(other.current1_),
14860 begin2_(other.begin2_),
14861 end2_(other.end2_),
14862 current2_(other.current2_),
14863 begin3_(other.begin3_),
14864 end3_(other.end3_),
14865 current3_(other.current3_),
14866 begin4_(other.begin4_),
14867 end4_(other.end4_),
14868 current4_(other.current4_),
14869 begin5_(other.begin5_),
14870 end5_(other.end5_),
14871 current5_(other.current5_),
14872 begin6_(other.begin6_),
14873 end6_(other.end6_),
14874 current6_(other.current6_),
14875 begin7_(other.begin7_),
14876 end7_(other.end7_),
14877 current7_(other.current7_),
14878 begin8_(other.begin8_),
14879 end8_(other.end8_),
14880 current8_(other.current8_) {
14881 ComputeCurrentValue();
14882 }
14883
14884 void ComputeCurrentValue() {
14885 if (!AtEnd())
14886 current_value_ = ParamType(*current1_, *current2_, *current3_,
14887 *current4_, *current5_, *current6_, *current7_, *current8_);
14888 }
14889 bool AtEnd() const {
14890
14891
14892 return
14893 current1_ == end1_ ||
14894 current2_ == end2_ ||
14895 current3_ == end3_ ||
14896 current4_ == end4_ ||
14897 current5_ == end5_ ||
14898 current6_ == end6_ ||
14899 current7_ == end7_ ||
14900 current8_ == end8_;
14901 }
14902
14903
14904 void operator=(const Iterator& other);
14905
14906 const ParamGeneratorInterface<ParamType>* const base_;
14907
14908
14909 const typename ParamGenerator<T1>::iterator begin1_;
14910 const typename ParamGenerator<T1>::iterator end1_;
14911 typename ParamGenerator<T1>::iterator current1_;
14912 const typename ParamGenerator<T2>::iterator begin2_;
14913 const typename ParamGenerator<T2>::iterator end2_;
14914 typename ParamGenerator<T2>::iterator current2_;
14915 const typename ParamGenerator<T3>::iterator begin3_;
14916 const typename ParamGenerator<T3>::iterator end3_;
14917 typename ParamGenerator<T3>::iterator current3_;
14918 const typename ParamGenerator<T4>::iterator begin4_;
14919 const typename ParamGenerator<T4>::iterator end4_;
14920 typename ParamGenerator<T4>::iterator current4_;
14921 const typename ParamGenerator<T5>::iterator begin5_;
14922 const typename ParamGenerator<T5>::iterator end5_;
14923 typename ParamGenerator<T5>::iterator current5_;
14924 const typename ParamGenerator<T6>::iterator begin6_;
14925 const typename ParamGenerator<T6>::iterator end6_;
14926 typename ParamGenerator<T6>::iterator current6_;
14927 const typename ParamGenerator<T7>::iterator begin7_;
14928 const typename ParamGenerator<T7>::iterator end7_;
14929 typename ParamGenerator<T7>::iterator current7_;
14930 const typename ParamGenerator<T8>::iterator begin8_;
14931 const typename ParamGenerator<T8>::iterator end8_;
14932 typename ParamGenerator<T8>::iterator current8_;
14933 ParamType current_value_;
14934 };
14935
14936
14937 void operator=(const CartesianProductGenerator8& other);
14938
14939 const ParamGenerator<T1> g1_;
14940 const ParamGenerator<T2> g2_;
14941 const ParamGenerator<T3> g3_;
14942 const ParamGenerator<T4> g4_;
14943 const ParamGenerator<T5> g5_;
14944 const ParamGenerator<T6> g6_;
14945 const ParamGenerator<T7> g7_;
14946 const ParamGenerator<T8> g8_;
14947 };
14948
14949
14950 template <typename T1, typename T2, typename T3, typename T4, typename T5,
14951 typename T6, typename T7, typename T8, typename T9>
14952 class CartesianProductGenerator9
14953 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14954 T7, T8, T9> > {
14955 public:
14956 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
14957
14958 CartesianProductGenerator9(const ParamGenerator<T1>& g1,
14959 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14960 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14961 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
14962 const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
14963 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
14964 g9_(g9) {}
14965 virtual ~CartesianProductGenerator9() {}
14966
14967 virtual ParamIteratorInterface<ParamType>* Begin() const {
14968 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14969 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14970 g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
14971 }
14972 virtual ParamIteratorInterface<ParamType>* End() const {
14973 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14974 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
14975 g8_.end(), g9_, g9_.end());
14976 }
14977
14978 private:
14979 class Iterator : public ParamIteratorInterface<ParamType> {
14980 public:
14981 Iterator(const ParamGeneratorInterface<ParamType>* base,
14982 const ParamGenerator<T1>& g1,
14983 const typename ParamGenerator<T1>::iterator& current1,
14984 const ParamGenerator<T2>& g2,
14985 const typename ParamGenerator<T2>::iterator& current2,
14986 const ParamGenerator<T3>& g3,
14987 const typename ParamGenerator<T3>::iterator& current3,
14988 const ParamGenerator<T4>& g4,
14989 const typename ParamGenerator<T4>::iterator& current4,
14990 const ParamGenerator<T5>& g5,
14991 const typename ParamGenerator<T5>::iterator& current5,
14992 const ParamGenerator<T6>& g6,
14993 const typename ParamGenerator<T6>::iterator& current6,
14994 const ParamGenerator<T7>& g7,
14995 const typename ParamGenerator<T7>::iterator& current7,
14996 const ParamGenerator<T8>& g8,
14997 const typename ParamGenerator<T8>::iterator& current8,
14998 const ParamGenerator<T9>& g9,
14999 const typename ParamGenerator<T9>::iterator& current9)
15000 : base_(base),
15001 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
15002 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
15003 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
15004 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
15005 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
15006 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
15007 begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
15008 begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
15009 begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {
15010 ComputeCurrentValue();
15011 }
15012 virtual ~Iterator() {}
15013
15014 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
15015 return base_;
15016 }
15017
15018
15019 virtual void Advance() {
15020 assert(!AtEnd());
15021 ++current9_;
15022 if (current9_ == end9_) {
15023 current9_ = begin9_;
15024 ++current8_;
15025 }
15026 if (current8_ == end8_) {
15027 current8_ = begin8_;
15028 ++current7_;
15029 }
15030 if (current7_ == end7_) {
15031 current7_ = begin7_;
15032 ++current6_;
15033 }
15034 if (current6_ == end6_) {
15035 current6_ = begin6_;
15036 ++current5_;
15037 }
15038 if (current5_ == end5_) {
15039 current5_ = begin5_;
15040 ++current4_;
15041 }
15042 if (current4_ == end4_) {
15043 current4_ = begin4_;
15044 ++current3_;
15045 }
15046 if (current3_ == end3_) {
15047 current3_ = begin3_;
15048 ++current2_;
15049 }
15050 if (current2_ == end2_) {
15051 current2_ = begin2_;
15052 ++current1_;
15053 }
15054 ComputeCurrentValue();
15055 }
15056 virtual ParamIteratorInterface<ParamType>* Clone() const {
15057 return new Iterator(*this);
15058 }
15059 virtual const ParamType* Current() const { return ¤t_value_; }
15060 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
15061
15062
15063 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
15064 << "The program attempted to compare iterators "
15065 << "from different generators." << std::endl;
15066 const Iterator* typed_other =
15067 CheckedDowncastToActualType<const Iterator>(&other);
15068
15069
15070
15071 return (AtEnd() && typed_other->AtEnd()) ||
15072 (
15073 current1_ == typed_other->current1_ &&
15074 current2_ == typed_other->current2_ &&
15075 current3_ == typed_other->current3_ &&
15076 current4_ == typed_other->current4_ &&
15077 current5_ == typed_other->current5_ &&
15078 current6_ == typed_other->current6_ &&
15079 current7_ == typed_other->current7_ &&
15080 current8_ == typed_other->current8_ &&
15081 current9_ == typed_other->current9_);
15082 }
15083
15084 private:
15085 Iterator(const Iterator& other)
15086 : base_(other.base_),
15087 begin1_(other.begin1_),
15088 end1_(other.end1_),
15089 current1_(other.current1_),
15090 begin2_(other.begin2_),
15091 end2_(other.end2_),
15092 current2_(other.current2_),
15093 begin3_(other.begin3_),
15094 end3_(other.end3_),
15095 current3_(other.current3_),
15096 begin4_(other.begin4_),
15097 end4_(other.end4_),
15098 current4_(other.current4_),
15099 begin5_(other.begin5_),
15100 end5_(other.end5_),
15101 current5_(other.current5_),
15102 begin6_(other.begin6_),
15103 end6_(other.end6_),
15104 current6_(other.current6_),
15105 begin7_(other.begin7_),
15106 end7_(other.end7_),
15107 current7_(other.current7_),
15108 begin8_(other.begin8_),
15109 end8_(other.end8_),
15110 current8_(other.current8_),
15111 begin9_(other.begin9_),
15112 end9_(other.end9_),
15113 current9_(other.current9_) {
15114 ComputeCurrentValue();
15115 }
15116
15117 void ComputeCurrentValue() {
15118 if (!AtEnd())
15119 current_value_ = ParamType(*current1_, *current2_, *current3_,
15120 *current4_, *current5_, *current6_, *current7_, *current8_,
15121 *current9_);
15122 }
15123 bool AtEnd() const {
15124
15125
15126 return
15127 current1_ == end1_ ||
15128 current2_ == end2_ ||
15129 current3_ == end3_ ||
15130 current4_ == end4_ ||
15131 current5_ == end5_ ||
15132 current6_ == end6_ ||
15133 current7_ == end7_ ||
15134 current8_ == end8_ ||
15135 current9_ == end9_;
15136 }
15137
15138
15139 void operator=(const Iterator& other);
15140
15141 const ParamGeneratorInterface<ParamType>* const base_;
15142
15143
15144 const typename ParamGenerator<T1>::iterator begin1_;
15145 const typename ParamGenerator<T1>::iterator end1_;
15146 typename ParamGenerator<T1>::iterator current1_;
15147 const typename ParamGenerator<T2>::iterator begin2_;
15148 const typename ParamGenerator<T2>::iterator end2_;
15149 typename ParamGenerator<T2>::iterator current2_;
15150 const typename ParamGenerator<T3>::iterator begin3_;
15151 const typename ParamGenerator<T3>::iterator end3_;
15152 typename ParamGenerator<T3>::iterator current3_;
15153 const typename ParamGenerator<T4>::iterator begin4_;
15154 const typename ParamGenerator<T4>::iterator end4_;
15155 typename ParamGenerator<T4>::iterator current4_;
15156 const typename ParamGenerator<T5>::iterator begin5_;
15157 const typename ParamGenerator<T5>::iterator end5_;
15158 typename ParamGenerator<T5>::iterator current5_;
15159 const typename ParamGenerator<T6>::iterator begin6_;
15160 const typename ParamGenerator<T6>::iterator end6_;
15161 typename ParamGenerator<T6>::iterator current6_;
15162 const typename ParamGenerator<T7>::iterator begin7_;
15163 const typename ParamGenerator<T7>::iterator end7_;
15164 typename ParamGenerator<T7>::iterator current7_;
15165 const typename ParamGenerator<T8>::iterator begin8_;
15166 const typename ParamGenerator<T8>::iterator end8_;
15167 typename ParamGenerator<T8>::iterator current8_;
15168 const typename ParamGenerator<T9>::iterator begin9_;
15169 const typename ParamGenerator<T9>::iterator end9_;
15170 typename ParamGenerator<T9>::iterator current9_;
15171 ParamType current_value_;
15172 };
15173
15174
15175 void operator=(const CartesianProductGenerator9& other);
15176
15177 const ParamGenerator<T1> g1_;
15178 const ParamGenerator<T2> g2_;
15179 const ParamGenerator<T3> g3_;
15180 const ParamGenerator<T4> g4_;
15181 const ParamGenerator<T5> g5_;
15182 const ParamGenerator<T6> g6_;
15183 const ParamGenerator<T7> g7_;
15184 const ParamGenerator<T8> g8_;
15185 const ParamGenerator<T9> g9_;
15186 };
15187
15188
15189 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15190 typename T6, typename T7, typename T8, typename T9, typename T10>
15191 class CartesianProductGenerator10
15192 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
15193 T7, T8, T9, T10> > {
15194 public:
15195 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
15196
15197 CartesianProductGenerator10(const ParamGenerator<T1>& g1,
15198 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
15199 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
15200 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
15201 const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
15202 const ParamGenerator<T10>& g10)
15203 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15204 g9_(g9), g10_(g10) {}
15205 virtual ~CartesianProductGenerator10() {}
15206
15207 virtual ParamIteratorInterface<ParamType>* Begin() const {
15208 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
15209 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
15210 g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
15211 }
15212 virtual ParamIteratorInterface<ParamType>* End() const {
15213 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
15214 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
15215 g8_.end(), g9_, g9_.end(), g10_, g10_.end());
15216 }
15217
15218 private:
15219 class Iterator : public ParamIteratorInterface<ParamType> {
15220 public:
15221 Iterator(const ParamGeneratorInterface<ParamType>* base,
15222 const ParamGenerator<T1>& g1,
15223 const typename ParamGenerator<T1>::iterator& current1,
15224 const ParamGenerator<T2>& g2,
15225 const typename ParamGenerator<T2>::iterator& current2,
15226 const ParamGenerator<T3>& g3,
15227 const typename ParamGenerator<T3>::iterator& current3,
15228 const ParamGenerator<T4>& g4,
15229 const typename ParamGenerator<T4>::iterator& current4,
15230 const ParamGenerator<T5>& g5,
15231 const typename ParamGenerator<T5>::iterator& current5,
15232 const ParamGenerator<T6>& g6,
15233 const typename ParamGenerator<T6>::iterator& current6,
15234 const ParamGenerator<T7>& g7,
15235 const typename ParamGenerator<T7>::iterator& current7,
15236 const ParamGenerator<T8>& g8,
15237 const typename ParamGenerator<T8>::iterator& current8,
15238 const ParamGenerator<T9>& g9,
15239 const typename ParamGenerator<T9>::iterator& current9,
15240 const ParamGenerator<T10>& g10,
15241 const typename ParamGenerator<T10>::iterator& current10)
15242 : base_(base),
15243 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
15244 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
15245 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
15246 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
15247 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
15248 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
15249 begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
15250 begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
15251 begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
15252 begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {
15253 ComputeCurrentValue();
15254 }
15255 virtual ~Iterator() {}
15256
15257 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
15258 return base_;
15259 }
15260
15261
15262 virtual void Advance() {
15263 assert(!AtEnd());
15264 ++current10_;
15265 if (current10_ == end10_) {
15266 current10_ = begin10_;
15267 ++current9_;
15268 }
15269 if (current9_ == end9_) {
15270 current9_ = begin9_;
15271 ++current8_;
15272 }
15273 if (current8_ == end8_) {
15274 current8_ = begin8_;
15275 ++current7_;
15276 }
15277 if (current7_ == end7_) {
15278 current7_ = begin7_;
15279 ++current6_;
15280 }
15281 if (current6_ == end6_) {
15282 current6_ = begin6_;
15283 ++current5_;
15284 }
15285 if (current5_ == end5_) {
15286 current5_ = begin5_;
15287 ++current4_;
15288 }
15289 if (current4_ == end4_) {
15290 current4_ = begin4_;
15291 ++current3_;
15292 }
15293 if (current3_ == end3_) {
15294 current3_ = begin3_;
15295 ++current2_;
15296 }
15297 if (current2_ == end2_) {
15298 current2_ = begin2_;
15299 ++current1_;
15300 }
15301 ComputeCurrentValue();
15302 }
15303 virtual ParamIteratorInterface<ParamType>* Clone() const {
15304 return new Iterator(*this);
15305 }
15306 virtual const ParamType* Current() const { return ¤t_value_; }
15307 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
15308
15309
15310 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
15311 << "The program attempted to compare iterators "
15312 << "from different generators." << std::endl;
15313 const Iterator* typed_other =
15314 CheckedDowncastToActualType<const Iterator>(&other);
15315
15316
15317
15318 return (AtEnd() && typed_other->AtEnd()) ||
15319 (
15320 current1_ == typed_other->current1_ &&
15321 current2_ == typed_other->current2_ &&
15322 current3_ == typed_other->current3_ &&
15323 current4_ == typed_other->current4_ &&
15324 current5_ == typed_other->current5_ &&
15325 current6_ == typed_other->current6_ &&
15326 current7_ == typed_other->current7_ &&
15327 current8_ == typed_other->current8_ &&
15328 current9_ == typed_other->current9_ &&
15329 current10_ == typed_other->current10_);
15330 }
15331
15332 private:
15333 Iterator(const Iterator& other)
15334 : base_(other.base_),
15335 begin1_(other.begin1_),
15336 end1_(other.end1_),
15337 current1_(other.current1_),
15338 begin2_(other.begin2_),
15339 end2_(other.end2_),
15340 current2_(other.current2_),
15341 begin3_(other.begin3_),
15342 end3_(other.end3_),
15343 current3_(other.current3_),
15344 begin4_(other.begin4_),
15345 end4_(other.end4_),
15346 current4_(other.current4_),
15347 begin5_(other.begin5_),
15348 end5_(other.end5_),
15349 current5_(other.current5_),
15350 begin6_(other.begin6_),
15351 end6_(other.end6_),
15352 current6_(other.current6_),
15353 begin7_(other.begin7_),
15354 end7_(other.end7_),
15355 current7_(other.current7_),
15356 begin8_(other.begin8_),
15357 end8_(other.end8_),
15358 current8_(other.current8_),
15359 begin9_(other.begin9_),
15360 end9_(other.end9_),
15361 current9_(other.current9_),
15362 begin10_(other.begin10_),
15363 end10_(other.end10_),
15364 current10_(other.current10_) {
15365 ComputeCurrentValue();
15366 }
15367
15368 void ComputeCurrentValue() {
15369 if (!AtEnd())
15370 current_value_ = ParamType(*current1_, *current2_, *current3_,
15371 *current4_, *current5_, *current6_, *current7_, *current8_,
15372 *current9_, *current10_);
15373 }
15374 bool AtEnd() const {
15375
15376
15377 return
15378 current1_ == end1_ ||
15379 current2_ == end2_ ||
15380 current3_ == end3_ ||
15381 current4_ == end4_ ||
15382 current5_ == end5_ ||
15383 current6_ == end6_ ||
15384 current7_ == end7_ ||
15385 current8_ == end8_ ||
15386 current9_ == end9_ ||
15387 current10_ == end10_;
15388 }
15389
15390
15391 void operator=(const Iterator& other);
15392
15393 const ParamGeneratorInterface<ParamType>* const base_;
15394
15395
15396 const typename ParamGenerator<T1>::iterator begin1_;
15397 const typename ParamGenerator<T1>::iterator end1_;
15398 typename ParamGenerator<T1>::iterator current1_;
15399 const typename ParamGenerator<T2>::iterator begin2_;
15400 const typename ParamGenerator<T2>::iterator end2_;
15401 typename ParamGenerator<T2>::iterator current2_;
15402 const typename ParamGenerator<T3>::iterator begin3_;
15403 const typename ParamGenerator<T3>::iterator end3_;
15404 typename ParamGenerator<T3>::iterator current3_;
15405 const typename ParamGenerator<T4>::iterator begin4_;
15406 const typename ParamGenerator<T4>::iterator end4_;
15407 typename ParamGenerator<T4>::iterator current4_;
15408 const typename ParamGenerator<T5>::iterator begin5_;
15409 const typename ParamGenerator<T5>::iterator end5_;
15410 typename ParamGenerator<T5>::iterator current5_;
15411 const typename ParamGenerator<T6>::iterator begin6_;
15412 const typename ParamGenerator<T6>::iterator end6_;
15413 typename ParamGenerator<T6>::iterator current6_;
15414 const typename ParamGenerator<T7>::iterator begin7_;
15415 const typename ParamGenerator<T7>::iterator end7_;
15416 typename ParamGenerator<T7>::iterator current7_;
15417 const typename ParamGenerator<T8>::iterator begin8_;
15418 const typename ParamGenerator<T8>::iterator end8_;
15419 typename ParamGenerator<T8>::iterator current8_;
15420 const typename ParamGenerator<T9>::iterator begin9_;
15421 const typename ParamGenerator<T9>::iterator end9_;
15422 typename ParamGenerator<T9>::iterator current9_;
15423 const typename ParamGenerator<T10>::iterator begin10_;
15424 const typename ParamGenerator<T10>::iterator end10_;
15425 typename ParamGenerator<T10>::iterator current10_;
15426 ParamType current_value_;
15427 };
15428
15429
15430 void operator=(const CartesianProductGenerator10& other);
15431
15432 const ParamGenerator<T1> g1_;
15433 const ParamGenerator<T2> g2_;
15434 const ParamGenerator<T3> g3_;
15435 const ParamGenerator<T4> g4_;
15436 const ParamGenerator<T5> g5_;
15437 const ParamGenerator<T6> g6_;
15438 const ParamGenerator<T7> g7_;
15439 const ParamGenerator<T8> g8_;
15440 const ParamGenerator<T9> g9_;
15441 const ParamGenerator<T10> g10_;
15442 };
15443
15444
15445
15446
15447
15448
15449
15450
15451 template <class Generator1, class Generator2>
15452 class CartesianProductHolder2 {
15453 public:
15454 CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
15455 : g1_(g1), g2_(g2) {}
15456 template <typename T1, typename T2>
15457 operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
15458 return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
15459 new CartesianProductGenerator2<T1, T2>(
15460 static_cast<ParamGenerator<T1> >(g1_),
15461 static_cast<ParamGenerator<T2> >(g2_)));
15462 }
15463
15464 private:
15465
15466 void operator=(const CartesianProductHolder2& other);
15467
15468 const Generator1 g1_;
15469 const Generator2 g2_;
15470 };
15471
15472 template <class Generator1, class Generator2, class Generator3>
15473 class CartesianProductHolder3 {
15474 public:
15475 CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
15476 const Generator3& g3)
15477 : g1_(g1), g2_(g2), g3_(g3) {}
15478 template <typename T1, typename T2, typename T3>
15479 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
15480 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
15481 new CartesianProductGenerator3<T1, T2, T3>(
15482 static_cast<ParamGenerator<T1> >(g1_),
15483 static_cast<ParamGenerator<T2> >(g2_),
15484 static_cast<ParamGenerator<T3> >(g3_)));
15485 }
15486
15487 private:
15488
15489 void operator=(const CartesianProductHolder3& other);
15490
15491 const Generator1 g1_;
15492 const Generator2 g2_;
15493 const Generator3 g3_;
15494 };
15495
15496 template <class Generator1, class Generator2, class Generator3,
15497 class Generator4>
15498 class CartesianProductHolder4 {
15499 public:
15500 CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
15501 const Generator3& g3, const Generator4& g4)
15502 : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
15503 template <typename T1, typename T2, typename T3, typename T4>
15504 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
15505 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
15506 new CartesianProductGenerator4<T1, T2, T3, T4>(
15507 static_cast<ParamGenerator<T1> >(g1_),
15508 static_cast<ParamGenerator<T2> >(g2_),
15509 static_cast<ParamGenerator<T3> >(g3_),
15510 static_cast<ParamGenerator<T4> >(g4_)));
15511 }
15512
15513 private:
15514
15515 void operator=(const CartesianProductHolder4& other);
15516
15517 const Generator1 g1_;
15518 const Generator2 g2_;
15519 const Generator3 g3_;
15520 const Generator4 g4_;
15521 };
15522
15523 template <class Generator1, class Generator2, class Generator3,
15524 class Generator4, class Generator5>
15525 class CartesianProductHolder5 {
15526 public:
15527 CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
15528 const Generator3& g3, const Generator4& g4, const Generator5& g5)
15529 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
15530 template <typename T1, typename T2, typename T3, typename T4, typename T5>
15531 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
15532 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
15533 new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
15534 static_cast<ParamGenerator<T1> >(g1_),
15535 static_cast<ParamGenerator<T2> >(g2_),
15536 static_cast<ParamGenerator<T3> >(g3_),
15537 static_cast<ParamGenerator<T4> >(g4_),
15538 static_cast<ParamGenerator<T5> >(g5_)));
15539 }
15540
15541 private:
15542
15543 void operator=(const CartesianProductHolder5& other);
15544
15545 const Generator1 g1_;
15546 const Generator2 g2_;
15547 const Generator3 g3_;
15548 const Generator4 g4_;
15549 const Generator5 g5_;
15550 };
15551
15552 template <class Generator1, class Generator2, class Generator3,
15553 class Generator4, class Generator5, class Generator6>
15554 class CartesianProductHolder6 {
15555 public:
15556 CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
15557 const Generator3& g3, const Generator4& g4, const Generator5& g5,
15558 const Generator6& g6)
15559 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
15560 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15561 typename T6>
15562 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
15563 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
15564 new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
15565 static_cast<ParamGenerator<T1> >(g1_),
15566 static_cast<ParamGenerator<T2> >(g2_),
15567 static_cast<ParamGenerator<T3> >(g3_),
15568 static_cast<ParamGenerator<T4> >(g4_),
15569 static_cast<ParamGenerator<T5> >(g5_),
15570 static_cast<ParamGenerator<T6> >(g6_)));
15571 }
15572
15573 private:
15574
15575 void operator=(const CartesianProductHolder6& other);
15576
15577 const Generator1 g1_;
15578 const Generator2 g2_;
15579 const Generator3 g3_;
15580 const Generator4 g4_;
15581 const Generator5 g5_;
15582 const Generator6 g6_;
15583 };
15584
15585 template <class Generator1, class Generator2, class Generator3,
15586 class Generator4, class Generator5, class Generator6, class Generator7>
15587 class CartesianProductHolder7 {
15588 public:
15589 CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
15590 const Generator3& g3, const Generator4& g4, const Generator5& g5,
15591 const Generator6& g6, const Generator7& g7)
15592 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
15593 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15594 typename T6, typename T7>
15595 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
15596 T7> >() const {
15597 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
15598 new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
15599 static_cast<ParamGenerator<T1> >(g1_),
15600 static_cast<ParamGenerator<T2> >(g2_),
15601 static_cast<ParamGenerator<T3> >(g3_),
15602 static_cast<ParamGenerator<T4> >(g4_),
15603 static_cast<ParamGenerator<T5> >(g5_),
15604 static_cast<ParamGenerator<T6> >(g6_),
15605 static_cast<ParamGenerator<T7> >(g7_)));
15606 }
15607
15608 private:
15609
15610 void operator=(const CartesianProductHolder7& other);
15611
15612 const Generator1 g1_;
15613 const Generator2 g2_;
15614 const Generator3 g3_;
15615 const Generator4 g4_;
15616 const Generator5 g5_;
15617 const Generator6 g6_;
15618 const Generator7 g7_;
15619 };
15620
15621 template <class Generator1, class Generator2, class Generator3,
15622 class Generator4, class Generator5, class Generator6, class Generator7,
15623 class Generator8>
15624 class CartesianProductHolder8 {
15625 public:
15626 CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
15627 const Generator3& g3, const Generator4& g4, const Generator5& g5,
15628 const Generator6& g6, const Generator7& g7, const Generator8& g8)
15629 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
15630 g8_(g8) {}
15631 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15632 typename T6, typename T7, typename T8>
15633 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
15634 T8> >() const {
15635 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
15636 new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
15637 static_cast<ParamGenerator<T1> >(g1_),
15638 static_cast<ParamGenerator<T2> >(g2_),
15639 static_cast<ParamGenerator<T3> >(g3_),
15640 static_cast<ParamGenerator<T4> >(g4_),
15641 static_cast<ParamGenerator<T5> >(g5_),
15642 static_cast<ParamGenerator<T6> >(g6_),
15643 static_cast<ParamGenerator<T7> >(g7_),
15644 static_cast<ParamGenerator<T8> >(g8_)));
15645 }
15646
15647 private:
15648
15649 void operator=(const CartesianProductHolder8& other);
15650
15651 const Generator1 g1_;
15652 const Generator2 g2_;
15653 const Generator3 g3_;
15654 const Generator4 g4_;
15655 const Generator5 g5_;
15656 const Generator6 g6_;
15657 const Generator7 g7_;
15658 const Generator8 g8_;
15659 };
15660
15661 template <class Generator1, class Generator2, class Generator3,
15662 class Generator4, class Generator5, class Generator6, class Generator7,
15663 class Generator8, class Generator9>
15664 class CartesianProductHolder9 {
15665 public:
15666 CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
15667 const Generator3& g3, const Generator4& g4, const Generator5& g5,
15668 const Generator6& g6, const Generator7& g7, const Generator8& g8,
15669 const Generator9& g9)
15670 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15671 g9_(g9) {}
15672 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15673 typename T6, typename T7, typename T8, typename T9>
15674 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15675 T9> >() const {
15676 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15677 T9> >(
15678 new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
15679 static_cast<ParamGenerator<T1> >(g1_),
15680 static_cast<ParamGenerator<T2> >(g2_),
15681 static_cast<ParamGenerator<T3> >(g3_),
15682 static_cast<ParamGenerator<T4> >(g4_),
15683 static_cast<ParamGenerator<T5> >(g5_),
15684 static_cast<ParamGenerator<T6> >(g6_),
15685 static_cast<ParamGenerator<T7> >(g7_),
15686 static_cast<ParamGenerator<T8> >(g8_),
15687 static_cast<ParamGenerator<T9> >(g9_)));
15688 }
15689
15690 private:
15691
15692 void operator=(const CartesianProductHolder9& other);
15693
15694 const Generator1 g1_;
15695 const Generator2 g2_;
15696 const Generator3 g3_;
15697 const Generator4 g4_;
15698 const Generator5 g5_;
15699 const Generator6 g6_;
15700 const Generator7 g7_;
15701 const Generator8 g8_;
15702 const Generator9 g9_;
15703 };
15704
15705 template <class Generator1, class Generator2, class Generator3,
15706 class Generator4, class Generator5, class Generator6, class Generator7,
15707 class Generator8, class Generator9, class Generator10>
15708 class CartesianProductHolder10 {
15709 public:
15710 CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
15711 const Generator3& g3, const Generator4& g4, const Generator5& g5,
15712 const Generator6& g6, const Generator7& g7, const Generator8& g8,
15713 const Generator9& g9, const Generator10& g10)
15714 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15715 g9_(g9), g10_(g10) {}
15716 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15717 typename T6, typename T7, typename T8, typename T9, typename T10>
15718 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15719 T9, T10> >() const {
15720 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15721 T9, T10> >(
15722 new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
15723 T10>(
15724 static_cast<ParamGenerator<T1> >(g1_),
15725 static_cast<ParamGenerator<T2> >(g2_),
15726 static_cast<ParamGenerator<T3> >(g3_),
15727 static_cast<ParamGenerator<T4> >(g4_),
15728 static_cast<ParamGenerator<T5> >(g5_),
15729 static_cast<ParamGenerator<T6> >(g6_),
15730 static_cast<ParamGenerator<T7> >(g7_),
15731 static_cast<ParamGenerator<T8> >(g8_),
15732 static_cast<ParamGenerator<T9> >(g9_),
15733 static_cast<ParamGenerator<T10> >(g10_)));
15734 }
15735
15736 private:
15737
15738 void operator=(const CartesianProductHolder10& other);
15739
15740 const Generator1 g1_;
15741 const Generator2 g2_;
15742 const Generator3 g3_;
15743 const Generator4 g4_;
15744 const Generator5 g5_;
15745 const Generator6 g6_;
15746 const Generator7 g7_;
15747 const Generator8 g8_;
15748 const Generator9 g9_;
15749 const Generator10 g10_;
15750 };
15751
15752 # endif // GTEST_HAS_COMBINE
15753
15754 }
15755 }
15756
15757 #endif // GTEST_HAS_PARAM_TEST
15758
15759 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
15760
15761 #if GTEST_HAS_PARAM_TEST
15762
15763 namespace testing {
15764
15765
15766
15767
15768
15769
15770
15771
15772
15773
15774
15775
15776
15777
15778
15779
15780
15781
15782
15783
15784
15785
15786
15787
15788
15789
15790
15791
15792
15793
15794
15795
15796
15797
15798
15799
15800
15801
15802
15803
15804
15805
15806
15807 template <typename T, typename IncrementT>
15808 internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
15809 return internal::ParamGenerator<T>(
15810 new internal::RangeGenerator<T, IncrementT>(start, end, step));
15811 }
15812
15813 template <typename T>
15814 internal::ParamGenerator<T> Range(T start, T end) {
15815 return Range(start, end, 1);
15816 }
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826
15827
15828
15829
15830
15831
15832
15833
15834
15835
15836
15837
15838
15839
15840
15841
15842
15843
15844
15845
15846
15847
15848
15849
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
15873 template <typename ForwardIterator>
15874 internal::ParamGenerator<
15875 typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
15876 ValuesIn(ForwardIterator begin, ForwardIterator end) {
15877 typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
15878 ::value_type ParamType;
15879 return internal::ParamGenerator<ParamType>(
15880 new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
15881 }
15882
15883 template <typename T, size_t N>
15884 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
15885 return ValuesIn(array, array + N);
15886 }
15887
15888 template <class Container>
15889 internal::ParamGenerator<typename Container::value_type> ValuesIn(
15890 const Container& container) {
15891 return ValuesIn(container.begin(), container.end());
15892 }
15893
15894
15895
15896
15897
15898
15899
15900
15901
15902
15903
15904
15905
15906
15907
15908
15909
15910
15911
15912
15913 template <typename T1>
15914 internal::ValueArray1<T1> Values(T1 v1) {
15915 return internal::ValueArray1<T1>(v1);
15916 }
15917
15918 template <typename T1, typename T2>
15919 internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
15920 return internal::ValueArray2<T1, T2>(v1, v2);
15921 }
15922
15923 template <typename T1, typename T2, typename T3>
15924 internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
15925 return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
15926 }
15927
15928 template <typename T1, typename T2, typename T3, typename T4>
15929 internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
15930 return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
15931 }
15932
15933 template <typename T1, typename T2, typename T3, typename T4, typename T5>
15934 internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
15935 T5 v5) {
15936 return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
15937 }
15938
15939 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15940 typename T6>
15941 internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
15942 T4 v4, T5 v5, T6 v6) {
15943 return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
15944 }
15945
15946 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15947 typename T6, typename T7>
15948 internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
15949 T4 v4, T5 v5, T6 v6, T7 v7) {
15950 return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
15951 v6, v7);
15952 }
15953
15954 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15955 typename T6, typename T7, typename T8>
15956 internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
15957 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
15958 return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
15959 v5, v6, v7, v8);
15960 }
15961
15962 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15963 typename T6, typename T7, typename T8, typename T9>
15964 internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
15965 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
15966 return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
15967 v4, v5, v6, v7, v8, v9);
15968 }
15969
15970 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15971 typename T6, typename T7, typename T8, typename T9, typename T10>
15972 internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
15973 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
15974 return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
15975 v2, v3, v4, v5, v6, v7, v8, v9, v10);
15976 }
15977
15978 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15979 typename T6, typename T7, typename T8, typename T9, typename T10,
15980 typename T11>
15981 internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
15982 T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15983 T10 v10, T11 v11) {
15984 return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
15985 T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
15986 }
15987
15988 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15989 typename T6, typename T7, typename T8, typename T9, typename T10,
15990 typename T11, typename T12>
15991 internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
15992 T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15993 T10 v10, T11 v11, T12 v12) {
15994 return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
15995 T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
15996 }
15997
15998 template <typename T1, typename T2, typename T3, typename T4, typename T5,
15999 typename T6, typename T7, typename T8, typename T9, typename T10,
16000 typename T11, typename T12, typename T13>
16001 internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
16002 T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16003 T10 v10, T11 v11, T12 v12, T13 v13) {
16004 return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16005 T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
16006 }
16007
16008 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16009 typename T6, typename T7, typename T8, typename T9, typename T10,
16010 typename T11, typename T12, typename T13, typename T14>
16011 internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16012 T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16013 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
16014 return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16015 T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16016 v14);
16017 }
16018
16019 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16020 typename T6, typename T7, typename T8, typename T9, typename T10,
16021 typename T11, typename T12, typename T13, typename T14, typename T15>
16022 internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16023 T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16024 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
16025 return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16026 T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16027 v13, v14, v15);
16028 }
16029
16030 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16031 typename T6, typename T7, typename T8, typename T9, typename T10,
16032 typename T11, typename T12, typename T13, typename T14, typename T15,
16033 typename T16>
16034 internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16035 T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16036 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16037 T16 v16) {
16038 return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16039 T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16040 v12, v13, v14, v15, v16);
16041 }
16042
16043 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16044 typename T6, typename T7, typename T8, typename T9, typename T10,
16045 typename T11, typename T12, typename T13, typename T14, typename T15,
16046 typename T16, typename T17>
16047 internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16048 T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16049 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16050 T16 v16, T17 v17) {
16051 return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16052 T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16053 v11, v12, v13, v14, v15, v16, v17);
16054 }
16055
16056 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16057 typename T6, typename T7, typename T8, typename T9, typename T10,
16058 typename T11, typename T12, typename T13, typename T14, typename T15,
16059 typename T16, typename T17, typename T18>
16060 internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16061 T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16062 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16063 T16 v16, T17 v17, T18 v18) {
16064 return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16065 T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16066 v10, v11, v12, v13, v14, v15, v16, v17, v18);
16067 }
16068
16069 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16070 typename T6, typename T7, typename T8, typename T9, typename T10,
16071 typename T11, typename T12, typename T13, typename T14, typename T15,
16072 typename T16, typename T17, typename T18, typename T19>
16073 internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16074 T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16075 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16076 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
16077 return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16078 T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
16079 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
16080 }
16081
16082 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16083 typename T6, typename T7, typename T8, typename T9, typename T10,
16084 typename T11, typename T12, typename T13, typename T14, typename T15,
16085 typename T16, typename T17, typename T18, typename T19, typename T20>
16086 internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16087 T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16088 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16089 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
16090 return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16091 T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
16092 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
16093 }
16094
16095 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16096 typename T6, typename T7, typename T8, typename T9, typename T10,
16097 typename T11, typename T12, typename T13, typename T14, typename T15,
16098 typename T16, typename T17, typename T18, typename T19, typename T20,
16099 typename T21>
16100 internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16101 T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16102 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16103 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
16104 return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16105 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
16106 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
16107 }
16108
16109 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16110 typename T6, typename T7, typename T8, typename T9, typename T10,
16111 typename T11, typename T12, typename T13, typename T14, typename T15,
16112 typename T16, typename T17, typename T18, typename T19, typename T20,
16113 typename T21, typename T22>
16114 internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16115 T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
16116 T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16117 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16118 T21 v21, T22 v22) {
16119 return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16120 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
16121 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16122 v20, v21, v22);
16123 }
16124
16125 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16126 typename T6, typename T7, typename T8, typename T9, typename T10,
16127 typename T11, typename T12, typename T13, typename T14, typename T15,
16128 typename T16, typename T17, typename T18, typename T19, typename T20,
16129 typename T21, typename T22, typename T23>
16130 internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16131 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
16132 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16133 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16134 T21 v21, T22 v22, T23 v23) {
16135 return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16136 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
16137 v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16138 v20, v21, v22, v23);
16139 }
16140
16141 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16142 typename T6, typename T7, typename T8, typename T9, typename T10,
16143 typename T11, typename T12, typename T13, typename T14, typename T15,
16144 typename T16, typename T17, typename T18, typename T19, typename T20,
16145 typename T21, typename T22, typename T23, typename T24>
16146 internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16147 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
16148 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16149 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16150 T21 v21, T22 v22, T23 v23, T24 v24) {
16151 return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16152 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
16153 v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
16154 v19, v20, v21, v22, v23, v24);
16155 }
16156
16157 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16158 typename T6, typename T7, typename T8, typename T9, typename T10,
16159 typename T11, typename T12, typename T13, typename T14, typename T15,
16160 typename T16, typename T17, typename T18, typename T19, typename T20,
16161 typename T21, typename T22, typename T23, typename T24, typename T25>
16162 internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16163 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
16164 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
16165 T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
16166 T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
16167 return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16168 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
16169 v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
16170 v18, v19, v20, v21, v22, v23, v24, v25);
16171 }
16172
16173 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16174 typename T6, typename T7, typename T8, typename T9, typename T10,
16175 typename T11, typename T12, typename T13, typename T14, typename T15,
16176 typename T16, typename T17, typename T18, typename T19, typename T20,
16177 typename T21, typename T22, typename T23, typename T24, typename T25,
16178 typename T26>
16179 internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16180 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16181 T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16182 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16183 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16184 T26 v26) {
16185 return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16186 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16187 T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
16188 v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
16189 }
16190
16191 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16192 typename T6, typename T7, typename T8, typename T9, typename T10,
16193 typename T11, typename T12, typename T13, typename T14, typename T15,
16194 typename T16, typename T17, typename T18, typename T19, typename T20,
16195 typename T21, typename T22, typename T23, typename T24, typename T25,
16196 typename T26, typename T27>
16197 internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16198 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
16199 T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16200 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16201 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16202 T26 v26, T27 v27) {
16203 return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16204 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16205 T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
16206 v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
16207 }
16208
16209 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16210 typename T6, typename T7, typename T8, typename T9, typename T10,
16211 typename T11, typename T12, typename T13, typename T14, typename T15,
16212 typename T16, typename T17, typename T18, typename T19, typename T20,
16213 typename T21, typename T22, typename T23, typename T24, typename T25,
16214 typename T26, typename T27, typename T28>
16215 internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16216 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
16217 T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16218 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16219 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16220 T26 v26, T27 v27, T28 v28) {
16221 return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16222 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16223 T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16224 v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
16225 v28);
16226 }
16227
16228 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16229 typename T6, typename T7, typename T8, typename T9, typename T10,
16230 typename T11, typename T12, typename T13, typename T14, typename T15,
16231 typename T16, typename T17, typename T18, typename T19, typename T20,
16232 typename T21, typename T22, typename T23, typename T24, typename T25,
16233 typename T26, typename T27, typename T28, typename T29>
16234 internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16235 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16236 T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16237 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16238 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16239 T26 v26, T27 v27, T28 v28, T29 v29) {
16240 return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16241 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16242 T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16243 v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
16244 v27, v28, v29);
16245 }
16246
16247 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16248 typename T6, typename T7, typename T8, typename T9, typename T10,
16249 typename T11, typename T12, typename T13, typename T14, typename T15,
16250 typename T16, typename T17, typename T18, typename T19, typename T20,
16251 typename T21, typename T22, typename T23, typename T24, typename T25,
16252 typename T26, typename T27, typename T28, typename T29, typename T30>
16253 internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16254 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16255 T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16256 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
16257 T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
16258 T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
16259 return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16260 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16261 T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16262 v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
16263 v26, v27, v28, v29, v30);
16264 }
16265
16266 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16267 typename T6, typename T7, typename T8, typename T9, typename T10,
16268 typename T11, typename T12, typename T13, typename T14, typename T15,
16269 typename T16, typename T17, typename T18, typename T19, typename T20,
16270 typename T21, typename T22, typename T23, typename T24, typename T25,
16271 typename T26, typename T27, typename T28, typename T29, typename T30,
16272 typename T31>
16273 internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16274 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16275 T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16276 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16277 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16278 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
16279 return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16280 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16281 T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16282 v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
16283 v25, v26, v27, v28, v29, v30, v31);
16284 }
16285
16286 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16287 typename T6, typename T7, typename T8, typename T9, typename T10,
16288 typename T11, typename T12, typename T13, typename T14, typename T15,
16289 typename T16, typename T17, typename T18, typename T19, typename T20,
16290 typename T21, typename T22, typename T23, typename T24, typename T25,
16291 typename T26, typename T27, typename T28, typename T29, typename T30,
16292 typename T31, typename T32>
16293 internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16294 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16295 T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16296 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16297 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16298 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16299 T32 v32) {
16300 return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16301 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16302 T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16303 v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16304 v24, v25, v26, v27, v28, v29, v30, v31, v32);
16305 }
16306
16307 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16308 typename T6, typename T7, typename T8, typename T9, typename T10,
16309 typename T11, typename T12, typename T13, typename T14, typename T15,
16310 typename T16, typename T17, typename T18, typename T19, typename T20,
16311 typename T21, typename T22, typename T23, typename T24, typename T25,
16312 typename T26, typename T27, typename T28, typename T29, typename T30,
16313 typename T31, typename T32, typename T33>
16314 internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16315 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16316 T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16317 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16318 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16319 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16320 T32 v32, T33 v33) {
16321 return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16322 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16323 T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
16324 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16325 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
16326 }
16327
16328 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16329 typename T6, typename T7, typename T8, typename T9, typename T10,
16330 typename T11, typename T12, typename T13, typename T14, typename T15,
16331 typename T16, typename T17, typename T18, typename T19, typename T20,
16332 typename T21, typename T22, typename T23, typename T24, typename T25,
16333 typename T26, typename T27, typename T28, typename T29, typename T30,
16334 typename T31, typename T32, typename T33, typename T34>
16335 internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16336 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16337 T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16338 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16339 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
16340 T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
16341 T31 v31, T32 v32, T33 v33, T34 v34) {
16342 return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16343 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16344 T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
16345 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
16346 v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
16347 }
16348
16349 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16350 typename T6, typename T7, typename T8, typename T9, typename T10,
16351 typename T11, typename T12, typename T13, typename T14, typename T15,
16352 typename T16, typename T17, typename T18, typename T19, typename T20,
16353 typename T21, typename T22, typename T23, typename T24, typename T25,
16354 typename T26, typename T27, typename T28, typename T29, typename T30,
16355 typename T31, typename T32, typename T33, typename T34, typename T35>
16356 internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16357 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16358 T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16359 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16360 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16361 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16362 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
16363 return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16364 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16365 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
16366 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
16367 v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
16368 }
16369
16370 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16371 typename T6, typename T7, typename T8, typename T9, typename T10,
16372 typename T11, typename T12, typename T13, typename T14, typename T15,
16373 typename T16, typename T17, typename T18, typename T19, typename T20,
16374 typename T21, typename T22, typename T23, typename T24, typename T25,
16375 typename T26, typename T27, typename T28, typename T29, typename T30,
16376 typename T31, typename T32, typename T33, typename T34, typename T35,
16377 typename T36>
16378 internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16379 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16380 T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16381 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16382 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16383 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16384 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
16385 return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16386 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16387 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
16388 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16389 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16390 v34, v35, v36);
16391 }
16392
16393 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16394 typename T6, typename T7, typename T8, typename T9, typename T10,
16395 typename T11, typename T12, typename T13, typename T14, typename T15,
16396 typename T16, typename T17, typename T18, typename T19, typename T20,
16397 typename T21, typename T22, typename T23, typename T24, typename T25,
16398 typename T26, typename T27, typename T28, typename T29, typename T30,
16399 typename T31, typename T32, typename T33, typename T34, typename T35,
16400 typename T36, typename T37>
16401 internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16402 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16403 T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
16404 T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16405 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16406 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16407 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16408 T37 v37) {
16409 return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16410 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16411 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
16412 v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16413 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16414 v34, v35, v36, v37);
16415 }
16416
16417 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16418 typename T6, typename T7, typename T8, typename T9, typename T10,
16419 typename T11, typename T12, typename T13, typename T14, typename T15,
16420 typename T16, typename T17, typename T18, typename T19, typename T20,
16421 typename T21, typename T22, typename T23, typename T24, typename T25,
16422 typename T26, typename T27, typename T28, typename T29, typename T30,
16423 typename T31, typename T32, typename T33, typename T34, typename T35,
16424 typename T36, typename T37, typename T38>
16425 internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16426 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16427 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
16428 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16429 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16430 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16431 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16432 T37 v37, T38 v38) {
16433 return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16434 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16435 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
16436 v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
16437 v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
16438 v33, v34, v35, v36, v37, v38);
16439 }
16440
16441 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16442 typename T6, typename T7, typename T8, typename T9, typename T10,
16443 typename T11, typename T12, typename T13, typename T14, typename T15,
16444 typename T16, typename T17, typename T18, typename T19, typename T20,
16445 typename T21, typename T22, typename T23, typename T24, typename T25,
16446 typename T26, typename T27, typename T28, typename T29, typename T30,
16447 typename T31, typename T32, typename T33, typename T34, typename T35,
16448 typename T36, typename T37, typename T38, typename T39>
16449 internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16450 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16451 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
16452 T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16453 T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16454 T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16455 T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16456 T37 v37, T38 v38, T39 v39) {
16457 return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16458 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16459 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
16460 v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
16461 v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
16462 v32, v33, v34, v35, v36, v37, v38, v39);
16463 }
16464
16465 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16466 typename T6, typename T7, typename T8, typename T9, typename T10,
16467 typename T11, typename T12, typename T13, typename T14, typename T15,
16468 typename T16, typename T17, typename T18, typename T19, typename T20,
16469 typename T21, typename T22, typename T23, typename T24, typename T25,
16470 typename T26, typename T27, typename T28, typename T29, typename T30,
16471 typename T31, typename T32, typename T33, typename T34, typename T35,
16472 typename T36, typename T37, typename T38, typename T39, typename T40>
16473 internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16474 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16475 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
16476 T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
16477 T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
16478 T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
16479 T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
16480 T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
16481 return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16482 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16483 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16484 T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
16485 v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
16486 v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
16487 }
16488
16489 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16490 typename T6, typename T7, typename T8, typename T9, typename T10,
16491 typename T11, typename T12, typename T13, typename T14, typename T15,
16492 typename T16, typename T17, typename T18, typename T19, typename T20,
16493 typename T21, typename T22, typename T23, typename T24, typename T25,
16494 typename T26, typename T27, typename T28, typename T29, typename T30,
16495 typename T31, typename T32, typename T33, typename T34, typename T35,
16496 typename T36, typename T37, typename T38, typename T39, typename T40,
16497 typename T41>
16498 internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16499 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16500 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
16501 T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16502 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16503 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16504 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16505 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
16506 return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16507 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16508 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16509 T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
16510 v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
16511 v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
16512 }
16513
16514 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16515 typename T6, typename T7, typename T8, typename T9, typename T10,
16516 typename T11, typename T12, typename T13, typename T14, typename T15,
16517 typename T16, typename T17, typename T18, typename T19, typename T20,
16518 typename T21, typename T22, typename T23, typename T24, typename T25,
16519 typename T26, typename T27, typename T28, typename T29, typename T30,
16520 typename T31, typename T32, typename T33, typename T34, typename T35,
16521 typename T36, typename T37, typename T38, typename T39, typename T40,
16522 typename T41, typename T42>
16523 internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16524 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16525 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
16526 T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16527 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16528 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16529 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16530 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16531 T42 v42) {
16532 return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16533 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16534 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16535 T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16536 v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
16537 v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
16538 v42);
16539 }
16540
16541 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16542 typename T6, typename T7, typename T8, typename T9, typename T10,
16543 typename T11, typename T12, typename T13, typename T14, typename T15,
16544 typename T16, typename T17, typename T18, typename T19, typename T20,
16545 typename T21, typename T22, typename T23, typename T24, typename T25,
16546 typename T26, typename T27, typename T28, typename T29, typename T30,
16547 typename T31, typename T32, typename T33, typename T34, typename T35,
16548 typename T36, typename T37, typename T38, typename T39, typename T40,
16549 typename T41, typename T42, typename T43>
16550 internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16551 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16552 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
16553 T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16554 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16555 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16556 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16557 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16558 T42 v42, T43 v43) {
16559 return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16560 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16561 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16562 T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16563 v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
16564 v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
16565 v41, v42, v43);
16566 }
16567
16568 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16569 typename T6, typename T7, typename T8, typename T9, typename T10,
16570 typename T11, typename T12, typename T13, typename T14, typename T15,
16571 typename T16, typename T17, typename T18, typename T19, typename T20,
16572 typename T21, typename T22, typename T23, typename T24, typename T25,
16573 typename T26, typename T27, typename T28, typename T29, typename T30,
16574 typename T31, typename T32, typename T33, typename T34, typename T35,
16575 typename T36, typename T37, typename T38, typename T39, typename T40,
16576 typename T41, typename T42, typename T43, typename T44>
16577 internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16578 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16579 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16580 T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16581 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16582 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16583 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16584 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16585 T42 v42, T43 v43, T44 v44) {
16586 return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16587 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16588 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16589 T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16590 v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
16591 v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
16592 v40, v41, v42, v43, v44);
16593 }
16594
16595 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16596 typename T6, typename T7, typename T8, typename T9, typename T10,
16597 typename T11, typename T12, typename T13, typename T14, typename T15,
16598 typename T16, typename T17, typename T18, typename T19, typename T20,
16599 typename T21, typename T22, typename T23, typename T24, typename T25,
16600 typename T26, typename T27, typename T28, typename T29, typename T30,
16601 typename T31, typename T32, typename T33, typename T34, typename T35,
16602 typename T36, typename T37, typename T38, typename T39, typename T40,
16603 typename T41, typename T42, typename T43, typename T44, typename T45>
16604 internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16605 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16606 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16607 T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16608 T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
16609 T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
16610 T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
16611 T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
16612 T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
16613 return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16614 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16615 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16616 T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16617 v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
16618 v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
16619 v39, v40, v41, v42, v43, v44, v45);
16620 }
16621
16622 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16623 typename T6, typename T7, typename T8, typename T9, typename T10,
16624 typename T11, typename T12, typename T13, typename T14, typename T15,
16625 typename T16, typename T17, typename T18, typename T19, typename T20,
16626 typename T21, typename T22, typename T23, typename T24, typename T25,
16627 typename T26, typename T27, typename T28, typename T29, typename T30,
16628 typename T31, typename T32, typename T33, typename T34, typename T35,
16629 typename T36, typename T37, typename T38, typename T39, typename T40,
16630 typename T41, typename T42, typename T43, typename T44, typename T45,
16631 typename T46>
16632 internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16633 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16634 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16635 T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16636 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16637 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16638 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16639 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16640 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
16641 return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16642 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16643 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16644 T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16645 v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16646 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
16647 v38, v39, v40, v41, v42, v43, v44, v45, v46);
16648 }
16649
16650 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16651 typename T6, typename T7, typename T8, typename T9, typename T10,
16652 typename T11, typename T12, typename T13, typename T14, typename T15,
16653 typename T16, typename T17, typename T18, typename T19, typename T20,
16654 typename T21, typename T22, typename T23, typename T24, typename T25,
16655 typename T26, typename T27, typename T28, typename T29, typename T30,
16656 typename T31, typename T32, typename T33, typename T34, typename T35,
16657 typename T36, typename T37, typename T38, typename T39, typename T40,
16658 typename T41, typename T42, typename T43, typename T44, typename T45,
16659 typename T46, typename T47>
16660 internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16661 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16662 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16663 T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16664 T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16665 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16666 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16667 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16668 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
16669 return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16670 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16671 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16672 T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
16673 v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16674 v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
16675 v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
16676 }
16677
16678 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16679 typename T6, typename T7, typename T8, typename T9, typename T10,
16680 typename T11, typename T12, typename T13, typename T14, typename T15,
16681 typename T16, typename T17, typename T18, typename T19, typename T20,
16682 typename T21, typename T22, typename T23, typename T24, typename T25,
16683 typename T26, typename T27, typename T28, typename T29, typename T30,
16684 typename T31, typename T32, typename T33, typename T34, typename T35,
16685 typename T36, typename T37, typename T38, typename T39, typename T40,
16686 typename T41, typename T42, typename T43, typename T44, typename T45,
16687 typename T46, typename T47, typename T48>
16688 internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16689 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16690 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16691 T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16692 T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16693 T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16694 T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16695 T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16696 T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
16697 T48 v48) {
16698 return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16699 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16700 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16701 T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
16702 v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
16703 v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
16704 v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
16705 }
16706
16707 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16708 typename T6, typename T7, typename T8, typename T9, typename T10,
16709 typename T11, typename T12, typename T13, typename T14, typename T15,
16710 typename T16, typename T17, typename T18, typename T19, typename T20,
16711 typename T21, typename T22, typename T23, typename T24, typename T25,
16712 typename T26, typename T27, typename T28, typename T29, typename T30,
16713 typename T31, typename T32, typename T33, typename T34, typename T35,
16714 typename T36, typename T37, typename T38, typename T39, typename T40,
16715 typename T41, typename T42, typename T43, typename T44, typename T45,
16716 typename T46, typename T47, typename T48, typename T49>
16717 internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16718 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16719 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16720 T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16721 T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16722 T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
16723 T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
16724 T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
16725 T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
16726 T47 v47, T48 v48, T49 v49) {
16727 return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16728 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16729 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16730 T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
16731 v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
16732 v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
16733 v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
16734 }
16735
16736 template <typename T1, typename T2, typename T3, typename T4, typename T5,
16737 typename T6, typename T7, typename T8, typename T9, typename T10,
16738 typename T11, typename T12, typename T13, typename T14, typename T15,
16739 typename T16, typename T17, typename T18, typename T19, typename T20,
16740 typename T21, typename T22, typename T23, typename T24, typename T25,
16741 typename T26, typename T27, typename T28, typename T29, typename T30,
16742 typename T31, typename T32, typename T33, typename T34, typename T35,
16743 typename T36, typename T37, typename T38, typename T39, typename T40,
16744 typename T41, typename T42, typename T43, typename T44, typename T45,
16745 typename T46, typename T47, typename T48, typename T49, typename T50>
16746 internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16747 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16748 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16749 T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16750 T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16751 T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16752 T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16753 T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
16754 T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
16755 T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
16756 return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16757 T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16758 T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16759 T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
16760 v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16761 v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16762 v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
16763 v48, v49, v50);
16764 }
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774
16775
16776
16777
16778
16779
16780
16781
16782
16783
16784
16785
16786 inline internal::ParamGenerator<bool> Bool() {
16787 return Values(false, true);
16788 }
16789
16790 # if GTEST_HAS_COMBINE
16791
16792
16793
16794
16795
16796
16797
16798
16799
16800
16801
16802
16803
16804
16805
16806
16807
16808
16809
16810
16811
16812
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835
16836
16837
16838
16839 template <typename Generator1, typename Generator2>
16840 internal::CartesianProductHolder2<Generator1, Generator2> Combine(
16841 const Generator1& g1, const Generator2& g2) {
16842 return internal::CartesianProductHolder2<Generator1, Generator2>(
16843 g1, g2);
16844 }
16845
16846 template <typename Generator1, typename Generator2, typename Generator3>
16847 internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
16848 const Generator1& g1, const Generator2& g2, const Generator3& g3) {
16849 return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
16850 g1, g2, g3);
16851 }
16852
16853 template <typename Generator1, typename Generator2, typename Generator3,
16854 typename Generator4>
16855 internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
16856 Generator4> Combine(
16857 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16858 const Generator4& g4) {
16859 return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
16860 Generator4>(
16861 g1, g2, g3, g4);
16862 }
16863
16864 template <typename Generator1, typename Generator2, typename Generator3,
16865 typename Generator4, typename Generator5>
16866 internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
16867 Generator4, Generator5> Combine(
16868 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16869 const Generator4& g4, const Generator5& g5) {
16870 return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
16871 Generator4, Generator5>(
16872 g1, g2, g3, g4, g5);
16873 }
16874
16875 template <typename Generator1, typename Generator2, typename Generator3,
16876 typename Generator4, typename Generator5, typename Generator6>
16877 internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
16878 Generator4, Generator5, Generator6> Combine(
16879 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16880 const Generator4& g4, const Generator5& g5, const Generator6& g6) {
16881 return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
16882 Generator4, Generator5, Generator6>(
16883 g1, g2, g3, g4, g5, g6);
16884 }
16885
16886 template <typename Generator1, typename Generator2, typename Generator3,
16887 typename Generator4, typename Generator5, typename Generator6,
16888 typename Generator7>
16889 internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
16890 Generator4, Generator5, Generator6, Generator7> Combine(
16891 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16892 const Generator4& g4, const Generator5& g5, const Generator6& g6,
16893 const Generator7& g7) {
16894 return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
16895 Generator4, Generator5, Generator6, Generator7>(
16896 g1, g2, g3, g4, g5, g6, g7);
16897 }
16898
16899 template <typename Generator1, typename Generator2, typename Generator3,
16900 typename Generator4, typename Generator5, typename Generator6,
16901 typename Generator7, typename Generator8>
16902 internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
16903 Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
16904 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16905 const Generator4& g4, const Generator5& g5, const Generator6& g6,
16906 const Generator7& g7, const Generator8& g8) {
16907 return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
16908 Generator4, Generator5, Generator6, Generator7, Generator8>(
16909 g1, g2, g3, g4, g5, g6, g7, g8);
16910 }
16911
16912 template <typename Generator1, typename Generator2, typename Generator3,
16913 typename Generator4, typename Generator5, typename Generator6,
16914 typename Generator7, typename Generator8, typename Generator9>
16915 internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
16916 Generator4, Generator5, Generator6, Generator7, Generator8,
16917 Generator9> Combine(
16918 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16919 const Generator4& g4, const Generator5& g5, const Generator6& g6,
16920 const Generator7& g7, const Generator8& g8, const Generator9& g9) {
16921 return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
16922 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
16923 g1, g2, g3, g4, g5, g6, g7, g8, g9);
16924 }
16925
16926 template <typename Generator1, typename Generator2, typename Generator3,
16927 typename Generator4, typename Generator5, typename Generator6,
16928 typename Generator7, typename Generator8, typename Generator9,
16929 typename Generator10>
16930 internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
16931 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
16932 Generator10> Combine(
16933 const Generator1& g1, const Generator2& g2, const Generator3& g3,
16934 const Generator4& g4, const Generator5& g5, const Generator6& g6,
16935 const Generator7& g7, const Generator8& g8, const Generator9& g9,
16936 const Generator10& g10) {
16937 return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
16938 Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
16939 Generator10>(
16940 g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
16941 }
16942 # endif // GTEST_HAS_COMBINE
16943
16944
16945
16946 # define TEST_P(test_case_name, test_name) \
16947 class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
16948 : public test_case_name { \
16949 public: \
16950 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
16951 virtual void TestBody(); \
16952 private: \
16953 static int AddToRegistry() { \
16954 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
16955 GetTestCasePatternHolder<test_case_name>(\
16956 #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
16957 #test_case_name, \
16958 #test_name, \
16959 new ::testing::internal::TestMetaFactory< \
16960 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
16961 return 0; \
16962 } \
16963 static int gtest_registering_dummy_; \
16964 GTEST_DISALLOW_COPY_AND_ASSIGN_(\
16965 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
16966 }; \
16967 int GTEST_TEST_CLASS_NAME_(test_case_name, \
16968 test_name)::gtest_registering_dummy_ = \
16969 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
16970 void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
16971
16972 # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
16973 ::testing::internal::ParamGenerator<test_case_name::ParamType> \
16974 gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
16975 int gtest_##prefix##test_case_name##_dummy_ = \
16976 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
16977 GetTestCasePatternHolder<test_case_name>(\
16978 #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
16979 #prefix, \
16980 >est_##prefix##test_case_name##_EvalGenerator_, \
16981 __FILE__, __LINE__)
16982
16983 }
16984
16985 #endif // GTEST_HAS_PARAM_TEST
16986
16987 #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
16988
16989
16990
16991
16992
16993
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004
17005
17006
17007
17008
17009
17010
17011
17012
17013
17014
17015
17016
17017
17018
17019
17020
17021 #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17022 #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17023
17024
17025
17026
17027
17028
17029
17030
17031
17032
17033
17034
17035
17036
17037
17038
17039
17040
17041
17042 #define FRIEND_TEST(test_case_name, test_name)\
17043 friend class test_case_name##_##test_name##_Test
17044
17045 #endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17046
17047
17048
17049
17050
17051
17052
17053
17054
17055
17056
17057
17058
17059
17060
17061
17062
17063
17064
17065
17066
17067
17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078 #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17079 #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17080
17081 #include <iosfwd>
17082 #include <vector>
17083
17084 namespace testing {
17085
17086
17087
17088
17089
17090 class GTEST_API_ TestPartResult {
17091 public:
17092
17093
17094 enum Type {
17095 kSuccess,
17096 kNonFatalFailure,
17097 kFatalFailure
17098 };
17099
17100
17101
17102
17103 TestPartResult(Type a_type,
17104 const char* a_file_name,
17105 int a_line_number,
17106 const char* a_message)
17107 : type_(a_type),
17108 file_name_(a_file_name == NULL ? "" : a_file_name),
17109 line_number_(a_line_number),
17110 summary_(ExtractSummary(a_message)),
17111 message_(a_message) {
17112 }
17113
17114
17115 Type type() const { return type_; }
17116
17117
17118
17119 const char* file_name() const {
17120 return file_name_.empty() ? NULL : file_name_.c_str();
17121 }
17122
17123
17124
17125 int line_number() const { return line_number_; }
17126
17127
17128 const char* summary() const { return summary_.c_str(); }
17129
17130
17131 const char* message() const { return message_.c_str(); }
17132
17133
17134 bool passed() const { return type_ == kSuccess; }
17135
17136
17137 bool failed() const { return type_ != kSuccess; }
17138
17139
17140 bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
17141
17142
17143 bool fatally_failed() const { return type_ == kFatalFailure; }
17144
17145 private:
17146 Type type_;
17147
17148
17149
17150 static std::string ExtractSummary(const char* message);
17151
17152
17153
17154 std::string file_name_;
17155
17156
17157 int line_number_;
17158 std::string summary_;
17159 std::string message_;
17160 };
17161
17162
17163 std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
17164
17165
17166
17167
17168
17169 class GTEST_API_ TestPartResultArray {
17170 public:
17171 TestPartResultArray() {}
17172
17173
17174 void Append(const TestPartResult& result);
17175
17176
17177 const TestPartResult& GetTestPartResult(int index) const;
17178
17179
17180 int size() const;
17181
17182 private:
17183 std::vector<TestPartResult> array_;
17184
17185 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
17186 };
17187
17188
17189 class TestPartResultReporterInterface {
17190 public:
17191 virtual ~TestPartResultReporterInterface() {}
17192
17193 virtual void ReportTestPartResult(const TestPartResult& result) = 0;
17194 };
17195
17196 namespace internal {
17197
17198
17199
17200
17201
17202
17203
17204 class GTEST_API_ HasNewFatalFailureHelper
17205 : public TestPartResultReporterInterface {
17206 public:
17207 HasNewFatalFailureHelper();
17208 virtual ~HasNewFatalFailureHelper();
17209 virtual void ReportTestPartResult(const TestPartResult& result);
17210 bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
17211 private:
17212 bool has_new_fatal_failure_;
17213 TestPartResultReporterInterface* original_reporter_;
17214
17215 GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
17216 };
17217
17218 }
17219
17220 }
17221
17222 #endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17223
17224
17225
17226
17227
17228
17229
17230
17231
17232
17233
17234
17235
17236
17237
17238
17239
17240
17241
17242
17243
17244
17245
17246
17247
17248
17249
17250
17251
17252
17253
17254 #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17255 #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17256
17257
17258
17259
17260
17261
17262
17263 #if 0
17264
17265
17266
17267 template <typename T>
17268 class FooTest : public testing::Test {
17269 public:
17270 ...
17271 typedef std::list<T> List;
17272 static T shared_;
17273 T value_;
17274 };
17275
17276
17277
17278
17279 typedef testing::Types<char, int, unsigned int> MyTypes;
17280 TYPED_TEST_CASE(FooTest, MyTypes);
17281
17282
17283
17284
17285
17286
17287
17288 TYPED_TEST(FooTest, DoesBlah) {
17289
17290
17291
17292 TypeParam n = this->value_;
17293
17294
17295
17296 n += TestFixture::shared_;
17297
17298
17299
17300 typename TestFixture::List values;
17301 values.push_back(n);
17302 ...
17303 }
17304
17305 TYPED_TEST(FooTest, HasPropertyA) { ... }
17306
17307 #endif // 0
17308
17309
17310
17311
17312
17313
17314
17315
17316
17317
17318
17319
17320
17321
17322
17323 #if 0
17324
17325
17326
17327 template <typename T>
17328 class FooTest : public testing::Test {
17329 ...
17330 };
17331
17332
17333
17334
17335 TYPED_TEST_CASE_P(FooTest);
17336
17337
17338
17339 TYPED_TEST_P(FooTest, DoesBlah) {
17340
17341 TypeParam n = 0;
17342 ...
17343 }
17344
17345 TYPED_TEST_P(FooTest, HasPropertyA) { ... }
17346
17347
17348
17349
17350
17351 REGISTER_TYPED_TEST_CASE_P(FooTest,
17352 DoesBlah, HasPropertyA);
17353
17354
17355
17356
17357
17358
17359
17360
17361
17362 typedef testing::Types<char, int, unsigned int> MyTypes;
17363 INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
17364
17365
17366
17367
17368
17369 #endif // 0
17370
17371
17372
17373
17374 #if GTEST_HAS_TYPED_TEST
17375
17376
17377
17378
17379
17380 # define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
17381
17382
17383
17384
17385 # define TYPED_TEST_CASE(CaseName, Types) \
17386 typedef ::testing::internal::TypeList< Types >::type \
17387 GTEST_TYPE_PARAMS_(CaseName)
17388
17389 # define TYPED_TEST(CaseName, TestName) \
17390 template <typename gtest_TypeParam_> \
17391 class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
17392 : public CaseName<gtest_TypeParam_> { \
17393 private: \
17394 typedef CaseName<gtest_TypeParam_> TestFixture; \
17395 typedef gtest_TypeParam_ TypeParam; \
17396 virtual void TestBody(); \
17397 }; \
17398 bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
17399 ::testing::internal::TypeParameterizedTest< \
17400 CaseName, \
17401 ::testing::internal::TemplateSel< \
17402 GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
17403 GTEST_TYPE_PARAMS_(CaseName)>::Register(\
17404 "", #CaseName, #TestName, 0); \
17405 template <typename gtest_TypeParam_> \
17406 void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
17407
17408 #endif // GTEST_HAS_TYPED_TEST
17409
17410
17411
17412 #if GTEST_HAS_TYPED_TEST_P
17413
17414
17415
17416
17417
17418
17419 # define GTEST_CASE_NAMESPACE_(TestCaseName) \
17420 gtest_case_##TestCaseName##_
17421
17422
17423
17424
17425
17426 # define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
17427 gtest_typed_test_case_p_state_##TestCaseName##_
17428
17429
17430
17431
17432
17433 # define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
17434 gtest_registered_test_names_##TestCaseName##_
17435
17436
17437
17438
17439 # define TYPED_TEST_CASE_P(CaseName) \
17440 static ::testing::internal::TypedTestCasePState \
17441 GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
17442
17443 # define TYPED_TEST_P(CaseName, TestName) \
17444 namespace GTEST_CASE_NAMESPACE_(CaseName) { \
17445 template <typename gtest_TypeParam_> \
17446 class TestName : public CaseName<gtest_TypeParam_> { \
17447 private: \
17448 typedef CaseName<gtest_TypeParam_> TestFixture; \
17449 typedef gtest_TypeParam_ TypeParam; \
17450 virtual void TestBody(); \
17451 }; \
17452 static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
17453 GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
17454 __FILE__, __LINE__, #CaseName, #TestName); \
17455 } \
17456 template <typename gtest_TypeParam_> \
17457 void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
17458
17459 # define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
17460 namespace GTEST_CASE_NAMESPACE_(CaseName) { \
17461 typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
17462 } \
17463 static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
17464 GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
17465 __FILE__, __LINE__, #__VA_ARGS__)
17466
17467
17468
17469
17470 # define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
17471 bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
17472 ::testing::internal::TypeParameterizedTestCase<CaseName, \
17473 GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
17474 ::testing::internal::TypeList< Types >::type>::Register(\
17475 #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
17476
17477 #endif // GTEST_HAS_TYPED_TEST_P
17478
17479 #endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17480
17481
17482
17483
17484
17485
17486
17487
17488
17489
17490
17491
17492
17493
17494
17495
17496 namespace testing {
17497
17498
17499
17500
17501 GTEST_DECLARE_bool_(also_run_disabled_tests);
17502
17503
17504 GTEST_DECLARE_bool_(break_on_failure);
17505
17506
17507
17508 GTEST_DECLARE_bool_(catch_exceptions);
17509
17510
17511
17512
17513 GTEST_DECLARE_string_(color);
17514
17515
17516
17517 GTEST_DECLARE_string_(filter);
17518
17519
17520
17521 GTEST_DECLARE_bool_(list_tests);
17522
17523
17524
17525 GTEST_DECLARE_string_(output);
17526
17527
17528
17529 GTEST_DECLARE_bool_(print_time);
17530
17531
17532 GTEST_DECLARE_int32_(random_seed);
17533
17534
17535
17536 GTEST_DECLARE_int32_(repeat);
17537
17538
17539
17540 GTEST_DECLARE_bool_(show_internal_stack_frames);
17541
17542
17543 GTEST_DECLARE_bool_(shuffle);
17544
17545
17546
17547 GTEST_DECLARE_int32_(stack_trace_depth);
17548
17549
17550
17551
17552 GTEST_DECLARE_bool_(throw_on_failure);
17553
17554
17555
17556
17557 GTEST_DECLARE_string_(stream_result_to);
17558
17559
17560 const int kMaxStackTraceDepth = 100;
17561
17562 namespace internal {
17563
17564 class AssertHelper;
17565 class DefaultGlobalTestPartResultReporter;
17566 class ExecDeathTest;
17567 class NoExecDeathTest;
17568 class FinalSuccessChecker;
17569 class GTestFlagSaver;
17570 class StreamingListenerTest;
17571 class TestResultAccessor;
17572 class TestEventListenersAccessor;
17573 class TestEventRepeater;
17574 class UnitTestRecordPropertyTestHelper;
17575 class WindowsDeathTest;
17576 class UnitTestImpl* GetUnitTestImpl();
17577 void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
17578 const std::string& message);
17579
17580 }
17581
17582
17583
17584
17585 class Test;
17586 class TestCase;
17587 class TestInfo;
17588 class UnitTest;
17589
17590
17591
17592
17593
17594
17595
17596
17597
17598
17599
17600
17601
17602
17603
17604
17605
17606
17607
17608
17609
17610
17611
17612
17613
17614
17615
17616
17617
17618
17619
17620
17621
17622
17623
17624
17625
17626
17627
17628
17629
17630
17631
17632
17633
17634
17635
17636
17637
17638
17639
17640
17641
17642
17643
17644
17645
17646
17647
17648
17649
17650
17651
17652
17653
17654
17655
17656
17657
17658
17659
17660
17661
17662
17663
17664
17665
17666
17667
17668
17669 class GTEST_API_ AssertionResult {
17670 public:
17671
17672
17673 AssertionResult(const AssertionResult& other);
17674
17675 explicit AssertionResult(bool success) : success_(success) {}
17676
17677
17678 operator bool() const { return success_; }
17679
17680
17681 AssertionResult operator!() const;
17682
17683
17684
17685
17686
17687 const char* message() const {
17688 return message_.get() != NULL ? message_->c_str() : "";
17689 }
17690
17691
17692 const char* failure_message() const { return message(); }
17693
17694
17695 template <typename T> AssertionResult& operator<<(const T& value) {
17696 AppendMessage(Message() << value);
17697 return *this;
17698 }
17699
17700
17701
17702 AssertionResult& operator<<(
17703 ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
17704 AppendMessage(Message() << basic_manipulator);
17705 return *this;
17706 }
17707
17708 private:
17709
17710 void AppendMessage(const Message& a_message) {
17711 if (message_.get() == NULL)
17712 message_.reset(new ::std::string);
17713 message_->append(a_message.GetString().c_str());
17714 }
17715
17716
17717 bool success_;
17718
17719
17720
17721
17722 internal::scoped_ptr< ::std::string> message_;
17723
17724 GTEST_DISALLOW_ASSIGN_(AssertionResult);
17725 };
17726
17727
17728 GTEST_API_ AssertionResult AssertionSuccess();
17729
17730
17731 GTEST_API_ AssertionResult AssertionFailure();
17732
17733
17734
17735 GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
17755
17756
17757
17758
17759
17760 class GTEST_API_ Test {
17761 public:
17762 friend class TestInfo;
17763
17764
17765
17766 typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
17767 typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
17768
17769
17770 virtual ~Test();
17771
17772
17773
17774
17775
17776
17777
17778 static void SetUpTestCase() {}
17779
17780
17781
17782
17783
17784
17785
17786 static void TearDownTestCase() {}
17787
17788
17789 static bool HasFatalFailure();
17790
17791
17792 static bool HasNonfatalFailure();
17793
17794
17795
17796 static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
17797
17798
17799
17800
17801
17802
17803
17804
17805
17806
17807
17808
17809
17810
17811 static void RecordProperty(const std::string& key, const std::string& value);
17812 static void RecordProperty(const std::string& key, int value);
17813
17814 protected:
17815
17816 Test();
17817
17818
17819 virtual void SetUp();
17820
17821
17822 virtual void TearDown();
17823
17824 private:
17825
17826
17827 static bool HasSameFixtureClass();
17828
17829
17830
17831
17832
17833
17834
17835 virtual void TestBody() = 0;
17836
17837
17838 void Run();
17839
17840
17841
17842 void DeleteSelf_() { delete this; }
17843
17844
17845 const internal::GTestFlagSaver* const gtest_flag_saver_;
17846
17847
17848
17849
17850
17851
17852
17853
17854
17855
17856
17857
17858
17859
17860
17861
17862
17863 struct Setup_should_be_spelled_SetUp {};
17864 virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
17865
17866
17867 GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
17868 };
17869
17870 typedef internal::TimeInMillis TimeInMillis;
17871
17872
17873
17874
17875
17876 class TestProperty {
17877 public:
17878
17879
17880
17881 TestProperty(const std::string& a_key, const std::string& a_value) :
17882 key_(a_key), value_(a_value) {
17883 }
17884
17885
17886 const char* key() const {
17887 return key_.c_str();
17888 }
17889
17890
17891 const char* value() const {
17892 return value_.c_str();
17893 }
17894
17895
17896 void SetValue(const std::string& new_value) {
17897 value_ = new_value;
17898 }
17899
17900 private:
17901
17902 std::string key_;
17903
17904 std::string value_;
17905 };
17906
17907
17908
17909
17910
17911
17912
17913 class GTEST_API_ TestResult {
17914 public:
17915
17916 TestResult();
17917
17918
17919 ~TestResult();
17920
17921
17922
17923 int total_part_count() const;
17924
17925
17926 int test_property_count() const;
17927
17928
17929 bool Passed() const { return !Failed(); }
17930
17931
17932 bool Failed() const;
17933
17934
17935 bool HasFatalFailure() const;
17936
17937
17938 bool HasNonfatalFailure() const;
17939
17940
17941 TimeInMillis elapsed_time() const { return elapsed_time_; }
17942
17943
17944
17945
17946 const TestPartResult& GetTestPartResult(int i) const;
17947
17948
17949
17950
17951 const TestProperty& GetTestProperty(int i) const;
17952
17953 private:
17954 friend class TestInfo;
17955 friend class TestCase;
17956 friend class UnitTest;
17957 friend class internal::DefaultGlobalTestPartResultReporter;
17958 friend class internal::ExecDeathTest;
17959 friend class internal::TestResultAccessor;
17960 friend class internal::UnitTestImpl;
17961 friend class internal::WindowsDeathTest;
17962
17963
17964 const std::vector<TestPartResult>& test_part_results() const {
17965 return test_part_results_;
17966 }
17967
17968
17969 const std::vector<TestProperty>& test_properties() const {
17970 return test_properties_;
17971 }
17972
17973
17974 void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
17975
17976
17977
17978
17979
17980
17981
17982 void RecordProperty(const std::string& xml_element,
17983 const TestProperty& test_property);
17984
17985
17986
17987
17988 static bool ValidateTestProperty(const std::string& xml_element,
17989 const TestProperty& test_property);
17990
17991
17992 void AddTestPartResult(const TestPartResult& test_part_result);
17993
17994
17995 int death_test_count() const { return death_test_count_; }
17996
17997
17998 int increment_death_test_count() { return ++death_test_count_; }
17999
18000
18001 void ClearTestPartResults();
18002
18003
18004 void Clear();
18005
18006
18007
18008 internal::Mutex test_properites_mutex_;
18009
18010
18011 std::vector<TestPartResult> test_part_results_;
18012
18013 std::vector<TestProperty> test_properties_;
18014
18015 int death_test_count_;
18016
18017 TimeInMillis elapsed_time_;
18018
18019
18020 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
18021 };
18022
18023
18024
18025
18026
18027
18028
18029
18030
18031
18032
18033
18034 class GTEST_API_ TestInfo {
18035 public:
18036
18037
18038 ~TestInfo();
18039
18040
18041 const char* test_case_name() const { return test_case_name_.c_str(); }
18042
18043
18044 const char* name() const { return name_.c_str(); }
18045
18046
18047
18048 const char* type_param() const {
18049 if (type_param_.get() != NULL)
18050 return type_param_->c_str();
18051 return NULL;
18052 }
18053
18054
18055
18056 const char* value_param() const {
18057 if (value_param_.get() != NULL)
18058 return value_param_->c_str();
18059 return NULL;
18060 }
18061
18062
18063
18064
18065
18066
18067
18068
18069
18070
18071
18072
18073
18074
18075
18076
18077
18078 bool should_run() const { return should_run_; }
18079
18080
18081 bool is_reportable() const {
18082
18083
18084
18085 return matches_filter_;
18086 }
18087
18088
18089 const TestResult* result() const { return &result_; }
18090
18091 private:
18092 #if GTEST_HAS_DEATH_TEST
18093 friend class internal::DefaultDeathTestFactory;
18094 #endif // GTEST_HAS_DEATH_TEST
18095 friend class Test;
18096 friend class TestCase;
18097 friend class internal::UnitTestImpl;
18098 friend class internal::StreamingListenerTest;
18099 friend TestInfo* internal::MakeAndRegisterTestInfo(
18100 const char* test_case_name,
18101 const char* name,
18102 const char* type_param,
18103 const char* value_param,
18104 internal::TypeId fixture_class_id,
18105 Test::SetUpTestCaseFunc set_up_tc,
18106 Test::TearDownTestCaseFunc tear_down_tc,
18107 internal::TestFactoryBase* factory);
18108
18109
18110
18111 TestInfo(const std::string& test_case_name,
18112 const std::string& name,
18113 const char* a_type_param,
18114 const char* a_value_param,
18115 internal::TypeId fixture_class_id,
18116 internal::TestFactoryBase* factory);
18117
18118
18119
18120 int increment_death_test_count() {
18121 return result_.increment_death_test_count();
18122 }
18123
18124
18125
18126 void Run();
18127
18128 static void ClearTestResult(TestInfo* test_info) {
18129 test_info->result_.Clear();
18130 }
18131
18132
18133 const std::string test_case_name_;
18134 const std::string name_;
18135
18136
18137 const internal::scoped_ptr<const ::std::string> type_param_;
18138
18139
18140 const internal::scoped_ptr<const ::std::string> value_param_;
18141 const internal::TypeId fixture_class_id_;
18142 bool should_run_;
18143 bool is_disabled_;
18144 bool matches_filter_;
18145
18146 internal::TestFactoryBase* const factory_;
18147
18148
18149
18150
18151 TestResult result_;
18152
18153 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
18154 };
18155
18156
18157
18158
18159 class GTEST_API_ TestCase {
18160 public:
18161
18162
18163
18164
18165
18166
18167
18168
18169
18170
18171
18172
18173 TestCase(const char* name, const char* a_type_param,
18174 Test::SetUpTestCaseFunc set_up_tc,
18175 Test::TearDownTestCaseFunc tear_down_tc);
18176
18177
18178 virtual ~TestCase();
18179
18180
18181 const char* name() const { return name_.c_str(); }
18182
18183
18184
18185 const char* type_param() const {
18186 if (type_param_.get() != NULL)
18187 return type_param_->c_str();
18188 return NULL;
18189 }
18190
18191
18192 bool should_run() const { return should_run_; }
18193
18194
18195 int successful_test_count() const;
18196
18197
18198 int failed_test_count() const;
18199
18200
18201 int reportable_disabled_test_count() const;
18202
18203
18204 int disabled_test_count() const;
18205
18206
18207 int reportable_test_count() const;
18208
18209
18210 int test_to_run_count() const;
18211
18212
18213 int total_test_count() const;
18214
18215
18216 bool Passed() const { return !Failed(); }
18217
18218
18219 bool Failed() const { return failed_test_count() > 0; }
18220
18221
18222 TimeInMillis elapsed_time() const { return elapsed_time_; }
18223
18224
18225
18226 const TestInfo* GetTestInfo(int i) const;
18227
18228
18229
18230 const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
18231
18232 private:
18233 friend class Test;
18234 friend class internal::UnitTestImpl;
18235
18236
18237 std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
18238
18239
18240 const std::vector<TestInfo*>& test_info_list() const {
18241 return test_info_list_;
18242 }
18243
18244
18245
18246 TestInfo* GetMutableTestInfo(int i);
18247
18248
18249 void set_should_run(bool should) { should_run_ = should; }
18250
18251
18252
18253 void AddTestInfo(TestInfo * test_info);
18254
18255
18256 void ClearResult();
18257
18258
18259 static void ClearTestCaseResult(TestCase* test_case) {
18260 test_case->ClearResult();
18261 }
18262
18263
18264 void Run();
18265
18266
18267
18268 void RunSetUpTestCase() { (*set_up_tc_)(); }
18269
18270
18271
18272 void RunTearDownTestCase() { (*tear_down_tc_)(); }
18273
18274
18275 static bool TestPassed(const TestInfo* test_info) {
18276 return test_info->should_run() && test_info->result()->Passed();
18277 }
18278
18279
18280 static bool TestFailed(const TestInfo* test_info) {
18281 return test_info->should_run() && test_info->result()->Failed();
18282 }
18283
18284
18285
18286 static bool TestReportableDisabled(const TestInfo* test_info) {
18287 return test_info->is_reportable() && test_info->is_disabled_;
18288 }
18289
18290
18291 static bool TestDisabled(const TestInfo* test_info) {
18292 return test_info->is_disabled_;
18293 }
18294
18295
18296 static bool TestReportable(const TestInfo* test_info) {
18297 return test_info->is_reportable();
18298 }
18299
18300
18301 static bool ShouldRunTest(const TestInfo* test_info) {
18302 return test_info->should_run();
18303 }
18304
18305
18306 void ShuffleTests(internal::Random* random);
18307
18308
18309 void UnshuffleTests();
18310
18311
18312 std::string name_;
18313
18314
18315 const internal::scoped_ptr<const ::std::string> type_param_;
18316
18317
18318 std::vector<TestInfo*> test_info_list_;
18319
18320
18321
18322 std::vector<int> test_indices_;
18323
18324 Test::SetUpTestCaseFunc set_up_tc_;
18325
18326 Test::TearDownTestCaseFunc tear_down_tc_;
18327
18328 bool should_run_;
18329
18330 TimeInMillis elapsed_time_;
18331
18332
18333 TestResult ad_hoc_test_result_;
18334
18335
18336 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
18337 };
18338
18339
18340
18341
18342
18343
18344
18345
18346
18347
18348
18349
18350
18351
18352
18353 class Environment {
18354 public:
18355
18356 virtual ~Environment() {}
18357
18358
18359 virtual void SetUp() {}
18360
18361
18362 virtual void TearDown() {}
18363 private:
18364
18365
18366 struct Setup_should_be_spelled_SetUp {};
18367 virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
18368 };
18369
18370
18371
18372 class TestEventListener {
18373 public:
18374 virtual ~TestEventListener() {}
18375
18376
18377 virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
18378
18379
18380
18381
18382 virtual void OnTestIterationStart(const UnitTest& unit_test,
18383 int iteration) = 0;
18384
18385
18386 virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
18387
18388
18389 virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
18390
18391
18392 virtual void OnTestCaseStart(const TestCase& test_case) = 0;
18393
18394
18395 virtual void OnTestStart(const TestInfo& test_info) = 0;
18396
18397
18398 virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
18399
18400
18401 virtual void OnTestEnd(const TestInfo& test_info) = 0;
18402
18403
18404 virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
18405
18406
18407 virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
18408
18409
18410 virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
18411
18412
18413 virtual void OnTestIterationEnd(const UnitTest& unit_test,
18414 int iteration) = 0;
18415
18416
18417 virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
18418 };
18419
18420
18421
18422
18423
18424
18425 class EmptyTestEventListener : public TestEventListener {
18426 public:
18427 virtual void OnTestProgramStart(const UnitTest& ) {}
18428 virtual void OnTestIterationStart(const UnitTest& ,
18429 int ) {}
18430 virtual void OnEnvironmentsSetUpStart(const UnitTest& ) {}
18431 virtual void OnEnvironmentsSetUpEnd(const UnitTest& ) {}
18432 virtual void OnTestCaseStart(const TestCase& ) {}
18433 virtual void OnTestStart(const TestInfo& ) {}
18434 virtual void OnTestPartResult(const TestPartResult& ) {}
18435 virtual void OnTestEnd(const TestInfo& ) {}
18436 virtual void OnTestCaseEnd(const TestCase& ) {}
18437 virtual void OnEnvironmentsTearDownStart(const UnitTest& ) {}
18438 virtual void OnEnvironmentsTearDownEnd(const UnitTest& ) {}
18439 virtual void OnTestIterationEnd(const UnitTest& ,
18440 int ) {}
18441 virtual void OnTestProgramEnd(const UnitTest& ) {}
18442 };
18443
18444
18445 class GTEST_API_ TestEventListeners {
18446 public:
18447 TestEventListeners();
18448 ~TestEventListeners();
18449
18450
18451
18452
18453 void Append(TestEventListener* listener);
18454
18455
18456
18457
18458 TestEventListener* Release(TestEventListener* listener);
18459
18460
18461
18462
18463
18464
18465 TestEventListener* default_result_printer() const {
18466 return default_result_printer_;
18467 }
18468
18469
18470
18471
18472
18473
18474
18475
18476 TestEventListener* default_xml_generator() const {
18477 return default_xml_generator_;
18478 }
18479
18480 private:
18481 friend class TestCase;
18482 friend class TestInfo;
18483 friend class internal::DefaultGlobalTestPartResultReporter;
18484 friend class internal::NoExecDeathTest;
18485 friend class internal::TestEventListenersAccessor;
18486 friend class internal::UnitTestImpl;
18487
18488
18489
18490 TestEventListener* repeater();
18491
18492
18493
18494
18495
18496
18497 void SetDefaultResultPrinter(TestEventListener* listener);
18498
18499
18500
18501
18502
18503
18504 void SetDefaultXmlGenerator(TestEventListener* listener);
18505
18506
18507
18508 bool EventForwardingEnabled() const;
18509 void SuppressEventForwarding();
18510
18511
18512 internal::TestEventRepeater* repeater_;
18513
18514 TestEventListener* default_result_printer_;
18515
18516 TestEventListener* default_xml_generator_;
18517
18518
18519 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
18520 };
18521
18522
18523
18524
18525
18526
18527
18528
18529
18530
18531
18532 class GTEST_API_ UnitTest {
18533 public:
18534
18535
18536
18537 static UnitTest* GetInstance();
18538
18539
18540
18541
18542
18543
18544
18545 int Run() GTEST_MUST_USE_RESULT_;
18546
18547
18548
18549 const char* original_working_dir() const;
18550
18551
18552
18553 const TestCase* current_test_case() const
18554 GTEST_LOCK_EXCLUDED_(mutex_);
18555
18556
18557
18558 const TestInfo* current_test_info() const
18559 GTEST_LOCK_EXCLUDED_(mutex_);
18560
18561
18562 int random_seed() const;
18563
18564 #if GTEST_HAS_PARAM_TEST
18565
18566
18567
18568
18569 internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
18570 GTEST_LOCK_EXCLUDED_(mutex_);
18571 #endif // GTEST_HAS_PARAM_TEST
18572
18573
18574 int successful_test_case_count() const;
18575
18576
18577 int failed_test_case_count() const;
18578
18579
18580 int total_test_case_count() const;
18581
18582
18583
18584 int test_case_to_run_count() const;
18585
18586
18587 int successful_test_count() const;
18588
18589
18590 int failed_test_count() const;
18591
18592
18593 int reportable_disabled_test_count() const;
18594
18595
18596 int disabled_test_count() const;
18597
18598
18599 int reportable_test_count() const;
18600
18601
18602 int total_test_count() const;
18603
18604
18605 int test_to_run_count() const;
18606
18607
18608
18609 TimeInMillis start_timestamp() const;
18610
18611
18612 TimeInMillis elapsed_time() const;
18613
18614
18615 bool Passed() const;
18616
18617
18618
18619 bool Failed() const;
18620
18621
18622
18623 const TestCase* GetTestCase(int i) const;
18624
18625
18626
18627 const TestResult& ad_hoc_test_result() const;
18628
18629
18630
18631 TestEventListeners& listeners();
18632
18633 private:
18634
18635
18636
18637
18638
18639
18640
18641
18642
18643 Environment* AddEnvironment(Environment* env);
18644
18645
18646
18647
18648
18649 void AddTestPartResult(TestPartResult::Type result_type,
18650 const char* file_name,
18651 int line_number,
18652 const std::string& message,
18653 const std::string& os_stack_trace)
18654 GTEST_LOCK_EXCLUDED_(mutex_);
18655
18656
18657
18658
18659
18660
18661 void RecordProperty(const std::string& key, const std::string& value);
18662
18663
18664
18665 TestCase* GetMutableTestCase(int i);
18666
18667
18668 internal::UnitTestImpl* impl() { return impl_; }
18669 const internal::UnitTestImpl* impl() const { return impl_; }
18670
18671
18672
18673 friend class Test;
18674 friend class internal::AssertHelper;
18675 friend class internal::ScopedTrace;
18676 friend class internal::StreamingListenerTest;
18677 friend class internal::UnitTestRecordPropertyTestHelper;
18678 friend Environment* AddGlobalTestEnvironment(Environment* env);
18679 friend internal::UnitTestImpl* internal::GetUnitTestImpl();
18680 friend void internal::ReportFailureInUnknownLocation(
18681 TestPartResult::Type result_type,
18682 const std::string& message);
18683
18684
18685 UnitTest();
18686
18687
18688 virtual ~UnitTest();
18689
18690
18691
18692 void PushGTestTrace(const internal::TraceInfo& trace)
18693 GTEST_LOCK_EXCLUDED_(mutex_);
18694
18695
18696 void PopGTestTrace()
18697 GTEST_LOCK_EXCLUDED_(mutex_);
18698
18699
18700
18701 mutable internal::Mutex mutex_;
18702
18703
18704
18705
18706
18707 internal::UnitTestImpl* impl_;
18708
18709
18710 GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
18711 };
18712
18713
18714
18715
18716
18717
18718
18719
18720
18721
18722
18723
18724
18725
18726
18727
18728
18729
18730
18731 inline Environment* AddGlobalTestEnvironment(Environment* env) {
18732 return UnitTest::GetInstance()->AddEnvironment(env);
18733 }
18734
18735
18736
18737
18738
18739
18740
18741
18742
18743
18744 GTEST_API_ void InitGoogleTest(int* argc, char** argv);
18745
18746
18747
18748 GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
18749
18750 namespace internal {
18751
18752
18753
18754
18755
18756
18757
18758
18759
18760
18761
18762
18763
18764
18765
18766
18767 template <typename ToPrint, typename OtherOperand>
18768 class FormatForComparison {
18769 public:
18770 static ::std::string Format(const ToPrint& value) {
18771 return ::testing::PrintToString(value);
18772 }
18773 };
18774
18775
18776 template <typename ToPrint, size_t N, typename OtherOperand>
18777 class FormatForComparison<ToPrint[N], OtherOperand> {
18778 public:
18779 static ::std::string Format(const ToPrint* value) {
18780 return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
18781 }
18782 };
18783
18784
18785
18786
18787 #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \
18788 template <typename OtherOperand> \
18789 class FormatForComparison<CharType*, OtherOperand> { \
18790 public: \
18791 static ::std::string Format(CharType* value) { \
18792 return ::testing::PrintToString(static_cast<const void*>(value)); \
18793 } \
18794 }
18795
18796 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
18797 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
18798 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
18799 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
18800
18801 #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
18802
18803
18804
18805
18806 #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
18807 template <> \
18808 class FormatForComparison<CharType*, OtherStringType> { \
18809 public: \
18810 static ::std::string Format(CharType* value) { \
18811 return ::testing::PrintToString(value); \
18812 } \
18813 }
18814
18815 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
18816 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
18817
18818 #if GTEST_HAS_GLOBAL_STRING
18819 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
18820 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
18821 #endif
18822
18823 #if GTEST_HAS_GLOBAL_WSTRING
18824 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
18825 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
18826 #endif
18827
18828 #if GTEST_HAS_STD_WSTRING
18829 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
18830 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
18831 #endif
18832
18833 #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
18834
18835
18836
18837
18838
18839
18840
18841
18842
18843 template <typename T1, typename T2>
18844 std::string FormatForComparisonFailureMessage(
18845 const T1& value, const T2& ) {
18846 return FormatForComparison<T1, T2>::Format(value);
18847 }
18848
18849
18850 template <typename T1, typename T2>
18851 AssertionResult CmpHelperEQ(const char* expected_expression,
18852 const char* actual_expression,
18853 const T1& expected,
18854 const T2& actual) {
18855 #ifdef _MSC_VER
18856 # pragma warning(push) // Saves the current warning state.
18857 # pragma warning(disable:4389) // Temporarily disables warning on
18858
18859 #endif
18860
18861 if (expected == actual) {
18862 return AssertionSuccess();
18863 }
18864
18865 #ifdef _MSC_VER
18866 # pragma warning(pop) // Restores the warning state.
18867 #endif
18868
18869 return EqFailure(expected_expression,
18870 actual_expression,
18871 FormatForComparisonFailureMessage(expected, actual),
18872 FormatForComparisonFailureMessage(actual, expected),
18873 false);
18874 }
18875
18876
18877
18878
18879 GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
18880 const char* actual_expression,
18881 BiggestInt expected,
18882 BiggestInt actual);
18883
18884
18885
18886
18887
18888 template <bool lhs_is_null_literal>
18889 class EqHelper {
18890 public:
18891
18892 template <typename T1, typename T2>
18893 static AssertionResult Compare(const char* expected_expression,
18894 const char* actual_expression,
18895 const T1& expected,
18896 const T2& actual) {
18897 return CmpHelperEQ(expected_expression, actual_expression, expected,
18898 actual);
18899 }
18900
18901
18902
18903
18904
18905
18906
18907 static AssertionResult Compare(const char* expected_expression,
18908 const char* actual_expression,
18909 BiggestInt expected,
18910 BiggestInt actual) {
18911 return CmpHelperEQ(expected_expression, actual_expression, expected,
18912 actual);
18913 }
18914 };
18915
18916
18917
18918 template <>
18919 class EqHelper<true> {
18920 public:
18921
18922
18923
18924
18925 template <typename T1, typename T2>
18926 static AssertionResult Compare(
18927 const char* expected_expression,
18928 const char* actual_expression,
18929 const T1& expected,
18930 const T2& actual,
18931
18932
18933
18934
18935
18936 typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
18937 return CmpHelperEQ(expected_expression, actual_expression, expected,
18938 actual);
18939 }
18940
18941
18942
18943 template <typename T>
18944 static AssertionResult Compare(
18945 const char* expected_expression,
18946 const char* actual_expression,
18947
18948
18949
18950
18951
18952
18953 Secret* ,
18954 T* actual) {
18955
18956 return CmpHelperEQ(expected_expression, actual_expression,
18957 static_cast<T*>(NULL), actual);
18958 }
18959 };
18960
18961
18962
18963
18964
18965
18966
18967
18968
18969
18970
18971 #define GTEST_IMPL_CMP_HELPER_(op_name, op)\
18972 template <typename T1, typename T2>\
18973 AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
18974 const T1& val1, const T2& val2) {\
18975 if (val1 op val2) {\
18976 return AssertionSuccess();\
18977 } else {\
18978 return AssertionFailure() \
18979 << "Expected: (" << expr1 << ") " #op " (" << expr2\
18980 << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
18981 << " vs " << FormatForComparisonFailureMessage(val2, val1);\
18982 }\
18983 }\
18984 GTEST_API_ AssertionResult CmpHelper##op_name(\
18985 const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
18986
18987
18988
18989
18990 GTEST_IMPL_CMP_HELPER_(NE, !=);
18991
18992 GTEST_IMPL_CMP_HELPER_(LE, <=);
18993
18994 GTEST_IMPL_CMP_HELPER_(LT, <);
18995
18996 GTEST_IMPL_CMP_HELPER_(GE, >=);
18997
18998 GTEST_IMPL_CMP_HELPER_(GT, >);
18999
19000 #undef GTEST_IMPL_CMP_HELPER_
19001
19002
19003
19004
19005 GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
19006 const char* actual_expression,
19007 const char* expected,
19008 const char* actual);
19009
19010
19011
19012
19013 GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
19014 const char* actual_expression,
19015 const char* expected,
19016 const char* actual);
19017
19018
19019
19020
19021 GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
19022 const char* s2_expression,
19023 const char* s1,
19024 const char* s2);
19025
19026
19027
19028
19029 GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
19030 const char* s2_expression,
19031 const char* s1,
19032 const char* s2);
19033
19034
19035
19036
19037
19038 GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
19039 const char* actual_expression,
19040 const wchar_t* expected,
19041 const wchar_t* actual);
19042
19043
19044
19045
19046 GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
19047 const char* s2_expression,
19048 const wchar_t* s1,
19049 const wchar_t* s2);
19050
19051 }
19052
19053
19054
19055
19056
19057
19058
19059
19060
19061 GTEST_API_ AssertionResult IsSubstring(
19062 const char* needle_expr, const char* haystack_expr,
19063 const char* needle, const char* haystack);
19064 GTEST_API_ AssertionResult IsSubstring(
19065 const char* needle_expr, const char* haystack_expr,
19066 const wchar_t* needle, const wchar_t* haystack);
19067 GTEST_API_ AssertionResult IsNotSubstring(
19068 const char* needle_expr, const char* haystack_expr,
19069 const char* needle, const char* haystack);
19070 GTEST_API_ AssertionResult IsNotSubstring(
19071 const char* needle_expr, const char* haystack_expr,
19072 const wchar_t* needle, const wchar_t* haystack);
19073 GTEST_API_ AssertionResult IsSubstring(
19074 const char* needle_expr, const char* haystack_expr,
19075 const ::std::string& needle, const ::std::string& haystack);
19076 GTEST_API_ AssertionResult IsNotSubstring(
19077 const char* needle_expr, const char* haystack_expr,
19078 const ::std::string& needle, const ::std::string& haystack);
19079
19080 #if GTEST_HAS_STD_WSTRING
19081 GTEST_API_ AssertionResult IsSubstring(
19082 const char* needle_expr, const char* haystack_expr,
19083 const ::std::wstring& needle, const ::std::wstring& haystack);
19084 GTEST_API_ AssertionResult IsNotSubstring(
19085 const char* needle_expr, const char* haystack_expr,
19086 const ::std::wstring& needle, const ::std::wstring& haystack);
19087 #endif // GTEST_HAS_STD_WSTRING
19088
19089 namespace internal {
19090
19091
19092
19093
19094
19095
19096
19097
19098 template <typename RawType>
19099 AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
19100 const char* actual_expression,
19101 RawType expected,
19102 RawType actual) {
19103 const FloatingPoint<RawType> lhs(expected), rhs(actual);
19104
19105 if (lhs.AlmostEquals(rhs)) {
19106 return AssertionSuccess();
19107 }
19108
19109 ::std::stringstream expected_ss;
19110 expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
19111 << expected;
19112
19113 ::std::stringstream actual_ss;
19114 actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
19115 << actual;
19116
19117 return EqFailure(expected_expression,
19118 actual_expression,
19119 StringStreamToString(&expected_ss),
19120 StringStreamToString(&actual_ss),
19121 false);
19122 }
19123
19124
19125
19126
19127 GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
19128 const char* expr2,
19129 const char* abs_error_expr,
19130 double val1,
19131 double val2,
19132 double abs_error);
19133
19134
19135
19136 class GTEST_API_ AssertHelper {
19137 public:
19138
19139 AssertHelper(TestPartResult::Type type,
19140 const char* file,
19141 int line,
19142 const char* message);
19143 ~AssertHelper();
19144
19145
19146
19147 void operator=(const Message& message) const;
19148
19149 private:
19150
19151
19152
19153
19154 struct AssertHelperData {
19155 AssertHelperData(TestPartResult::Type t,
19156 const char* srcfile,
19157 int line_num,
19158 const char* msg)
19159 : type(t), file(srcfile), line(line_num), message(msg) { }
19160
19161 TestPartResult::Type const type;
19162 const char* const file;
19163 int const line;
19164 std::string const message;
19165
19166 private:
19167 GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
19168 };
19169
19170 AssertHelperData* const data_;
19171
19172 GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
19173 };
19174
19175 }
19176
19177 #if GTEST_HAS_PARAM_TEST
19178
19179
19180
19181
19182
19183
19184
19185
19186
19187
19188
19189
19190
19191
19192
19193
19194
19195
19196
19197
19198
19199
19200
19201
19202
19203
19204
19205
19206
19207
19208
19209
19210
19211
19212 template <typename T>
19213 class WithParamInterface {
19214 public:
19215 typedef T ParamType;
19216 virtual ~WithParamInterface() {}
19217
19218
19219
19220
19221
19222
19223 const ParamType& GetParam() const {
19224 GTEST_CHECK_(parameter_ != NULL)
19225 << "GetParam() can only be called inside a value-parameterized test "
19226 << "-- did you intend to write TEST_P instead of TEST_F?";
19227 return *parameter_;
19228 }
19229
19230 private:
19231
19232
19233 static void SetParam(const ParamType* parameter) {
19234 parameter_ = parameter;
19235 }
19236
19237
19238 static const ParamType* parameter_;
19239
19240
19241 template <class TestClass> friend class internal::ParameterizedTestFactory;
19242 };
19243
19244 template <typename T>
19245 const T* WithParamInterface<T>::parameter_ = NULL;
19246
19247
19248
19249
19250 template <typename T>
19251 class TestWithParam : public Test, public WithParamInterface<T> {
19252 };
19253
19254 #endif // GTEST_HAS_PARAM_TEST
19255
19256
19257
19258
19259
19260
19261
19262
19263
19264
19265
19266
19267
19268
19269
19270
19271
19272
19273
19274
19275
19276 #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
19277
19278
19279
19280 #define ADD_FAILURE_AT(file, line) \
19281 GTEST_MESSAGE_AT_(file, line, "Failed", \
19282 ::testing::TestPartResult::kNonFatalFailure)
19283
19284
19285 #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
19286
19287
19288
19289 #if !GTEST_DONT_DEFINE_FAIL
19290 # define FAIL() GTEST_FAIL()
19291 #endif
19292
19293
19294 #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
19295
19296
19297
19298 #if !GTEST_DONT_DEFINE_SUCCEED
19299 # define SUCCEED() GTEST_SUCCEED()
19300 #endif
19301
19302
19303
19304
19305
19306
19307
19308
19309
19310
19311 #define EXPECT_THROW(statement, expected_exception) \
19312 GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
19313 #define EXPECT_NO_THROW(statement) \
19314 GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
19315 #define EXPECT_ANY_THROW(statement) \
19316 GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
19317 #define ASSERT_THROW(statement, expected_exception) \
19318 GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
19319 #define ASSERT_NO_THROW(statement) \
19320 GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
19321 #define ASSERT_ANY_THROW(statement) \
19322 GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
19323
19324
19325
19326
19327 #define EXPECT_TRUE(condition) \
19328 GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
19329 GTEST_NONFATAL_FAILURE_)
19330 #define EXPECT_FALSE(condition) \
19331 GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
19332 GTEST_NONFATAL_FAILURE_)
19333 #define ASSERT_TRUE(condition) \
19334 GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
19335 GTEST_FATAL_FAILURE_)
19336 #define ASSERT_FALSE(condition) \
19337 GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
19338 GTEST_FATAL_FAILURE_)
19339
19340
19341
19342
19343
19344
19345
19346
19347
19348
19349
19350
19351
19352
19353
19354
19355
19356
19357
19358
19359
19360
19361
19362
19363
19364
19365
19366
19367
19368
19369
19370
19371
19372
19373
19374
19375
19376 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19377 #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19378
19379
19380 #ifndef GTEST_INCLUDE_GTEST_GTEST_H_
19381 # error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
19382 #endif // GTEST_INCLUDE_GTEST_GTEST_H_
19383
19384
19385
19386
19387
19388
19389
19390
19391
19392
19393
19394
19395
19396
19397
19398
19399
19400
19401
19402
19403
19404
19405
19406
19407
19408
19409
19410
19411
19412
19413
19414
19415
19416 #define GTEST_ASSERT_(expression, on_failure) \
19417 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
19418 if (const ::testing::AssertionResult gtest_ar = (expression)) \
19419 ; \
19420 else \
19421 on_failure(gtest_ar.failure_message())
19422
19423
19424
19425
19426 template <typename Pred,
19427 typename T1>
19428 AssertionResult AssertPred1Helper(const char* pred_text,
19429 const char* e1,
19430 Pred pred,
19431 const T1& v1) {
19432 if (pred(v1)) return AssertionSuccess();
19433
19434 return AssertionFailure() << pred_text << "("
19435 << e1 << ") evaluates to false, where"
19436 << "\n" << e1 << " evaluates to " << v1;
19437 }
19438
19439
19440
19441 #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
19442 GTEST_ASSERT_(pred_format(#v1, v1), \
19443 on_failure)
19444
19445
19446
19447 #define GTEST_PRED1_(pred, v1, on_failure)\
19448 GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
19449 #v1, \
19450 pred, \
19451 v1), on_failure)
19452
19453
19454 #define EXPECT_PRED_FORMAT1(pred_format, v1) \
19455 GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
19456 #define EXPECT_PRED1(pred, v1) \
19457 GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
19458 #define ASSERT_PRED_FORMAT1(pred_format, v1) \
19459 GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
19460 #define ASSERT_PRED1(pred, v1) \
19461 GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
19462
19463
19464
19465
19466
19467 template <typename Pred,
19468 typename T1,
19469 typename T2>
19470 AssertionResult AssertPred2Helper(const char* pred_text,
19471 const char* e1,
19472 const char* e2,
19473 Pred pred,
19474 const T1& v1,
19475 const T2& v2) {
19476 if (pred(v1, v2)) return AssertionSuccess();
19477
19478 return AssertionFailure() << pred_text << "("
19479 << e1 << ", "
19480 << e2 << ") evaluates to false, where"
19481 << "\n" << e1 << " evaluates to " << v1
19482 << "\n" << e2 << " evaluates to " << v2;
19483 }
19484
19485
19486
19487 #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
19488 GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
19489 on_failure)
19490
19491
19492
19493 #define GTEST_PRED2_(pred, v1, v2, on_failure)\
19494 GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
19495 #v1, \
19496 #v2, \
19497 pred, \
19498 v1, \
19499 v2), on_failure)
19500
19501
19502 #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
19503 GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
19504 #define EXPECT_PRED2(pred, v1, v2) \
19505 GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
19506 #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
19507 GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
19508 #define ASSERT_PRED2(pred, v1, v2) \
19509 GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
19510
19511
19512
19513
19514
19515 template <typename Pred,
19516 typename T1,
19517 typename T2,
19518 typename T3>
19519 AssertionResult AssertPred3Helper(const char* pred_text,
19520 const char* e1,
19521 const char* e2,
19522 const char* e3,
19523 Pred pred,
19524 const T1& v1,
19525 const T2& v2,
19526 const T3& v3) {
19527 if (pred(v1, v2, v3)) return AssertionSuccess();
19528
19529 return AssertionFailure() << pred_text << "("
19530 << e1 << ", "
19531 << e2 << ", "
19532 << e3 << ") evaluates to false, where"
19533 << "\n" << e1 << " evaluates to " << v1
19534 << "\n" << e2 << " evaluates to " << v2
19535 << "\n" << e3 << " evaluates to " << v3;
19536 }
19537
19538
19539
19540 #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
19541 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
19542 on_failure)
19543
19544
19545
19546 #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
19547 GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
19548 #v1, \
19549 #v2, \
19550 #v3, \
19551 pred, \
19552 v1, \
19553 v2, \
19554 v3), on_failure)
19555
19556
19557 #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
19558 GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
19559 #define EXPECT_PRED3(pred, v1, v2, v3) \
19560 GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
19561 #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
19562 GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
19563 #define ASSERT_PRED3(pred, v1, v2, v3) \
19564 GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
19565
19566
19567
19568
19569
19570 template <typename Pred,
19571 typename T1,
19572 typename T2,
19573 typename T3,
19574 typename T4>
19575 AssertionResult AssertPred4Helper(const char* pred_text,
19576 const char* e1,
19577 const char* e2,
19578 const char* e3,
19579 const char* e4,
19580 Pred pred,
19581 const T1& v1,
19582 const T2& v2,
19583 const T3& v3,
19584 const T4& v4) {
19585 if (pred(v1, v2, v3, v4)) return AssertionSuccess();
19586
19587 return AssertionFailure() << pred_text << "("
19588 << e1 << ", "
19589 << e2 << ", "
19590 << e3 << ", "
19591 << e4 << ") evaluates to false, where"
19592 << "\n" << e1 << " evaluates to " << v1
19593 << "\n" << e2 << " evaluates to " << v2
19594 << "\n" << e3 << " evaluates to " << v3
19595 << "\n" << e4 << " evaluates to " << v4;
19596 }
19597
19598
19599
19600 #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
19601 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
19602 on_failure)
19603
19604
19605
19606 #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
19607 GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
19608 #v1, \
19609 #v2, \
19610 #v3, \
19611 #v4, \
19612 pred, \
19613 v1, \
19614 v2, \
19615 v3, \
19616 v4), on_failure)
19617
19618
19619 #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
19620 GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
19621 #define EXPECT_PRED4(pred, v1, v2, v3, v4) \
19622 GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
19623 #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
19624 GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
19625 #define ASSERT_PRED4(pred, v1, v2, v3, v4) \
19626 GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
19627
19628
19629
19630
19631
19632 template <typename Pred,
19633 typename T1,
19634 typename T2,
19635 typename T3,
19636 typename T4,
19637 typename T5>
19638 AssertionResult AssertPred5Helper(const char* pred_text,
19639 const char* e1,
19640 const char* e2,
19641 const char* e3,
19642 const char* e4,
19643 const char* e5,
19644 Pred pred,
19645 const T1& v1,
19646 const T2& v2,
19647 const T3& v3,
19648 const T4& v4,
19649 const T5& v5) {
19650 if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
19651
19652 return AssertionFailure() << pred_text << "("
19653 << e1 << ", "
19654 << e2 << ", "
19655 << e3 << ", "
19656 << e4 << ", "
19657 << e5 << ") evaluates to false, where"
19658 << "\n" << e1 << " evaluates to " << v1
19659 << "\n" << e2 << " evaluates to " << v2
19660 << "\n" << e3 << " evaluates to " << v3
19661 << "\n" << e4 << " evaluates to " << v4
19662 << "\n" << e5 << " evaluates to " << v5;
19663 }
19664
19665
19666
19667 #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
19668 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
19669 on_failure)
19670
19671
19672
19673 #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
19674 GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
19675 #v1, \
19676 #v2, \
19677 #v3, \
19678 #v4, \
19679 #v5, \
19680 pred, \
19681 v1, \
19682 v2, \
19683 v3, \
19684 v4, \
19685 v5), on_failure)
19686
19687
19688 #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
19689 GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
19690 #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
19691 GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
19692 #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
19693 GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
19694 #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
19695 GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
19696
19697
19698
19699 #endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19700
19701
19702
19703
19704
19705
19706
19707
19708
19709
19710
19711
19712
19713
19714
19715
19716
19717
19718
19719
19720
19721
19722
19723
19724
19725
19726
19727
19728
19729
19730
19731
19732
19733
19734
19735
19736
19737
19738
19739
19740
19741
19742
19743
19744
19745
19746
19747 #define EXPECT_EQ(expected, actual) \
19748 EXPECT_PRED_FORMAT2(::testing::internal:: \
19749 EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
19750 expected, actual)
19751 #define EXPECT_NE(expected, actual) \
19752 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
19753 #define EXPECT_LE(val1, val2) \
19754 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
19755 #define EXPECT_LT(val1, val2) \
19756 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
19757 #define EXPECT_GE(val1, val2) \
19758 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
19759 #define EXPECT_GT(val1, val2) \
19760 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
19761
19762 #define GTEST_ASSERT_EQ(expected, actual) \
19763 ASSERT_PRED_FORMAT2(::testing::internal:: \
19764 EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
19765 expected, actual)
19766 #define GTEST_ASSERT_NE(val1, val2) \
19767 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
19768 #define GTEST_ASSERT_LE(val1, val2) \
19769 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
19770 #define GTEST_ASSERT_LT(val1, val2) \
19771 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
19772 #define GTEST_ASSERT_GE(val1, val2) \
19773 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
19774 #define GTEST_ASSERT_GT(val1, val2) \
19775 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
19776
19777
19778
19779
19780 #if !GTEST_DONT_DEFINE_ASSERT_EQ
19781 # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
19782 #endif
19783
19784 #if !GTEST_DONT_DEFINE_ASSERT_NE
19785 # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
19786 #endif
19787
19788 #if !GTEST_DONT_DEFINE_ASSERT_LE
19789 # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
19790 #endif
19791
19792 #if !GTEST_DONT_DEFINE_ASSERT_LT
19793 # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
19794 #endif
19795
19796 #if !GTEST_DONT_DEFINE_ASSERT_GE
19797 # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
19798 #endif
19799
19800 #if !GTEST_DONT_DEFINE_ASSERT_GT
19801 # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
19802 #endif
19803
19804
19805
19806
19807
19808
19809
19810
19811
19812
19813
19814
19815
19816
19817
19818
19819
19820 #define EXPECT_STREQ(expected, actual) \
19821 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19822 #define EXPECT_STRNE(s1, s2) \
19823 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19824 #define EXPECT_STRCASEEQ(expected, actual) \
19825 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19826 #define EXPECT_STRCASENE(s1, s2)\
19827 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19828
19829 #define ASSERT_STREQ(expected, actual) \
19830 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19831 #define ASSERT_STRNE(s1, s2) \
19832 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19833 #define ASSERT_STRCASEEQ(expected, actual) \
19834 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19835 #define ASSERT_STRCASENE(s1, s2)\
19836 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849
19850
19851
19852 #define EXPECT_FLOAT_EQ(expected, actual)\
19853 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19854 expected, actual)
19855
19856 #define EXPECT_DOUBLE_EQ(expected, actual)\
19857 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19858 expected, actual)
19859
19860 #define ASSERT_FLOAT_EQ(expected, actual)\
19861 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19862 expected, actual)
19863
19864 #define ASSERT_DOUBLE_EQ(expected, actual)\
19865 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19866 expected, actual)
19867
19868 #define EXPECT_NEAR(val1, val2, abs_error)\
19869 EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19870 val1, val2, abs_error)
19871
19872 #define ASSERT_NEAR(val1, val2, abs_error)\
19873 ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19874 val1, val2, abs_error)
19875
19876
19877
19878
19879
19880
19881
19882
19883 GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
19884 float val1, float val2);
19885 GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
19886 double val1, double val2);
19887
19888
19889 #if GTEST_OS_WINDOWS
19890
19891
19892
19893
19894
19895
19896
19897
19898
19899
19900 # define EXPECT_HRESULT_SUCCEEDED(expr) \
19901 EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
19902
19903 # define ASSERT_HRESULT_SUCCEEDED(expr) \
19904 ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
19905
19906 # define EXPECT_HRESULT_FAILED(expr) \
19907 EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
19908
19909 # define ASSERT_HRESULT_FAILED(expr) \
19910 ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
19911
19912 #endif // GTEST_OS_WINDOWS
19913
19914
19915
19916
19917
19918
19919
19920
19921
19922
19923
19924 #define ASSERT_NO_FATAL_FAILURE(statement) \
19925 GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
19926 #define EXPECT_NO_FATAL_FAILURE(statement) \
19927 GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
19928
19929
19930
19931
19932
19933
19934
19935
19936
19937
19938
19939
19940 #define SCOPED_TRACE(message) \
19941 ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
19942 __FILE__, __LINE__, ::testing::Message() << (message))
19943
19944
19945
19946
19947
19948
19949
19950
19951
19952
19953
19954
19955
19956
19957
19958
19959
19960
19961
19962
19963
19964
19965
19966
19967
19968
19969
19970
19971
19972
19973
19974 template <typename T1, typename T2>
19975 bool StaticAssertTypeEq() {
19976 (void)internal::StaticAssertTypeEqHelper<T1, T2>();
19977 return true;
19978 }
19979
19980
19981
19982
19983
19984
19985
19986
19987
19988
19989
19990
19991
19992
19993
19994
19995
19996
19997
19998
19999
20000
20001
20002
20003
20004
20005 #define GTEST_TEST(test_case_name, test_name)\
20006 GTEST_TEST_(test_case_name, test_name, \
20007 ::testing::Test, ::testing::internal::GetTestTypeId())
20008
20009
20010
20011 #if !GTEST_DONT_DEFINE_TEST
20012 # define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
20013 #endif
20014
20015
20016
20017
20018
20019
20020
20021
20022
20023
20024
20025
20026
20027
20028
20029
20030
20031
20032
20033
20034
20035
20036
20037
20038
20039
20040
20041 #define TEST_F(test_fixture, test_name)\
20042 GTEST_TEST_(test_fixture, test_name, test_fixture, \
20043 ::testing::internal::GetTypeId<test_fixture>())
20044
20045 }
20046
20047
20048
20049
20050
20051
20052
20053
20054
20055 int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
20056
20057 inline int RUN_ALL_TESTS() {
20058 return ::testing::UnitTest::GetInstance()->Run();
20059 }
20060
20061 #endif // GTEST_INCLUDE_GTEST_GTEST_H_