1 // Copyright 2005, Google Inc.
2 // All rights reserved.
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 // The Google C++ Testing and Mocking Framework (Google Test)
33 // This header file defines the public API for Google Test. It should be
34 // included by any test program that uses Google Test.
36 // IMPORTANT NOTE: Due to limitation of the C++ language, we have to
37 // leave some internal implementation details in this header file.
38 // They are clearly marked by comments like this:
40 // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
42 // Such code is NOT meant to be used by a user directly, and is subject
43 // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
46 // Acknowledgment: Google Test borrowed the idea of automatic test
47 // registration from Barthelemy Dagenais' (barthelemy@prologique.com)
48 // easyUnit framework.
50 // GOOGLETEST_CM0001 DO NOT DELETE
52 #ifndef GTEST_INCLUDE_GTEST_GTEST_H_
53 #define GTEST_INCLUDE_GTEST_GTEST_H_
59 // Copyright 2005, Google Inc.
60 // All rights reserved.
62 // Redistribution and use in source and binary forms, with or without
63 // modification, are permitted provided that the following conditions are
66 // * Redistributions of source code must retain the above copyright
67 // notice, this list of conditions and the following disclaimer.
68 // * Redistributions in binary form must reproduce the above
69 // copyright notice, this list of conditions and the following disclaimer
70 // in the documentation and/or other materials provided with the
72 // * Neither the name of Google Inc. nor the names of its
73 // contributors may be used to endorse or promote products derived from
74 // this software without specific prior written permission.
76 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
77 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
78 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
79 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
80 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
81 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
82 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
83 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
84 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
85 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
86 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
88 // The Google C++ Testing and Mocking Framework (Google Test)
90 // This header file declares functions and macros used internally by
91 // Google Test. They are subject to change without notice.
93 // GOOGLETEST_CM0001 DO NOT DELETE
95 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
96 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
98 // Copyright 2005, Google Inc.
99 // All rights reserved.
101 // Redistribution and use in source and binary forms, with or without
102 // modification, are permitted provided that the following conditions are
105 // * Redistributions of source code must retain the above copyright
106 // notice, this list of conditions and the following disclaimer.
107 // * Redistributions in binary form must reproduce the above
108 // copyright notice, this list of conditions and the following disclaimer
109 // in the documentation and/or other materials provided with the
111 // * Neither the name of Google Inc. nor the names of its
112 // contributors may be used to endorse or promote products derived from
113 // this software without specific prior written permission.
115 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
116 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
117 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
118 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
119 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
120 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
121 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
122 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
123 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
124 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
125 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
127 // Low-level types and utilities for porting Google Test to various
128 // platforms. All macros ending with _ and symbols defined in an
129 // internal namespace are subject to change without notice. Code
130 // outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't
131 // end with _ are part of Google Test's public API and can be used by
132 // code outside Google Test.
134 // This file is fundamental to Google Test. All other Google Test source
135 // files are expected to #include this. Therefore, it cannot #include
136 // any other Google Test header.
138 // GOOGLETEST_CM0001 DO NOT DELETE
140 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
141 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
143 // Environment-describing macros
144 // -----------------------------
146 // Google Test can be used in many different environments. Macros in
147 // this section tell Google Test what kind of environment it is being
148 // used in, such that Google Test can provide environment-specific
149 // features and implementations.
151 // Google Test tries to automatically detect the properties of its
152 // environment, so users usually don't need to worry about these
153 // macros. However, the automatic detection is not perfect.
154 // Sometimes it's necessary for a user to define some of the following
155 // macros in the build script to override Google Test's decisions.
157 // If the user doesn't define a macro in the list, Google Test will
158 // provide a default definition. After this header is #included, all
159 // macros in this list will be defined to either 1 or 0.
161 // Notes to maintainers:
162 // - Each macro here is a user-tweakable knob; do not grow the list
164 // - Use #if to key off these macros. Don't use #ifdef or "#if
165 // defined(...)", which will not work as these macros are ALWAYS
168 // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
169 // is/isn't available.
170 // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
172 // GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
173 // is/isn't available
174 // GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::wstring
175 // is/isn't available
176 // GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
177 // expressions are/aren't available.
178 // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
179 // is/isn't available.
180 // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
182 // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
183 // std::wstring does/doesn't work (Google Test can
184 // be used where std::wstring is unavailable).
185 // GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
186 // is/isn't available.
187 // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
188 // compiler supports Microsoft's "Structured
189 // Exception Handling".
190 // GTEST_HAS_STREAM_REDIRECTION
191 // - Define it to 1/0 to indicate whether the
192 // platform supports I/O stream redirection using
194 // GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
195 // Test's own tr1 tuple implementation should be
196 // used. Unused when the user sets
197 // GTEST_HAS_TR1_TUPLE to 0.
198 // GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test
199 // is building in C++11/C++98 mode.
200 // GTEST_LINKED_AS_SHARED_LIBRARY
201 // - Define to 1 when compiling tests that use
202 // Google Test as a shared library (known as
204 // GTEST_CREATE_SHARED_LIBRARY
205 // - Define to 1 when compiling Google Test itself
206 // as a shared library.
207 // GTEST_DEFAULT_DEATH_TEST_STYLE
208 // - The default value of --gtest_death_test_style.
209 // The legacy default has been "fast" in the open
210 // source version since 2008. The recommended value
211 // is "threadsafe", and can be set in
212 // custom/gtest-port.h.
214 // Platform-indicating macros
215 // --------------------------
217 // Macros indicating the platform on which Google Test is being used
218 // (a macro is defined to 1 if compiled on the given platform;
219 // otherwise UNDEFINED -- it's never defined to 0.). Google Test
220 // defines these macros automatically. Code outside Google Test MUST
223 // GTEST_OS_AIX - IBM AIX
224 // GTEST_OS_CYGWIN - Cygwin
225 // GTEST_OS_FREEBSD - FreeBSD
226 // GTEST_OS_FUCHSIA - Fuchsia
227 // GTEST_OS_HPUX - HP-UX
228 // GTEST_OS_LINUX - Linux
229 // GTEST_OS_LINUX_ANDROID - Google Android
230 // GTEST_OS_MAC - Mac OS X
231 // GTEST_OS_IOS - iOS
232 // GTEST_OS_NACL - Google Native Client (NaCl)
233 // GTEST_OS_NETBSD - NetBSD
234 // GTEST_OS_OPENBSD - OpenBSD
235 // GTEST_OS_QNX - QNX
236 // GTEST_OS_SOLARIS - Sun Solaris
237 // GTEST_OS_SYMBIAN - Symbian
238 // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
239 // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
240 // GTEST_OS_WINDOWS_MINGW - MinGW
241 // GTEST_OS_WINDOWS_MOBILE - Windows Mobile
242 // GTEST_OS_WINDOWS_PHONE - Windows Phone
243 // GTEST_OS_WINDOWS_RT - Windows Store App/WinRT
244 // GTEST_OS_ZOS - z/OS
246 // Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
247 // most stable support. Since core members of the Google Test project
248 // don't have access to other platforms, support for them may be less
249 // stable. If you notice any problems on your platform, please notify
250 // googletestframework@googlegroups.com (patches for fixing them are
251 // even more welcome!).
253 // It is possible that none of the GTEST_OS_* macros are defined.
255 // Feature-indicating macros
256 // -------------------------
258 // Macros indicating which Google Test features are available (a macro
259 // is defined to 1 if the corresponding feature is supported;
260 // otherwise UNDEFINED -- it's never defined to 0.). Google Test
261 // defines these macros automatically. Code outside Google Test MUST
264 // These macros are public so that portable tests can be written.
265 // Such tests typically surround code using a feature with an #if
266 // which controls that code. For example:
268 // #if GTEST_HAS_DEATH_TEST
269 // EXPECT_DEATH(DoSomethingDeadly());
272 // GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
274 // GTEST_HAS_DEATH_TEST - death tests
275 // GTEST_HAS_TYPED_TEST - typed tests
276 // GTEST_HAS_TYPED_TEST_P - type-parameterized tests
277 // GTEST_IS_THREADSAFE - Google Test is thread-safe.
278 // GOOGLETEST_CM0007 DO NOT DELETE
279 // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
280 // GTEST_HAS_POSIX_RE (see above) which users can
281 // define themselves.
282 // GTEST_USES_SIMPLE_RE - our own simple regex is used;
283 // the above RE\b(s) are mutually exclusive.
284 // GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
286 // Misc public macros
287 // ------------------
289 // GTEST_FLAG(flag_name) - references the variable corresponding to
290 // the given Google Test flag.
292 // Internal utilities
293 // ------------------
295 // The following macros and utilities are for Google Test's INTERNAL
296 // use only. Code outside Google Test MUST NOT USE THEM DIRECTLY.
298 // Macros for basic C++ coding:
299 // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
300 // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
301 // variable don't have to be used.
302 // GTEST_DISALLOW_ASSIGN_ - disables operator=.
303 // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
304 // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
305 // GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is
306 // suppressed (constant conditional).
307 // GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127
310 // C++11 feature wrappers:
312 // testing::internal::forward - portability wrapper for std::forward.
313 // testing::internal::move - portability wrapper for std::move.
316 // Mutex, MutexLock, ThreadLocal, GetThreadCount()
317 // - synchronization primitives.
319 // Template meta programming:
320 // is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
321 // IteratorTraits - partial implementation of std::iterator_traits, which
322 // is not available in libCstd when compiled with Sun C++.
325 // scoped_ptr - as in TR2.
327 // Regular expressions:
328 // RE - a simple regular expression class using the POSIX
329 // Extended Regular Expression syntax on UNIX-like platforms
330 // GOOGLETEST_CM0008 DO NOT DELETE
331 // or a reduced regular exception syntax on other
332 // platforms, including Windows.
334 // GTEST_LOG_() - logs messages at the specified severity level.
335 // LogToStderr() - directs all log messages to stderr.
336 // FlushInfoLog() - flushes informational log messages.
338 // Stdout and stderr capturing:
339 // CaptureStdout() - starts capturing stdout.
340 // GetCapturedStdout() - stops capturing stdout and returns the captured
342 // CaptureStderr() - starts capturing stderr.
343 // GetCapturedStderr() - stops capturing stderr and returns the captured
347 // TypeWithSize - maps an integer to a int type.
348 // Int32, UInt32, Int64, UInt64, TimeInMillis
349 // - integers of known sizes.
350 // BiggestInt - the biggest signed integer type.
352 // Command-line utilities:
353 // GTEST_DECLARE_*() - declares a flag.
354 // GTEST_DEFINE_*() - defines a flag.
355 // GetInjectableArgvs() - returns the command line as a vector of strings.
357 // Environment variable utilities:
358 // GetEnv() - gets the value of an environment variable.
359 // BoolFromGTestEnv() - parses a bool environment variable.
360 // Int32FromGTestEnv() - parses an Int32 environment variable.
361 // StringFromGTestEnv() - parses a string environment variable.
363 #include <ctype.h> // for isspace, etc
364 #include <stddef.h> // for ptrdiff_t
369 # include <sys/types.h>
370 # include <sys/stat.h>
371 #endif // !_WIN32_WCE
373 #if defined __APPLE__
374 # include <AvailabilityMacros.h>
375 # include <TargetConditionals.h>
378 // Brings in the definition of HAS_GLOBAL_STRING. This must be done
379 // BEFORE we test HAS_GLOBAL_STRING.
380 #include <string> // NOLINT
381 #include <algorithm> // NOLINT
382 #include <iostream> // NOLINT
383 #include <sstream> // NOLINT
385 #include <vector> // NOLINT
387 // Copyright 2015, Google Inc.
388 // All rights reserved.
390 // Redistribution and use in source and binary forms, with or without
391 // modification, are permitted provided that the following conditions are
394 // * Redistributions of source code must retain the above copyright
395 // notice, this list of conditions and the following disclaimer.
396 // * Redistributions in binary form must reproduce the above
397 // copyright notice, this list of conditions and the following disclaimer
398 // in the documentation and/or other materials provided with the
400 // * Neither the name of Google Inc. nor the names of its
401 // contributors may be used to endorse or promote products derived from
402 // this software without specific prior written permission.
404 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
405 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
406 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
407 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
408 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
409 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
410 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
411 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
412 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
413 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
414 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
416 // The Google C++ Testing and Mocking Framework (Google Test)
418 // This header file defines the GTEST_OS_* macro.
419 // It is separate from gtest-port.h so that custom/gtest-port.h can include it.
421 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
422 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
424 // Determines the platform on which Google Test is compiled.
426 # define GTEST_OS_CYGWIN 1
427 #elif defined __SYMBIAN32__
428 # define GTEST_OS_SYMBIAN 1
430 # define GTEST_OS_WINDOWS 1
432 # define GTEST_OS_WINDOWS_MOBILE 1
433 # elif defined(__MINGW__) || defined(__MINGW32__)
434 # define GTEST_OS_WINDOWS_MINGW 1
435 # elif defined(WINAPI_FAMILY)
436 # include <winapifamily.h>
437 # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
438 # define GTEST_OS_WINDOWS_DESKTOP 1
439 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
440 # define GTEST_OS_WINDOWS_PHONE 1
441 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
442 # define GTEST_OS_WINDOWS_RT 1
443 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)
444 # define GTEST_OS_WINDOWS_PHONE 1
445 # define GTEST_OS_WINDOWS_TV_TITLE 1
447 // WINAPI_FAMILY defined but no known partition matched.
448 // Default to desktop.
449 # define GTEST_OS_WINDOWS_DESKTOP 1
452 # define GTEST_OS_WINDOWS_DESKTOP 1
453 # endif // _WIN32_WCE
454 #elif defined __APPLE__
455 # define GTEST_OS_MAC 1
456 # if TARGET_OS_IPHONE
457 # define GTEST_OS_IOS 1
459 #elif defined __FreeBSD__
460 # define GTEST_OS_FREEBSD 1
461 #elif defined __Fuchsia__
462 # define GTEST_OS_FUCHSIA 1
463 #elif defined __linux__
464 # define GTEST_OS_LINUX 1
465 # if defined __ANDROID__
466 # define GTEST_OS_LINUX_ANDROID 1
468 #elif defined __MVS__
469 # define GTEST_OS_ZOS 1
470 #elif defined(__sun) && defined(__SVR4)
471 # define GTEST_OS_SOLARIS 1
473 # define GTEST_OS_AIX 1
474 #elif defined(__hpux)
475 # define GTEST_OS_HPUX 1
476 #elif defined __native_client__
477 # define GTEST_OS_NACL 1
478 #elif defined __NetBSD__
479 # define GTEST_OS_NETBSD 1
480 #elif defined __OpenBSD__
481 # define GTEST_OS_OPENBSD 1
482 #elif defined __QNX__
483 # define GTEST_OS_QNX 1
486 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
487 // Copyright 2015, Google Inc.
488 // All rights reserved.
490 // Redistribution and use in source and binary forms, with or without
491 // modification, are permitted provided that the following conditions are
494 // * Redistributions of source code must retain the above copyright
495 // notice, this list of conditions and the following disclaimer.
496 // * Redistributions in binary form must reproduce the above
497 // copyright notice, this list of conditions and the following disclaimer
498 // in the documentation and/or other materials provided with the
500 // * Neither the name of Google Inc. nor the names of its
501 // contributors may be used to endorse or promote products derived from
502 // this software without specific prior written permission.
504 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
505 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
506 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
507 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
508 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
509 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
510 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
511 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
512 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
513 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
514 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
516 // Injection point for custom user configurations. See README for details
518 // ** Custom implementation starts here **
520 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
521 #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
523 #endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
525 #if !defined(GTEST_DEV_EMAIL_)
526 # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
527 # define GTEST_FLAG_PREFIX_ "gtest_"
528 # define GTEST_FLAG_PREFIX_DASH_ "gtest-"
529 # define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
530 # define GTEST_NAME_ "Google Test"
531 # define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"
532 #endif // !defined(GTEST_DEV_EMAIL_)
534 #if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
535 # define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest"
536 #endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
538 // Determines the version of gcc that is used to compile this.
540 // 40302 means version 4.3.2.
541 # define GTEST_GCC_VER_ \
542 (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
545 // Macros for disabling Microsoft Visual C++ warnings.
547 // GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)
548 // /* code that triggers warnings C4800 and C4385 */
549 // GTEST_DISABLE_MSC_WARNINGS_POP_()
551 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
552 __pragma(warning(push)) \
553 __pragma(warning(disable: warnings))
554 # define GTEST_DISABLE_MSC_WARNINGS_POP_() \
555 __pragma(warning(pop))
557 // Older versions of MSVC don't have __pragma.
558 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
559 # define GTEST_DISABLE_MSC_WARNINGS_POP_()
562 // Clang on Windows does not understand MSVC's pragma warning.
563 // We need clang-specific way to disable function deprecation warning.
565 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \
566 _Pragma("clang diagnostic push") \
567 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \
568 _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"")
569 #define GTEST_DISABLE_MSC_DEPRECATED_POP_() \
570 _Pragma("clang diagnostic pop")
572 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \
573 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)
574 # define GTEST_DISABLE_MSC_DEPRECATED_POP_() \
575 GTEST_DISABLE_MSC_WARNINGS_POP_()
578 #ifndef GTEST_LANG_CXX11
579 // gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
580 // -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a
581 // value for __cplusplus, and recent versions of clang, gcc, and
582 // probably other compilers set that too in C++11 mode.
583 # if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L || _MSC_VER >= 1900
584 // Compiling in at least C++11 mode.
585 # define GTEST_LANG_CXX11 1
587 # define GTEST_LANG_CXX11 0
591 // Distinct from C++11 language support, some environments don't provide
592 // proper C++11 library support. Notably, it's possible to build in
593 // C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++
594 // with no C++11 support.
596 // libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__
597 // 20110325, but maintenance releases in the 4.4 and 4.5 series followed
598 // this date, so check for those versions by their date stamps.
599 // https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning
600 #if GTEST_LANG_CXX11 && \
601 (!defined(__GLIBCXX__) || ( \
602 __GLIBCXX__ >= 20110325ul && /* GCC >= 4.6.0 */ \
603 /* Blacklist of patch releases of older branches: */ \
604 __GLIBCXX__ != 20110416ul && /* GCC 4.4.6 */ \
605 __GLIBCXX__ != 20120313ul && /* GCC 4.4.7 */ \
606 __GLIBCXX__ != 20110428ul && /* GCC 4.5.3 */ \
607 __GLIBCXX__ != 20120702ul)) /* GCC 4.5.4 */
608 # define GTEST_STDLIB_CXX11 1
611 // Only use C++11 library features if the library provides them.
612 #if GTEST_STDLIB_CXX11
613 # define GTEST_HAS_STD_BEGIN_AND_END_ 1
614 # define GTEST_HAS_STD_FORWARD_LIST_ 1
615 # if !defined(_MSC_VER) || (_MSC_FULL_VER >= 190023824)
616 // works only with VS2015U2 and better
617 # define GTEST_HAS_STD_FUNCTION_ 1
619 # define GTEST_HAS_STD_INITIALIZER_LIST_ 1
620 # define GTEST_HAS_STD_MOVE_ 1
621 # define GTEST_HAS_STD_UNIQUE_PTR_ 1
622 # define GTEST_HAS_STD_SHARED_PTR_ 1
623 # define GTEST_HAS_UNORDERED_MAP_ 1
624 # define GTEST_HAS_UNORDERED_SET_ 1
627 // C++11 specifies that <tuple> provides std::tuple.
628 // Some platforms still might not have it, however.
630 # define GTEST_HAS_STD_TUPLE_ 1
631 # if defined(__clang__)
633 // https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros
634 # if defined(__has_include) && !__has_include(<tuple>)
635 # undef GTEST_HAS_STD_TUPLE_
637 # elif defined(_MSC_VER)
638 // Inspired by boost/config/stdlib/dinkumware.hpp
639 # if defined(_CPPLIB_VER) && _CPPLIB_VER < 520
640 # undef GTEST_HAS_STD_TUPLE_
642 # elif defined(__GLIBCXX__)
643 // Inspired by boost/config/stdlib/libstdcpp3.hpp,
644 // http://gcc.gnu.org/gcc-4.2/changes.html and
645 // https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x
646 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
647 # undef GTEST_HAS_STD_TUPLE_
652 // Brings in definitions for functions used in the testing::internal::posix
653 // namespace (read, write, close, chdir, isatty, stat). We do not currently
654 // use them on Windows Mobile.
656 # if !GTEST_OS_WINDOWS_MOBILE
660 // In order to avoid having to include <windows.h>, use forward declaration
661 #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)
662 // MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
663 // separate (equivalent) structs, instead of using typedef
664 typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION
;
666 // Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
667 // This assumption is verified by
668 // WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
669 typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION
;
672 // This assumes that non-Windows OSes provide unistd.h. For OSes where this
673 // is not the case, we need to include headers that provide the functions
676 # include <strings.h>
677 #endif // GTEST_OS_WINDOWS
679 #if GTEST_OS_LINUX_ANDROID
680 // Used to define __ANDROID_API__ matching the target NDK API level.
681 # include <android/api-level.h> // NOLINT
684 // Defines this to true iff Google Test can use POSIX regular expressions.
685 #ifndef GTEST_HAS_POSIX_RE
686 # if GTEST_OS_LINUX_ANDROID
687 // On Android, <regex.h> is only available starting with Gingerbread.
688 # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
690 # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
695 // The appropriate headers have already been included.
697 #elif GTEST_HAS_POSIX_RE
699 // On some platforms, <regex.h> needs someone to define size_t, and
700 // won't compile otherwise. We can #include it here as we already
701 // included <stdlib.h>, which is guaranteed to define size_t through
703 # include <regex.h> // NOLINT
705 # define GTEST_USES_POSIX_RE 1
707 #elif GTEST_OS_WINDOWS
709 // <regex.h> is not available on Windows. Use our own simple regex
710 // implementation instead.
711 # define GTEST_USES_SIMPLE_RE 1
715 // <regex.h> may not be available on this platform. Use our own
716 // simple regex implementation instead.
717 # define GTEST_USES_SIMPLE_RE 1
719 #endif // GTEST_USES_PCRE
721 #ifndef GTEST_HAS_EXCEPTIONS
722 // The user didn't tell us whether exceptions are enabled, so we need
724 # if defined(_MSC_VER) && defined(_CPPUNWIND)
725 // MSVC defines _CPPUNWIND to 1 iff exceptions are enabled.
726 # define GTEST_HAS_EXCEPTIONS 1
727 # elif defined(__BORLANDC__)
728 // C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS
729 // macro to enable exceptions, so we'll do the same.
730 // Assumes that exceptions are enabled by default.
731 # ifndef _HAS_EXCEPTIONS
732 # define _HAS_EXCEPTIONS 1
733 # endif // _HAS_EXCEPTIONS
734 # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
735 # elif defined(__clang__)
736 // clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,
737 // but iff cleanups are enabled after that. In Obj-C++ files, there can be
738 // cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions
739 // are disabled. clang has __has_feature(cxx_exceptions) which checks for C++
740 // exceptions starting at clang r206352, but which checked for cleanups prior to
741 // that. To reliably check for C++ exception availability with clang, check for
742 // __EXCEPTIONS && __has_feature(cxx_exceptions).
743 # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
744 # elif defined(__GNUC__) && __EXCEPTIONS
745 // gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
746 # define GTEST_HAS_EXCEPTIONS 1
747 # elif defined(__SUNPRO_CC)
748 // Sun Pro CC supports exceptions. However, there is no compile-time way of
749 // detecting whether they are enabled or not. Therefore, we assume that
750 // they are enabled unless the user tells us otherwise.
751 # define GTEST_HAS_EXCEPTIONS 1
752 # elif defined(__IBMCPP__) && __EXCEPTIONS
753 // xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
754 # define GTEST_HAS_EXCEPTIONS 1
755 # elif defined(__HP_aCC)
756 // Exception handling is in effect by default in HP aCC compiler. It has to
757 // be turned of by +noeh compiler option if desired.
758 # define GTEST_HAS_EXCEPTIONS 1
760 // For other compilers, we assume exceptions are disabled to be
762 # define GTEST_HAS_EXCEPTIONS 0
763 # endif // defined(_MSC_VER) || defined(__BORLANDC__)
764 #endif // GTEST_HAS_EXCEPTIONS
766 #if !defined(GTEST_HAS_STD_STRING)
767 // Even though we don't use this macro any longer, we keep it in case
768 // some clients still depend on it.
769 # define GTEST_HAS_STD_STRING 1
770 #elif !GTEST_HAS_STD_STRING
771 // The user told us that ::std::string isn't available.
772 # error "::std::string isn't available."
773 #endif // !defined(GTEST_HAS_STD_STRING)
775 #ifndef GTEST_HAS_GLOBAL_STRING
776 # define GTEST_HAS_GLOBAL_STRING 0
777 #endif // GTEST_HAS_GLOBAL_STRING
779 #ifndef GTEST_HAS_STD_WSTRING
780 // The user didn't tell us whether ::std::wstring is available, so we need
782 // FIXME: uses autoconf to detect whether ::std::wstring
785 // Cygwin 1.7 and below doesn't support ::std::wstring.
786 // Solaris' libc++ doesn't support it either. Android has
787 // no support for it at least as recent as Froyo (2.2).
788 # define GTEST_HAS_STD_WSTRING \
789 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
791 #endif // GTEST_HAS_STD_WSTRING
793 #ifndef GTEST_HAS_GLOBAL_WSTRING
794 // The user didn't tell us whether ::wstring is available, so we need
796 # define GTEST_HAS_GLOBAL_WSTRING \
797 (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
798 #endif // GTEST_HAS_GLOBAL_WSTRING
800 // Determines whether RTTI is available.
801 #ifndef GTEST_HAS_RTTI
802 // The user didn't tell us whether RTTI is enabled, so we need to
807 # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
808 # define GTEST_HAS_RTTI 1
810 # define GTEST_HAS_RTTI 0
813 // Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
814 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
817 // When building against STLport with the Android NDK and with
818 // -frtti -fno-exceptions, the build fails at link time with undefined
819 // references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
820 // so disable RTTI when detected.
821 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
822 !defined(__EXCEPTIONS)
823 # define GTEST_HAS_RTTI 0
825 # define GTEST_HAS_RTTI 1
826 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
828 # define GTEST_HAS_RTTI 0
829 # endif // __GXX_RTTI
831 // Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
832 // using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
833 // first version with C++ support.
834 # elif defined(__clang__)
836 # define GTEST_HAS_RTTI __has_feature(cxx_rtti)
838 // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
839 // both the typeid and dynamic_cast features are present.
840 # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
843 # define GTEST_HAS_RTTI 1
845 # define GTEST_HAS_RTTI 0
850 // For all other compilers, we assume RTTI is enabled.
851 # define GTEST_HAS_RTTI 1
855 #endif // GTEST_HAS_RTTI
857 // It's this header's responsibility to #include <typeinfo> when RTTI
863 // Determines whether Google Test can use the pthreads library.
864 #ifndef GTEST_HAS_PTHREAD
865 // The user didn't tell us explicitly, so we make reasonable assumptions about
866 // which platforms have pthreads support.
868 // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
869 // to your compiler flags.
870 #define GTEST_HAS_PTHREAD \
871 (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \
872 GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)
873 #endif // GTEST_HAS_PTHREAD
875 #if GTEST_HAS_PTHREAD
876 // gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
878 # include <pthread.h> // NOLINT
880 // For timespec and nanosleep, used below.
881 # include <time.h> // NOLINT
884 // Determines if hash_map/hash_set are available.
885 // Only used for testing against those containers.
886 #if !defined(GTEST_HAS_HASH_MAP_)
887 # if defined(_MSC_VER) && (_MSC_VER < 1900)
888 # define GTEST_HAS_HASH_MAP_ 1 // Indicates that hash_map is available.
889 # define GTEST_HAS_HASH_SET_ 1 // Indicates that hash_set is available.
891 #endif // !defined(GTEST_HAS_HASH_MAP_)
893 // Determines whether Google Test can use tr1/tuple. You can define
894 // this macro to 0 to prevent Google Test from using tuple (any
895 // feature depending on tuple with be disabled in this mode).
896 #ifndef GTEST_HAS_TR1_TUPLE
897 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
898 // STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
899 # define GTEST_HAS_TR1_TUPLE 0
900 # elif defined(_MSC_VER) && (_MSC_VER >= 1910)
901 // Prevent `warning C4996: 'std::tr1': warning STL4002:
902 // The non-Standard std::tr1 namespace and TR1-only machinery
903 // are deprecated and will be REMOVED.`
904 # define GTEST_HAS_TR1_TUPLE 0
905 # elif GTEST_LANG_CXX11 && defined(_LIBCPP_VERSION)
906 // libc++ doesn't support TR1.
907 # define GTEST_HAS_TR1_TUPLE 0
909 // The user didn't tell us not to do it, so we assume it's OK.
910 # define GTEST_HAS_TR1_TUPLE 1
912 #endif // GTEST_HAS_TR1_TUPLE
914 // Determines whether Google Test's own tr1 tuple implementation
916 #ifndef GTEST_USE_OWN_TR1_TUPLE
917 // We use our own tuple implementation on Symbian.
918 # if GTEST_OS_SYMBIAN
919 # define GTEST_USE_OWN_TR1_TUPLE 1
921 // The user didn't tell us, so we need to figure it out.
923 // We use our own TR1 tuple if we aren't sure the user has an
924 // implementation of it already. At this time, libstdc++ 4.0.0+ and
925 // MSVC 2010 are the only mainstream standard libraries that come
926 // with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler
927 // pretends to be GCC by defining __GNUC__ and friends, but cannot
928 // compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1
929 // tuple in a 323 MB Feature Pack download, which we cannot assume the
930 // user has. QNX's QCC compiler is a modified GCC but it doesn't
931 // support TR1 tuple. libc++ only provides std::tuple, in C++11 mode,
932 // and it can be used with some compilers that define __GNUC__.
933 # if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
934 && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) \
935 || (_MSC_VER >= 1600 && _MSC_VER < 1900)
936 # define GTEST_ENV_HAS_TR1_TUPLE_ 1
939 // C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
940 // in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
941 // can build with clang but need to use gcc4.2's libstdc++).
942 # if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
943 # define GTEST_ENV_HAS_STD_TUPLE_ 1
946 # if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
947 # define GTEST_USE_OWN_TR1_TUPLE 0
949 # define GTEST_USE_OWN_TR1_TUPLE 1
951 # endif // GTEST_OS_SYMBIAN
952 #endif // GTEST_USE_OWN_TR1_TUPLE
954 // To avoid conditional compilation we make it gtest-port.h's responsibility
955 // to #include the header implementing tuple.
956 #if GTEST_HAS_STD_TUPLE_
957 # include <tuple> // IWYU pragma: export
958 # define GTEST_TUPLE_NAMESPACE_ ::std
959 #endif // GTEST_HAS_STD_TUPLE_
961 // We include tr1::tuple even if std::tuple is available to define printers for
963 #if GTEST_HAS_TR1_TUPLE
964 # ifndef GTEST_TUPLE_NAMESPACE_
965 # define GTEST_TUPLE_NAMESPACE_ ::std::tr1
966 # endif // GTEST_TUPLE_NAMESPACE_
968 # if GTEST_USE_OWN_TR1_TUPLE
969 // This file was GENERATED by command:
970 // pump.py gtest-tuple.h.pump
971 // DO NOT EDIT BY HAND!!!
973 // Copyright 2009 Google Inc.
974 // All Rights Reserved.
976 // Redistribution and use in source and binary forms, with or without
977 // modification, are permitted provided that the following conditions are
980 // * Redistributions of source code must retain the above copyright
981 // notice, this list of conditions and the following disclaimer.
982 // * Redistributions in binary form must reproduce the above
983 // copyright notice, this list of conditions and the following disclaimer
984 // in the documentation and/or other materials provided with the
986 // * Neither the name of Google Inc. nor the names of its
987 // contributors may be used to endorse or promote products derived from
988 // this software without specific prior written permission.
990 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
991 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
992 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
993 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
994 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
995 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
996 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
997 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
998 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
999 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1000 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1003 // Implements a subset of TR1 tuple needed by Google Test and Google Mock.
1005 // GOOGLETEST_CM0001 DO NOT DELETE
1007 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
1008 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
1010 #include <utility> // For ::std::pair.
1012 // The compiler used in Symbian has a bug that prevents us from declaring the
1013 // tuple template as a friend (it complains that tuple is redefined). This
1014 // bypasses the bug by declaring the members that should otherwise be
1015 // private as public.
1016 // Sun Studio versions < 12 also have the above bug.
1017 #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
1018 # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
1020 # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
1021 template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
1025 // Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict
1026 // with our own definitions. Therefore using our own tuple does not work on
1028 #if defined(_MSC_VER) && _MSC_VER >= 1600 /* 1600 is Visual Studio 2010 */
1029 # error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \
1030 GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."
1033 // GTEST_n_TUPLE_(T) is the type of an n-tuple.
1034 #define GTEST_0_TUPLE_(T) tuple<>
1035 #define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
1037 #define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
1039 #define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
1041 #define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
1043 #define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
1045 #define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
1047 #define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
1049 #define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
1051 #define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
1053 #define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
1056 // GTEST_n_TYPENAMES_(T) declares a list of n typenames.
1057 #define GTEST_0_TYPENAMES_(T)
1058 #define GTEST_1_TYPENAMES_(T) typename T##0
1059 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
1060 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
1061 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1063 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1064 typename T##3, typename T##4
1065 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1066 typename T##3, typename T##4, typename T##5
1067 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1068 typename T##3, typename T##4, typename T##5, typename T##6
1069 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1070 typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
1071 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1072 typename T##3, typename T##4, typename T##5, typename T##6, \
1073 typename T##7, typename T##8
1074 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
1075 typename T##3, typename T##4, typename T##5, typename T##6, \
1076 typename T##7, typename T##8, typename T##9
1078 // In theory, defining stuff in the ::std namespace is undefined
1079 // behavior. We can do this as we are playing the role of a standard
1084 template <typename T0
= void, typename T1
= void, typename T2
= void,
1085 typename T3
= void, typename T4
= void, typename T5
= void,
1086 typename T6
= void, typename T7
= void, typename T8
= void,
1090 // Anything in namespace gtest_internal is Google Test's INTERNAL
1091 // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
1092 namespace gtest_internal
{
1094 // ByRef<T>::type is T if T is a reference; otherwise it's const T&.
1095 template <typename T
>
1096 struct ByRef
{ typedef const T
& type
; }; // NOLINT
1097 template <typename T
>
1098 struct ByRef
<T
&> { typedef T
& type
; }; // NOLINT
1100 // A handy wrapper for ByRef.
1101 #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
1103 // AddRef<T>::type is T if T is a reference; otherwise it's T&. This
1104 // is the same as tr1::add_reference<T>::type.
1105 template <typename T
>
1106 struct AddRef
{ typedef T
& type
; }; // NOLINT
1107 template <typename T
>
1108 struct AddRef
<T
&> { typedef T
& type
; }; // NOLINT
1110 // A handy wrapper for AddRef.
1111 #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
1113 // A helper for implementing get<k>().
1114 template <int k
> class Get
;
1116 // A helper for implementing tuple_element<k, T>. kIndexValid is true
1117 // iff k < the number of fields in tuple type T.
1118 template <bool kIndexValid
, int kIndex
, class Tuple
>
1119 struct TupleElement
;
1121 template <GTEST_10_TYPENAMES_(T
)>
1122 struct TupleElement
<true, 0, GTEST_10_TUPLE_(T
) > {
1126 template <GTEST_10_TYPENAMES_(T
)>
1127 struct TupleElement
<true, 1, GTEST_10_TUPLE_(T
) > {
1131 template <GTEST_10_TYPENAMES_(T
)>
1132 struct TupleElement
<true, 2, GTEST_10_TUPLE_(T
) > {
1136 template <GTEST_10_TYPENAMES_(T
)>
1137 struct TupleElement
<true, 3, GTEST_10_TUPLE_(T
) > {
1141 template <GTEST_10_TYPENAMES_(T
)>
1142 struct TupleElement
<true, 4, GTEST_10_TUPLE_(T
) > {
1146 template <GTEST_10_TYPENAMES_(T
)>
1147 struct TupleElement
<true, 5, GTEST_10_TUPLE_(T
) > {
1151 template <GTEST_10_TYPENAMES_(T
)>
1152 struct TupleElement
<true, 6, GTEST_10_TUPLE_(T
) > {
1156 template <GTEST_10_TYPENAMES_(T
)>
1157 struct TupleElement
<true, 7, GTEST_10_TUPLE_(T
) > {
1161 template <GTEST_10_TYPENAMES_(T
)>
1162 struct TupleElement
<true, 8, GTEST_10_TUPLE_(T
) > {
1166 template <GTEST_10_TYPENAMES_(T
)>
1167 struct TupleElement
<true, 9, GTEST_10_TUPLE_(T
) > {
1171 } // namespace gtest_internal
1177 tuple(const tuple
& /* t */) {}
1178 tuple
& operator=(const tuple
& /* t */) { return *this; }
1181 template <GTEST_1_TYPENAMES_(T
)>
1182 class GTEST_1_TUPLE_(T
) {
1184 template <int k
> friend class gtest_internal::Get
;
1188 explicit tuple(GTEST_BY_REF_(T0
) f0
) : f0_(f0
) {}
1190 tuple(const tuple
& t
) : f0_(t
.f0_
) {}
1192 template <GTEST_1_TYPENAMES_(U
)>
1193 tuple(const GTEST_1_TUPLE_(U
)& t
) : f0_(t
.f0_
) {}
1195 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1197 template <GTEST_1_TYPENAMES_(U
)>
1198 tuple
& operator=(const GTEST_1_TUPLE_(U
)& t
) {
1202 GTEST_DECLARE_TUPLE_AS_FRIEND_
1204 template <GTEST_1_TYPENAMES_(U
)>
1205 tuple
& CopyFrom(const GTEST_1_TUPLE_(U
)& t
) {
1213 template <GTEST_2_TYPENAMES_(T
)>
1214 class GTEST_2_TUPLE_(T
) {
1216 template <int k
> friend class gtest_internal::Get
;
1218 tuple() : f0_(), f1_() {}
1220 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
) : f0_(f0
),
1223 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
) {}
1225 template <GTEST_2_TYPENAMES_(U
)>
1226 tuple(const GTEST_2_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
) {}
1227 template <typename U0
, typename U1
>
1228 tuple(const ::std::pair
<U0
, U1
>& p
) : f0_(p
.first
), f1_(p
.second
) {}
1230 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1232 template <GTEST_2_TYPENAMES_(U
)>
1233 tuple
& operator=(const GTEST_2_TUPLE_(U
)& t
) {
1236 template <typename U0
, typename U1
>
1237 tuple
& operator=(const ::std::pair
<U0
, U1
>& p
) {
1243 GTEST_DECLARE_TUPLE_AS_FRIEND_
1245 template <GTEST_2_TYPENAMES_(U
)>
1246 tuple
& CopyFrom(const GTEST_2_TUPLE_(U
)& t
) {
1256 template <GTEST_3_TYPENAMES_(T
)>
1257 class GTEST_3_TUPLE_(T
) {
1259 template <int k
> friend class gtest_internal::Get
;
1261 tuple() : f0_(), f1_(), f2_() {}
1263 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1264 GTEST_BY_REF_(T2
) f2
) : f0_(f0
), f1_(f1
), f2_(f2
) {}
1266 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
) {}
1268 template <GTEST_3_TYPENAMES_(U
)>
1269 tuple(const GTEST_3_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
) {}
1271 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1273 template <GTEST_3_TYPENAMES_(U
)>
1274 tuple
& operator=(const GTEST_3_TUPLE_(U
)& t
) {
1278 GTEST_DECLARE_TUPLE_AS_FRIEND_
1280 template <GTEST_3_TYPENAMES_(U
)>
1281 tuple
& CopyFrom(const GTEST_3_TUPLE_(U
)& t
) {
1293 template <GTEST_4_TYPENAMES_(T
)>
1294 class GTEST_4_TUPLE_(T
) {
1296 template <int k
> friend class gtest_internal::Get
;
1298 tuple() : f0_(), f1_(), f2_(), f3_() {}
1300 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1301 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
) : f0_(f0
), f1_(f1
), f2_(f2
),
1304 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
) {}
1306 template <GTEST_4_TYPENAMES_(U
)>
1307 tuple(const GTEST_4_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1310 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1312 template <GTEST_4_TYPENAMES_(U
)>
1313 tuple
& operator=(const GTEST_4_TUPLE_(U
)& t
) {
1317 GTEST_DECLARE_TUPLE_AS_FRIEND_
1319 template <GTEST_4_TYPENAMES_(U
)>
1320 tuple
& CopyFrom(const GTEST_4_TUPLE_(U
)& t
) {
1334 template <GTEST_5_TYPENAMES_(T
)>
1335 class GTEST_5_TUPLE_(T
) {
1337 template <int k
> friend class gtest_internal::Get
;
1339 tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
1341 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1342 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
,
1343 GTEST_BY_REF_(T4
) f4
) : f0_(f0
), f1_(f1
), f2_(f2
), f3_(f3
), f4_(f4
) {}
1345 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
),
1348 template <GTEST_5_TYPENAMES_(U
)>
1349 tuple(const GTEST_5_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1350 f3_(t
.f3_
), f4_(t
.f4_
) {}
1352 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1354 template <GTEST_5_TYPENAMES_(U
)>
1355 tuple
& operator=(const GTEST_5_TUPLE_(U
)& t
) {
1359 GTEST_DECLARE_TUPLE_AS_FRIEND_
1361 template <GTEST_5_TYPENAMES_(U
)>
1362 tuple
& CopyFrom(const GTEST_5_TUPLE_(U
)& t
) {
1378 template <GTEST_6_TYPENAMES_(T
)>
1379 class GTEST_6_TUPLE_(T
) {
1381 template <int k
> friend class gtest_internal::Get
;
1383 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
1385 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1386 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
, GTEST_BY_REF_(T4
) f4
,
1387 GTEST_BY_REF_(T5
) f5
) : f0_(f0
), f1_(f1
), f2_(f2
), f3_(f3
), f4_(f4
),
1390 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
),
1391 f4_(t
.f4_
), f5_(t
.f5_
) {}
1393 template <GTEST_6_TYPENAMES_(U
)>
1394 tuple(const GTEST_6_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1395 f3_(t
.f3_
), f4_(t
.f4_
), f5_(t
.f5_
) {}
1397 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1399 template <GTEST_6_TYPENAMES_(U
)>
1400 tuple
& operator=(const GTEST_6_TUPLE_(U
)& t
) {
1404 GTEST_DECLARE_TUPLE_AS_FRIEND_
1406 template <GTEST_6_TYPENAMES_(U
)>
1407 tuple
& CopyFrom(const GTEST_6_TUPLE_(U
)& t
) {
1425 template <GTEST_7_TYPENAMES_(T
)>
1426 class GTEST_7_TUPLE_(T
) {
1428 template <int k
> friend class gtest_internal::Get
;
1430 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
1432 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1433 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
, GTEST_BY_REF_(T4
) f4
,
1434 GTEST_BY_REF_(T5
) f5
, GTEST_BY_REF_(T6
) f6
) : f0_(f0
), f1_(f1
), f2_(f2
),
1435 f3_(f3
), f4_(f4
), f5_(f5
), f6_(f6
) {}
1437 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
),
1438 f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
) {}
1440 template <GTEST_7_TYPENAMES_(U
)>
1441 tuple(const GTEST_7_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1442 f3_(t
.f3_
), f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
) {}
1444 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1446 template <GTEST_7_TYPENAMES_(U
)>
1447 tuple
& operator=(const GTEST_7_TUPLE_(U
)& t
) {
1451 GTEST_DECLARE_TUPLE_AS_FRIEND_
1453 template <GTEST_7_TYPENAMES_(U
)>
1454 tuple
& CopyFrom(const GTEST_7_TUPLE_(U
)& t
) {
1474 template <GTEST_8_TYPENAMES_(T
)>
1475 class GTEST_8_TUPLE_(T
) {
1477 template <int k
> friend class gtest_internal::Get
;
1479 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
1481 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1482 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
, GTEST_BY_REF_(T4
) f4
,
1483 GTEST_BY_REF_(T5
) f5
, GTEST_BY_REF_(T6
) f6
,
1484 GTEST_BY_REF_(T7
) f7
) : f0_(f0
), f1_(f1
), f2_(f2
), f3_(f3
), f4_(f4
),
1485 f5_(f5
), f6_(f6
), f7_(f7
) {}
1487 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
),
1488 f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
), f7_(t
.f7_
) {}
1490 template <GTEST_8_TYPENAMES_(U
)>
1491 tuple(const GTEST_8_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1492 f3_(t
.f3_
), f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
), f7_(t
.f7_
) {}
1494 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1496 template <GTEST_8_TYPENAMES_(U
)>
1497 tuple
& operator=(const GTEST_8_TUPLE_(U
)& t
) {
1501 GTEST_DECLARE_TUPLE_AS_FRIEND_
1503 template <GTEST_8_TYPENAMES_(U
)>
1504 tuple
& CopyFrom(const GTEST_8_TUPLE_(U
)& t
) {
1526 template <GTEST_9_TYPENAMES_(T
)>
1527 class GTEST_9_TUPLE_(T
) {
1529 template <int k
> friend class gtest_internal::Get
;
1531 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
1533 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1534 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
, GTEST_BY_REF_(T4
) f4
,
1535 GTEST_BY_REF_(T5
) f5
, GTEST_BY_REF_(T6
) f6
, GTEST_BY_REF_(T7
) f7
,
1536 GTEST_BY_REF_(T8
) f8
) : f0_(f0
), f1_(f1
), f2_(f2
), f3_(f3
), f4_(f4
),
1537 f5_(f5
), f6_(f6
), f7_(f7
), f8_(f8
) {}
1539 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
),
1540 f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
), f7_(t
.f7_
), f8_(t
.f8_
) {}
1542 template <GTEST_9_TYPENAMES_(U
)>
1543 tuple(const GTEST_9_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1544 f3_(t
.f3_
), f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
), f7_(t
.f7_
), f8_(t
.f8_
) {}
1546 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1548 template <GTEST_9_TYPENAMES_(U
)>
1549 tuple
& operator=(const GTEST_9_TUPLE_(U
)& t
) {
1553 GTEST_DECLARE_TUPLE_AS_FRIEND_
1555 template <GTEST_9_TYPENAMES_(U
)>
1556 tuple
& CopyFrom(const GTEST_9_TUPLE_(U
)& t
) {
1580 template <GTEST_10_TYPENAMES_(T
)>
1583 template <int k
> friend class gtest_internal::Get
;
1585 tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
1588 explicit tuple(GTEST_BY_REF_(T0
) f0
, GTEST_BY_REF_(T1
) f1
,
1589 GTEST_BY_REF_(T2
) f2
, GTEST_BY_REF_(T3
) f3
, GTEST_BY_REF_(T4
) f4
,
1590 GTEST_BY_REF_(T5
) f5
, GTEST_BY_REF_(T6
) f6
, GTEST_BY_REF_(T7
) f7
,
1591 GTEST_BY_REF_(T8
) f8
, GTEST_BY_REF_(T9
) f9
) : f0_(f0
), f1_(f1
), f2_(f2
),
1592 f3_(f3
), f4_(f4
), f5_(f5
), f6_(f6
), f7_(f7
), f8_(f8
), f9_(f9
) {}
1594 tuple(const tuple
& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
), f3_(t
.f3_
),
1595 f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
), f7_(t
.f7_
), f8_(t
.f8_
), f9_(t
.f9_
) {}
1597 template <GTEST_10_TYPENAMES_(U
)>
1598 tuple(const GTEST_10_TUPLE_(U
)& t
) : f0_(t
.f0_
), f1_(t
.f1_
), f2_(t
.f2_
),
1599 f3_(t
.f3_
), f4_(t
.f4_
), f5_(t
.f5_
), f6_(t
.f6_
), f7_(t
.f7_
), f8_(t
.f8_
),
1602 tuple
& operator=(const tuple
& t
) { return CopyFrom(t
); }
1604 template <GTEST_10_TYPENAMES_(U
)>
1605 tuple
& operator=(const GTEST_10_TUPLE_(U
)& t
) {
1609 GTEST_DECLARE_TUPLE_AS_FRIEND_
1611 template <GTEST_10_TYPENAMES_(U
)>
1612 tuple
& CopyFrom(const GTEST_10_TUPLE_(U
)& t
) {
1638 // 6.1.3.2 Tuple creation functions.
1640 // Known limitations: we don't support passing an
1641 // std::tr1::reference_wrapper<T> to make_tuple(). And we don't
1644 inline tuple
<> make_tuple() { return tuple
<>(); }
1646 template <GTEST_1_TYPENAMES_(T
)>
1647 inline GTEST_1_TUPLE_(T
) make_tuple(const T0
& f0
) {
1648 return GTEST_1_TUPLE_(T
)(f0
);
1651 template <GTEST_2_TYPENAMES_(T
)>
1652 inline GTEST_2_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
) {
1653 return GTEST_2_TUPLE_(T
)(f0
, f1
);
1656 template <GTEST_3_TYPENAMES_(T
)>
1657 inline GTEST_3_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
) {
1658 return GTEST_3_TUPLE_(T
)(f0
, f1
, f2
);
1661 template <GTEST_4_TYPENAMES_(T
)>
1662 inline GTEST_4_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1664 return GTEST_4_TUPLE_(T
)(f0
, f1
, f2
, f3
);
1667 template <GTEST_5_TYPENAMES_(T
)>
1668 inline GTEST_5_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1669 const T3
& f3
, const T4
& f4
) {
1670 return GTEST_5_TUPLE_(T
)(f0
, f1
, f2
, f3
, f4
);
1673 template <GTEST_6_TYPENAMES_(T
)>
1674 inline GTEST_6_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1675 const T3
& f3
, const T4
& f4
, const T5
& f5
) {
1676 return GTEST_6_TUPLE_(T
)(f0
, f1
, f2
, f3
, f4
, f5
);
1679 template <GTEST_7_TYPENAMES_(T
)>
1680 inline GTEST_7_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1681 const T3
& f3
, const T4
& f4
, const T5
& f5
, const T6
& f6
) {
1682 return GTEST_7_TUPLE_(T
)(f0
, f1
, f2
, f3
, f4
, f5
, f6
);
1685 template <GTEST_8_TYPENAMES_(T
)>
1686 inline GTEST_8_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1687 const T3
& f3
, const T4
& f4
, const T5
& f5
, const T6
& f6
, const T7
& f7
) {
1688 return GTEST_8_TUPLE_(T
)(f0
, f1
, f2
, f3
, f4
, f5
, f6
, f7
);
1691 template <GTEST_9_TYPENAMES_(T
)>
1692 inline GTEST_9_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1693 const T3
& f3
, const T4
& f4
, const T5
& f5
, const T6
& f6
, const T7
& f7
,
1695 return GTEST_9_TUPLE_(T
)(f0
, f1
, f2
, f3
, f4
, f5
, f6
, f7
, f8
);
1698 template <GTEST_10_TYPENAMES_(T
)>
1699 inline GTEST_10_TUPLE_(T
) make_tuple(const T0
& f0
, const T1
& f1
, const T2
& f2
,
1700 const T3
& f3
, const T4
& f4
, const T5
& f5
, const T6
& f6
, const T7
& f7
,
1701 const T8
& f8
, const T9
& f9
) {
1702 return GTEST_10_TUPLE_(T
)(f0
, f1
, f2
, f3
, f4
, f5
, f6
, f7
, f8
, f9
);
1705 // 6.1.3.3 Tuple helper classes.
1707 template <typename Tuple
> struct tuple_size
;
1709 template <GTEST_0_TYPENAMES_(T
)>
1710 struct tuple_size
<GTEST_0_TUPLE_(T
) > {
1711 static const int value
= 0;
1714 template <GTEST_1_TYPENAMES_(T
)>
1715 struct tuple_size
<GTEST_1_TUPLE_(T
) > {
1716 static const int value
= 1;
1719 template <GTEST_2_TYPENAMES_(T
)>
1720 struct tuple_size
<GTEST_2_TUPLE_(T
) > {
1721 static const int value
= 2;
1724 template <GTEST_3_TYPENAMES_(T
)>
1725 struct tuple_size
<GTEST_3_TUPLE_(T
) > {
1726 static const int value
= 3;
1729 template <GTEST_4_TYPENAMES_(T
)>
1730 struct tuple_size
<GTEST_4_TUPLE_(T
) > {
1731 static const int value
= 4;
1734 template <GTEST_5_TYPENAMES_(T
)>
1735 struct tuple_size
<GTEST_5_TUPLE_(T
) > {
1736 static const int value
= 5;
1739 template <GTEST_6_TYPENAMES_(T
)>
1740 struct tuple_size
<GTEST_6_TUPLE_(T
) > {
1741 static const int value
= 6;
1744 template <GTEST_7_TYPENAMES_(T
)>
1745 struct tuple_size
<GTEST_7_TUPLE_(T
) > {
1746 static const int value
= 7;
1749 template <GTEST_8_TYPENAMES_(T
)>
1750 struct tuple_size
<GTEST_8_TUPLE_(T
) > {
1751 static const int value
= 8;
1754 template <GTEST_9_TYPENAMES_(T
)>
1755 struct tuple_size
<GTEST_9_TUPLE_(T
) > {
1756 static const int value
= 9;
1759 template <GTEST_10_TYPENAMES_(T
)>
1760 struct tuple_size
<GTEST_10_TUPLE_(T
) > {
1761 static const int value
= 10;
1764 template <int k
, class Tuple
>
1765 struct tuple_element
{
1766 typedef typename
gtest_internal::TupleElement
<
1767 k
< (tuple_size
<Tuple
>::value
), k
, Tuple
>::type type
;
1770 #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
1772 // 6.1.3.4 Element access.
1774 namespace gtest_internal
{
1779 template <class Tuple
>
1780 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple
))
1781 Field(Tuple
& t
) { return t
.f0_
; } // NOLINT
1783 template <class Tuple
>
1784 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple
))
1785 ConstField(const Tuple
& t
) { return t
.f0_
; }
1791 template <class Tuple
>
1792 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple
))
1793 Field(Tuple
& t
) { return t
.f1_
; } // NOLINT
1795 template <class Tuple
>
1796 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple
))
1797 ConstField(const Tuple
& t
) { return t
.f1_
; }
1803 template <class Tuple
>
1804 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple
))
1805 Field(Tuple
& t
) { return t
.f2_
; } // NOLINT
1807 template <class Tuple
>
1808 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple
))
1809 ConstField(const Tuple
& t
) { return t
.f2_
; }
1815 template <class Tuple
>
1816 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple
))
1817 Field(Tuple
& t
) { return t
.f3_
; } // NOLINT
1819 template <class Tuple
>
1820 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple
))
1821 ConstField(const Tuple
& t
) { return t
.f3_
; }
1827 template <class Tuple
>
1828 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple
))
1829 Field(Tuple
& t
) { return t
.f4_
; } // NOLINT
1831 template <class Tuple
>
1832 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple
))
1833 ConstField(const Tuple
& t
) { return t
.f4_
; }
1839 template <class Tuple
>
1840 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple
))
1841 Field(Tuple
& t
) { return t
.f5_
; } // NOLINT
1843 template <class Tuple
>
1844 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple
))
1845 ConstField(const Tuple
& t
) { return t
.f5_
; }
1851 template <class Tuple
>
1852 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple
))
1853 Field(Tuple
& t
) { return t
.f6_
; } // NOLINT
1855 template <class Tuple
>
1856 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple
))
1857 ConstField(const Tuple
& t
) { return t
.f6_
; }
1863 template <class Tuple
>
1864 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple
))
1865 Field(Tuple
& t
) { return t
.f7_
; } // NOLINT
1867 template <class Tuple
>
1868 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple
))
1869 ConstField(const Tuple
& t
) { return t
.f7_
; }
1875 template <class Tuple
>
1876 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple
))
1877 Field(Tuple
& t
) { return t
.f8_
; } // NOLINT
1879 template <class Tuple
>
1880 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple
))
1881 ConstField(const Tuple
& t
) { return t
.f8_
; }
1887 template <class Tuple
>
1888 static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple
))
1889 Field(Tuple
& t
) { return t
.f9_
; } // NOLINT
1891 template <class Tuple
>
1892 static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple
))
1893 ConstField(const Tuple
& t
) { return t
.f9_
; }
1896 } // namespace gtest_internal
1898 template <int k
, GTEST_10_TYPENAMES_(T
)>
1899 GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k
, GTEST_10_TUPLE_(T
)))
1900 get(GTEST_10_TUPLE_(T
)& t
) {
1901 return gtest_internal::Get
<k
>::Field(t
);
1904 template <int k
, GTEST_10_TYPENAMES_(T
)>
1905 GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k
, GTEST_10_TUPLE_(T
)))
1906 get(const GTEST_10_TUPLE_(T
)& t
) {
1907 return gtest_internal::Get
<k
>::ConstField(t
);
1910 // 6.1.3.5 Relational operators
1912 // We only implement == and !=, as we don't have a need for the rest yet.
1914 namespace gtest_internal
{
1916 // SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
1917 // first k fields of t1 equals the first k fields of t2.
1918 // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
1920 template <int kSize1
, int kSize2
>
1921 struct SameSizeTuplePrefixComparator
;
1924 struct SameSizeTuplePrefixComparator
<0, 0> {
1925 template <class Tuple1
, class Tuple2
>
1926 static bool Eq(const Tuple1
& /* t1 */, const Tuple2
& /* t2 */) {
1932 struct SameSizeTuplePrefixComparator
<k
, k
> {
1933 template <class Tuple1
, class Tuple2
>
1934 static bool Eq(const Tuple1
& t1
, const Tuple2
& t2
) {
1935 return SameSizeTuplePrefixComparator
<k
- 1, k
- 1>::Eq(t1
, t2
) &&
1936 ::std::tr1::get
<k
- 1>(t1
) == ::std::tr1::get
<k
- 1>(t2
);
1940 } // namespace gtest_internal
1942 template <GTEST_10_TYPENAMES_(T
), GTEST_10_TYPENAMES_(U
)>
1943 inline bool operator==(const GTEST_10_TUPLE_(T
)& t
,
1944 const GTEST_10_TUPLE_(U
)& u
) {
1945 return gtest_internal::SameSizeTuplePrefixComparator
<
1946 tuple_size
<GTEST_10_TUPLE_(T
) >::value
,
1947 tuple_size
<GTEST_10_TUPLE_(U
) >::value
>::Eq(t
, u
);
1950 template <GTEST_10_TYPENAMES_(T
), GTEST_10_TYPENAMES_(U
)>
1951 inline bool operator!=(const GTEST_10_TUPLE_(T
)& t
,
1952 const GTEST_10_TUPLE_(U
)& u
) { return !(t
== u
); }
1960 #undef GTEST_0_TUPLE_
1961 #undef GTEST_1_TUPLE_
1962 #undef GTEST_2_TUPLE_
1963 #undef GTEST_3_TUPLE_
1964 #undef GTEST_4_TUPLE_
1965 #undef GTEST_5_TUPLE_
1966 #undef GTEST_6_TUPLE_
1967 #undef GTEST_7_TUPLE_
1968 #undef GTEST_8_TUPLE_
1969 #undef GTEST_9_TUPLE_
1970 #undef GTEST_10_TUPLE_
1972 #undef GTEST_0_TYPENAMES_
1973 #undef GTEST_1_TYPENAMES_
1974 #undef GTEST_2_TYPENAMES_
1975 #undef GTEST_3_TYPENAMES_
1976 #undef GTEST_4_TYPENAMES_
1977 #undef GTEST_5_TYPENAMES_
1978 #undef GTEST_6_TYPENAMES_
1979 #undef GTEST_7_TYPENAMES_
1980 #undef GTEST_8_TYPENAMES_
1981 #undef GTEST_9_TYPENAMES_
1982 #undef GTEST_10_TYPENAMES_
1984 #undef GTEST_DECLARE_TUPLE_AS_FRIEND_
1985 #undef GTEST_BY_REF_
1986 #undef GTEST_ADD_REF_
1987 #undef GTEST_TUPLE_ELEMENT_
1989 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
1990 # elif GTEST_OS_SYMBIAN
1992 // On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
1993 // use STLport's tuple implementation, which unfortunately doesn't
1994 // work as the copy of STLport distributed with Symbian is incomplete.
1995 // By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
1996 // use its own tuple implementation.
1997 # ifdef BOOST_HAS_TR1_TUPLE
1998 # undef BOOST_HAS_TR1_TUPLE
1999 # endif // BOOST_HAS_TR1_TUPLE
2001 // This prevents <boost/tr1/detail/config.hpp>, which defines
2002 // BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
2003 # define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
2004 # include <tuple> // IWYU pragma: export // NOLINT
2006 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
2007 // GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
2008 // not conform to the TR1 spec, which requires the header to be <tuple>.
2010 # if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
2011 // Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
2012 // which is #included by <tr1/tuple>, to not compile when RTTI is
2013 // disabled. _TR1_FUNCTIONAL is the header guard for
2014 // <tr1/functional>. Hence the following #define is used to prevent
2015 // <tr1/functional> from being included.
2016 # define _TR1_FUNCTIONAL 1
2017 # include <tr1/tuple>
2018 # undef _TR1_FUNCTIONAL // Allows the user to #include
2019 // <tr1/functional> if they choose to.
2021 # include <tr1/tuple> // NOLINT
2022 # endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
2024 // VS 2010 now has tr1 support.
2025 # elif _MSC_VER >= 1600
2026 # include <tuple> // IWYU pragma: export // NOLINT
2028 # else // GTEST_USE_OWN_TR1_TUPLE
2029 # include <tr1/tuple> // IWYU pragma: export // NOLINT
2030 # endif // GTEST_USE_OWN_TR1_TUPLE
2032 #endif // GTEST_HAS_TR1_TUPLE
2034 // Determines whether clone(2) is supported.
2035 // Usually it will only be available on Linux, excluding
2036 // Linux on the Itanium architecture.
2037 // Also see http://linux.die.net/man/2/clone.
2038 #ifndef GTEST_HAS_CLONE
2039 // The user didn't tell us, so we need to figure it out.
2041 # if GTEST_OS_LINUX && !defined(__ia64__)
2042 # if GTEST_OS_LINUX_ANDROID
2043 // On Android, clone() became available at different API levels for each 32-bit
2045 # if defined(__LP64__) || \
2046 (defined(__arm__) && __ANDROID_API__ >= 9) || \
2047 (defined(__mips__) && __ANDROID_API__ >= 12) || \
2048 (defined(__i386__) && __ANDROID_API__ >= 17)
2049 # define GTEST_HAS_CLONE 1
2051 # define GTEST_HAS_CLONE 0
2054 # define GTEST_HAS_CLONE 1
2057 # define GTEST_HAS_CLONE 0
2058 # endif // GTEST_OS_LINUX && !defined(__ia64__)
2060 #endif // GTEST_HAS_CLONE
2062 // Determines whether to support stream redirection. This is used to test
2063 // output correctness and to implement death tests.
2064 #ifndef GTEST_HAS_STREAM_REDIRECTION
2065 // By default, we assume that stream redirection is supported on all
2066 // platforms except known mobile ones.
2067 # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \
2068 GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
2069 # define GTEST_HAS_STREAM_REDIRECTION 0
2071 # define GTEST_HAS_STREAM_REDIRECTION 1
2072 # endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
2073 #endif // GTEST_HAS_STREAM_REDIRECTION
2075 // Determines whether to support death tests.
2076 // Google Test does not support death tests for VC 7.1 and earlier as
2077 // abort() in a VC 7.1 application compiled as GUI in debug config
2078 // pops up a dialog window that cannot be suppressed programmatically.
2079 #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
2080 (GTEST_OS_MAC && !GTEST_OS_IOS) || \
2081 (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
2082 GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
2083 GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \
2084 GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)
2085 # define GTEST_HAS_DEATH_TEST 1
2088 // Determines whether to support type-driven tests.
2090 // Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
2091 // Sun Pro CC, IBM Visual Age, and HP aCC support.
2092 #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
2093 defined(__IBMCPP__) || defined(__HP_aCC)
2094 # define GTEST_HAS_TYPED_TEST 1
2095 # define GTEST_HAS_TYPED_TEST_P 1
2098 // Determines whether to support Combine(). This only makes sense when
2099 // value-parameterized tests are enabled. The implementation doesn't
2100 // work on Sun Studio since it doesn't understand templated conversion
2102 #if (GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_) && !defined(__SUNPRO_CC)
2103 # define GTEST_HAS_COMBINE 1
2106 // Determines whether the system compiler uses UTF-16 for encoding wide strings.
2107 #define GTEST_WIDE_STRING_USES_UTF16_ \
2108 (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
2110 // Determines whether test results can be streamed to a socket.
2112 # define GTEST_CAN_STREAM_RESULTS_ 1
2115 // Defines some utility macros.
2117 // The GNU compiler emits a warning if nested "if" statements are followed by
2118 // an "else" statement and braces are not used to explicitly disambiguate the
2119 // "else" binding. This leads to problems with code like:
2122 // ASSERT_*(condition) << "Some message";
2124 // The "switch (0) case 0:" idiom is used to suppress this.
2125 #ifdef __INTEL_COMPILER
2126 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_
2128 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
2131 // Use this annotation at the end of a struct/class definition to
2132 // prevent the compiler from optimizing away instances that are never
2133 // used. This is useful when all interesting logic happens inside the
2134 // c'tor and / or d'tor. Example:
2138 // } GTEST_ATTRIBUTE_UNUSED_;
2140 // Also use it after a variable or parameter declaration to tell the
2141 // compiler the variable/parameter does not have to be used.
2142 #if defined(__GNUC__) && !defined(COMPILER_ICC)
2143 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
2144 #elif defined(__clang__)
2145 # if __has_attribute(unused)
2146 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
2149 #ifndef GTEST_ATTRIBUTE_UNUSED_
2150 # define GTEST_ATTRIBUTE_UNUSED_
2153 #if GTEST_LANG_CXX11
2154 # define GTEST_CXX11_EQUALS_DELETE_ = delete
2155 #else // GTEST_LANG_CXX11
2156 # define GTEST_CXX11_EQUALS_DELETE_
2157 #endif // GTEST_LANG_CXX11
2159 // Use this annotation before a function that takes a printf format string.
2160 #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)
2161 # if defined(__MINGW_PRINTF_FORMAT)
2162 // MinGW has two different printf implementations. Ensure the format macro
2163 // matches the selected implementation. See
2164 // https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.
2165 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
2166 __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \
2169 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
2170 __attribute__((__format__(__printf__, string_index, first_to_check)))
2173 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)
2177 // A macro to disallow operator=
2178 // This should be used in the private: declarations for a class.
2179 #define GTEST_DISALLOW_ASSIGN_(type) \
2180 void operator=(type const &) GTEST_CXX11_EQUALS_DELETE_
2182 // A macro to disallow copy constructor and operator=
2183 // This should be used in the private: declarations for a class.
2184 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
2185 type(type const &) GTEST_CXX11_EQUALS_DELETE_; \
2186 GTEST_DISALLOW_ASSIGN_(type)
2188 // Tell the compiler to warn about unused return values for functions declared
2189 // with this macro. The macro should be used on function declarations
2190 // following the argument list:
2192 // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
2193 #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
2194 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
2196 # define GTEST_MUST_USE_RESULT_
2197 #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
2199 // MS C++ compiler emits warning when a conditional expression is compile time
2200 // constant. In some contexts this warning is false positive and needs to be
2201 // suppressed. Use the following two macros in such cases:
2203 // GTEST_INTENTIONAL_CONST_COND_PUSH_()
2205 // GTEST_INTENTIONAL_CONST_COND_POP_()
2207 # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \
2208 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)
2209 # define GTEST_INTENTIONAL_CONST_COND_POP_() \
2210 GTEST_DISABLE_MSC_WARNINGS_POP_()
2212 // Determine whether the compiler supports Microsoft's Structured Exception
2213 // Handling. This is supported by several Windows compilers but generally
2214 // does not exist on any other system.
2215 #ifndef GTEST_HAS_SEH
2216 // The user didn't tell us, so we need to figure it out.
2218 # if defined(_MSC_VER) || defined(__BORLANDC__)
2219 // These two compilers are known to support SEH.
2220 # define GTEST_HAS_SEH 1
2223 # define GTEST_HAS_SEH 0
2226 #define GTEST_IS_THREADSAFE \
2227 (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \
2228 || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \
2229 || GTEST_HAS_PTHREAD)
2231 #endif // GTEST_HAS_SEH
2233 // GTEST_API_ qualifies all symbols that must be exported. The definitions below
2234 // are guarded by #ifndef to give embedders a chance to define GTEST_API_ in
2235 // gtest/internal/custom/gtest-port.h
2239 # if GTEST_LINKED_AS_SHARED_LIBRARY
2240 # define GTEST_API_ __declspec(dllimport)
2241 # elif GTEST_CREATE_SHARED_LIBRARY
2242 # define GTEST_API_ __declspec(dllexport)
2244 #elif __GNUC__ >= 4 || defined(__clang__)
2245 # define GTEST_API_ __attribute__((visibility ("default")))
2248 #endif // GTEST_API_
2252 #endif // GTEST_API_
2254 #ifndef GTEST_DEFAULT_DEATH_TEST_STYLE
2255 # define GTEST_DEFAULT_DEATH_TEST_STYLE "fast"
2256 #endif // GTEST_DEFAULT_DEATH_TEST_STYLE
2259 // Ask the compiler to never inline a given function.
2260 # define GTEST_NO_INLINE_ __attribute__((noinline))
2262 # define GTEST_NO_INLINE_
2265 // _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
2266 #if !defined(GTEST_HAS_CXXABI_H_)
2267 # if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER))
2268 # define GTEST_HAS_CXXABI_H_ 1
2270 # define GTEST_HAS_CXXABI_H_ 0
2274 // A function level attribute to disable checking for use of uninitialized
2275 // memory when built with MemorySanitizer.
2276 #if defined(__clang__)
2277 # if __has_feature(memory_sanitizer)
2278 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \
2279 __attribute__((no_sanitize_memory))
2281 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
2282 # endif // __has_feature(memory_sanitizer)
2284 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
2287 // A function level attribute to disable AddressSanitizer instrumentation.
2288 #if defined(__clang__)
2289 # if __has_feature(address_sanitizer)
2290 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \
2291 __attribute__((no_sanitize_address))
2293 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
2294 # endif // __has_feature(address_sanitizer)
2296 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
2299 // A function level attribute to disable ThreadSanitizer instrumentation.
2300 #if defined(__clang__)
2301 # if __has_feature(thread_sanitizer)
2302 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \
2303 __attribute__((no_sanitize_thread))
2305 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
2306 # endif // __has_feature(thread_sanitizer)
2308 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
2315 #if defined(GTEST_TUPLE_NAMESPACE_)
2316 // Import tuple and friends into the ::testing namespace.
2317 // It is part of our interface, having them in ::testing allows us to change
2318 // their types as needed.
2319 using GTEST_TUPLE_NAMESPACE_::get
;
2320 using GTEST_TUPLE_NAMESPACE_::make_tuple
;
2321 using GTEST_TUPLE_NAMESPACE_::tuple
;
2322 using GTEST_TUPLE_NAMESPACE_::tuple_size
;
2323 using GTEST_TUPLE_NAMESPACE_::tuple_element
;
2324 #endif // defined(GTEST_TUPLE_NAMESPACE_)
2326 namespace internal
{
2328 // A secret type that Google Test users don't know about. It has no
2329 // definition on purpose. Therefore it's impossible to create a
2330 // Secret object, which is what we want.
2333 // The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
2334 // expression is true. For example, you could use it to verify the
2335 // size of a static array:
2337 // GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,
2338 // names_incorrect_size);
2340 // or to make sure a struct is smaller than a certain size:
2342 // GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
2344 // The second argument to the macro is the name of the variable. If
2345 // the expression is false, most compilers will issue a warning/error
2346 // containing the name of the variable.
2348 #if GTEST_LANG_CXX11
2349 # define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
2350 #else // !GTEST_LANG_CXX11
2352 struct CompileAssert
{
2355 # define GTEST_COMPILE_ASSERT_(expr, msg) \
2356 typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
2357 msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
2358 #endif // !GTEST_LANG_CXX11
2360 // Implementation details of GTEST_COMPILE_ASSERT_:
2362 // (In C++11, we simply use static_assert instead of the following)
2364 // - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
2365 // elements (and thus is invalid) when the expression is false.
2367 // - The simpler definition
2369 // #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
2371 // does not work, as gcc supports variable-length arrays whose sizes
2372 // are determined at run-time (this is gcc's extension and not part
2373 // of the C++ standard). As a result, gcc fails to reject the
2374 // following code with the simple definition:
2377 // GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
2378 // // not a compile-time constant.
2380 // - By using the type CompileAssert<(bool(expr))>, we ensures that
2381 // expr is a compile-time constant. (Template arguments must be
2382 // determined at compile-time.)
2384 // - The outter parentheses in CompileAssert<(bool(expr))> are necessary
2385 // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
2387 // CompileAssert<bool(expr)>
2389 // instead, these compilers will refuse to compile
2391 // GTEST_COMPILE_ASSERT_(5 > 0, some_message);
2393 // (They seem to think the ">" in "5 > 0" marks the end of the
2394 // template argument list.)
2396 // - The array size is (bool(expr) ? 1 : -1), instead of simply
2398 // ((expr) ? 1 : -1).
2400 // This is to avoid running into a bug in MS VC 7.1, which
2401 // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
2403 // StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
2405 // This template is declared, but intentionally undefined.
2406 template <typename T1
, typename T2
>
2407 struct StaticAssertTypeEqHelper
;
2409 template <typename T
>
2410 struct StaticAssertTypeEqHelper
<T
, T
> {
2411 enum { value
= true };
2414 // Same as std::is_same<>.
2415 template <typename T
, typename U
>
2417 enum { value
= false };
2419 template <typename T
>
2420 struct IsSame
<T
, T
> {
2421 enum { value
= true };
2424 // Evaluates to the number of elements in 'array'.
2425 #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
2427 #if GTEST_HAS_GLOBAL_STRING
2428 typedef ::string string
;
2430 typedef ::std::string string
;
2431 #endif // GTEST_HAS_GLOBAL_STRING
2433 #if GTEST_HAS_GLOBAL_WSTRING
2434 typedef ::wstring wstring
;
2435 #elif GTEST_HAS_STD_WSTRING
2436 typedef ::std::wstring wstring
;
2437 #endif // GTEST_HAS_GLOBAL_WSTRING
2439 // A helper for suppressing warnings on constant condition. It just
2440 // returns 'condition'.
2441 GTEST_API_
bool IsTrue(bool condition
);
2443 // Defines scoped_ptr.
2445 // This implementation of scoped_ptr is PARTIAL - it only contains
2446 // enough stuff to satisfy Google Test's need.
2447 template <typename T
>
2450 typedef T element_type
;
2452 explicit scoped_ptr(T
* p
= NULL
) : ptr_(p
) {}
2453 ~scoped_ptr() { reset(); }
2455 T
& operator*() const { return *ptr_
; }
2456 T
* operator->() const { return ptr_
; }
2457 T
* get() const { return ptr_
; }
2460 T
* const ptr
= ptr_
;
2465 void reset(T
* p
= NULL
) {
2467 if (IsTrue(sizeof(T
) > 0)) { // Makes sure T is a complete type.
2474 friend void swap(scoped_ptr
& a
, scoped_ptr
& b
) {
2476 swap(a
.ptr_
, b
.ptr_
);
2482 GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr
);
2488 // if used, PCRE is injected by custom/gtest-port.h
2489 #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE
2491 // A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
2492 // Regular Expression syntax.
2493 class GTEST_API_ RE
{
2495 // A copy constructor is required by the Standard to initialize object
2496 // references from r-values.
2497 RE(const RE
& other
) { Init(other
.pattern()); }
2499 // Constructs an RE from a string.
2500 RE(const ::std::string
& regex
) { Init(regex
.c_str()); } // NOLINT
2502 # if GTEST_HAS_GLOBAL_STRING
2504 RE(const ::string
& regex
) { Init(regex
.c_str()); } // NOLINT
2506 # endif // GTEST_HAS_GLOBAL_STRING
2508 RE(const char* regex
) { Init(regex
); } // NOLINT
2511 // Returns the string representation of the regex.
2512 const char* pattern() const { return pattern_
; }
2514 // FullMatch(str, re) returns true iff regular expression re matches
2516 // PartialMatch(str, re) returns true iff regular expression re
2517 // matches a substring of str (including str itself).
2519 // FIXME: make FullMatch() and PartialMatch() work
2520 // when str contains NUL characters.
2521 static bool FullMatch(const ::std::string
& str
, const RE
& re
) {
2522 return FullMatch(str
.c_str(), re
);
2524 static bool PartialMatch(const ::std::string
& str
, const RE
& re
) {
2525 return PartialMatch(str
.c_str(), re
);
2528 # if GTEST_HAS_GLOBAL_STRING
2530 static bool FullMatch(const ::string
& str
, const RE
& re
) {
2531 return FullMatch(str
.c_str(), re
);
2533 static bool PartialMatch(const ::string
& str
, const RE
& re
) {
2534 return PartialMatch(str
.c_str(), re
);
2537 # endif // GTEST_HAS_GLOBAL_STRING
2539 static bool FullMatch(const char* str
, const RE
& re
);
2540 static bool PartialMatch(const char* str
, const RE
& re
);
2543 void Init(const char* regex
);
2545 // We use a const char* instead of an std::string, as Google Test used to be
2546 // used where std::string is not available. FIXME: change to
2548 const char* pattern_
;
2551 # if GTEST_USES_POSIX_RE
2553 regex_t full_regex_
; // For FullMatch().
2554 regex_t partial_regex_
; // For PartialMatch().
2556 # else // GTEST_USES_SIMPLE_RE
2558 const char* full_pattern_
; // For FullMatch();
2562 GTEST_DISALLOW_ASSIGN_(RE
);
2565 #endif // GTEST_USES_PCRE
2567 // Formats a source file path and a line number as they would appear
2568 // in an error message from the compiler used to compile this code.
2569 GTEST_API_ ::std::string
FormatFileLocation(const char* file
, int line
);
2571 // Formats a file location for compiler-independent XML output.
2572 // Although this function is not platform dependent, we put it next to
2573 // FormatFileLocation in order to contrast the two functions.
2574 GTEST_API_ ::std::string
FormatCompilerIndependentFileLocation(const char* file
,
2577 // Defines logging utilities:
2578 // GTEST_LOG_(severity) - logs messages at the specified severity level. The
2579 // message itself is streamed into the macro.
2580 // LogToStderr() - directs all log messages to stderr.
2581 // FlushInfoLog() - flushes informational log messages.
2583 enum GTestLogSeverity
{
2590 // Formats log entry severity, provides a stream object for streaming the
2591 // log message, and terminates the message with a newline when going out of
2593 class GTEST_API_ GTestLog
{
2595 GTestLog(GTestLogSeverity severity
, const char* file
, int line
);
2597 // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
2600 ::std::ostream
& GetStream() { return ::std::cerr
; }
2603 const GTestLogSeverity severity_
;
2605 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog
);
2608 #if !defined(GTEST_LOG_)
2610 # define GTEST_LOG_(severity) \
2611 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
2612 __FILE__, __LINE__).GetStream()
2614 inline void LogToStderr() {}
2615 inline void FlushInfoLog() { fflush(NULL
); }
2617 #endif // !defined(GTEST_LOG_)
2619 #if !defined(GTEST_CHECK_)
2620 // INTERNAL IMPLEMENTATION - DO NOT USE.
2622 // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
2623 // is not satisfied.
2625 // GTEST_CHECK_(boolean_condition);
2627 // GTEST_CHECK_(boolean_condition) << "Additional message";
2629 // This checks the condition and if the condition is not satisfied
2630 // it prints message about the condition violation, including the
2631 // condition itself, plus additional message streamed into it, if any,
2632 // and then it aborts the program. It aborts the program irrespective of
2633 // whether it is built in the debug mode or not.
2634 # define GTEST_CHECK_(condition) \
2635 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
2636 if (::testing::internal::IsTrue(condition)) \
2639 GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
2640 #endif // !defined(GTEST_CHECK_)
2642 // An all-mode assert to verify that the given POSIX-style function
2643 // call returns 0 (indicating success). Known limitation: this
2644 // doesn't expand to a balanced 'if' statement, so enclose the macro
2645 // in {} if you need to use it as the only statement in an 'if'
2647 #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
2648 if (const int gtest_error = (posix_call)) \
2649 GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
2652 // Adds reference to a type if it is not a reference type,
2653 // otherwise leaves it unchanged. This is the same as
2654 // tr1::add_reference, which is not widely available yet.
2655 template <typename T
>
2656 struct AddReference
{ typedef T
& type
; }; // NOLINT
2657 template <typename T
>
2658 struct AddReference
<T
&> { typedef T
& type
; }; // NOLINT
2660 // A handy wrapper around AddReference that works when the argument T
2661 // depends on template parameters.
2662 #define GTEST_ADD_REFERENCE_(T) \
2663 typename ::testing::internal::AddReference<T>::type
2665 // Transforms "T" into "const T&" according to standard reference collapsing
2666 // rules (this is only needed as a backport for C++98 compilers that do not
2667 // support reference collapsing). Specifically, it transforms:
2669 // char ==> const char&
2670 // const char ==> const char&
2672 // const char& ==> const char&
2674 // Note that the non-const reference will not have "const" added. This is
2675 // standard, and necessary so that "T" can always bind to "const T&".
2676 template <typename T
>
2677 struct ConstRef
{ typedef const T
& type
; };
2678 template <typename T
>
2679 struct ConstRef
<T
&> { typedef T
& type
; };
2681 // The argument T must depend on some template parameters.
2682 #define GTEST_REFERENCE_TO_CONST_(T) \
2683 typename ::testing::internal::ConstRef<T>::type
2685 #if GTEST_HAS_STD_MOVE_
2689 template <typename T
>
2693 #else // GTEST_HAS_STD_MOVE_
2694 template <typename T
>
2695 const T
& move(const T
& t
) {
2698 template <typename T
>
2699 GTEST_ADD_REFERENCE_(T
) forward(GTEST_ADD_REFERENCE_(T
) t
) { return t
; }
2701 template <typename T
>
2703 typedef const T
& type
;
2705 #endif // GTEST_HAS_STD_MOVE_
2707 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2709 // Use ImplicitCast_ as a safe version of static_cast for upcasting in
2710 // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
2711 // const Foo*). When you use ImplicitCast_, the compiler checks that
2712 // the cast is safe. Such explicit ImplicitCast_s are necessary in
2713 // surprisingly many situations where C++ demands an exact type match
2714 // instead of an argument type convertable to a target type.
2716 // The syntax for using ImplicitCast_ is the same as for static_cast:
2718 // ImplicitCast_<ToType>(expr)
2720 // ImplicitCast_ would have been part of the C++ standard library,
2721 // but the proposal was submitted too late. It will probably make
2722 // its way into the language in the future.
2724 // This relatively ugly name is intentional. It prevents clashes with
2725 // similar functions users may have (e.g., implicit_cast). The internal
2726 // namespace alone is not enough because the function can be found by ADL.
2727 template<typename To
>
2728 inline To
ImplicitCast_(To x
) { return x
; }
2730 // When you upcast (that is, cast a pointer from type Foo to type
2731 // SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
2732 // always succeed. When you downcast (that is, cast a pointer from
2733 // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
2734 // how do you know the pointer is really of type SubclassOfFoo? It
2735 // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
2736 // when you downcast, you should use this macro. In debug mode, we
2737 // use dynamic_cast<> to double-check the downcast is legal (we die
2738 // if it's not). In normal mode, we do the efficient static_cast<>
2739 // instead. Thus, it's important to test in debug mode to make sure
2740 // the cast is legal!
2741 // This is the only place in the code we should use dynamic_cast<>.
2742 // In particular, you SHOULDN'T be using dynamic_cast<> in order to
2743 // do RTTI (eg code like this:
2744 // if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
2745 // if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
2746 // You should design the code some other way not to need this.
2748 // This relatively ugly name is intentional. It prevents clashes with
2749 // similar functions users may have (e.g., down_cast). The internal
2750 // namespace alone is not enough because the function can be found by ADL.
2751 template<typename To
, typename From
> // use like this: DownCast_<T*>(foo);
2752 inline To
DownCast_(From
* f
) { // so we only accept pointers
2753 // Ensures that To is a sub-type of From *. This test is here only
2754 // for compile-time type checking, and has no overhead in an
2755 // optimized build at run-time, as it will be optimized away
2757 GTEST_INTENTIONAL_CONST_COND_PUSH_()
2759 GTEST_INTENTIONAL_CONST_COND_POP_()
2761 ::testing::internal::ImplicitCast_
<From
*>(to
);
2765 // RTTI: debug mode only!
2766 GTEST_CHECK_(f
== NULL
|| dynamic_cast<To
>(f
) != NULL
);
2768 return static_cast<To
>(f
);
2771 // Downcasts the pointer of type Base to Derived.
2772 // Derived must be a subclass of Base. The parameter MUST
2773 // point to a class of type Derived, not any subclass of it.
2774 // When RTTI is available, the function performs a runtime
2775 // check to enforce this.
2776 template <class Derived
, class Base
>
2777 Derived
* CheckedDowncastToActualType(Base
* base
) {
2779 GTEST_CHECK_(typeid(*base
) == typeid(Derived
));
2782 #if GTEST_HAS_DOWNCAST_
2783 return ::down_cast
<Derived
*>(base
);
2784 #elif GTEST_HAS_RTTI
2785 return dynamic_cast<Derived
*>(base
); // NOLINT
2787 return static_cast<Derived
*>(base
); // Poor man's downcast.
2791 #if GTEST_HAS_STREAM_REDIRECTION
2793 // Defines the stderr capturer:
2794 // CaptureStdout - starts capturing stdout.
2795 // GetCapturedStdout - stops capturing stdout and returns the captured string.
2796 // CaptureStderr - starts capturing stderr.
2797 // GetCapturedStderr - stops capturing stderr and returns the captured string.
2799 GTEST_API_
void CaptureStdout();
2800 GTEST_API_
std::string
GetCapturedStdout();
2801 GTEST_API_
void CaptureStderr();
2802 GTEST_API_
std::string
GetCapturedStderr();
2804 #endif // GTEST_HAS_STREAM_REDIRECTION
2805 // Returns the size (in bytes) of a file.
2806 GTEST_API_
size_t GetFileSize(FILE* file
);
2808 // Reads the entire content of a file as a string.
2809 GTEST_API_
std::string
ReadEntireFile(FILE* file
);
2811 // All command line arguments.
2812 GTEST_API_
std::vector
<std::string
> GetArgvs();
2814 #if GTEST_HAS_DEATH_TEST
2816 std::vector
<std::string
> GetInjectableArgvs();
2817 // Deprecated: pass the args vector by value instead.
2818 void SetInjectableArgvs(const std::vector
<std::string
>* new_argvs
);
2819 void SetInjectableArgvs(const std::vector
<std::string
>& new_argvs
);
2820 #if GTEST_HAS_GLOBAL_STRING
2821 void SetInjectableArgvs(const std::vector
< ::string
>& new_argvs
);
2822 #endif // GTEST_HAS_GLOBAL_STRING
2823 void ClearInjectableArgvs();
2825 #endif // GTEST_HAS_DEATH_TEST
2827 // Defines synchronization primitives.
2828 #if GTEST_IS_THREADSAFE
2829 # if GTEST_HAS_PTHREAD
2830 // Sleeps for (roughly) n milliseconds. This function is only for testing
2831 // Google Test's own constructs. Don't use it in user tests, either
2832 // directly or indirectly.
2833 inline void SleepMilliseconds(int n
) {
2834 const timespec time
= {
2836 n
* 1000L * 1000L, // And n ms.
2838 nanosleep(&time
, NULL
);
2840 # endif // GTEST_HAS_PTHREAD
2842 # if GTEST_HAS_NOTIFICATION_
2843 // Notification has already been imported into the namespace.
2844 // Nothing to do here.
2846 # elif GTEST_HAS_PTHREAD
2847 // Allows a controller thread to pause execution of newly created
2848 // threads until notified. Instances of this class must be created
2849 // and destroyed in the controller thread.
2851 // This class is only for testing Google Test's own constructs. Do not
2852 // use it in user tests, either directly or indirectly.
2853 class Notification
{
2855 Notification() : notified_(false) {
2856 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_
, NULL
));
2859 pthread_mutex_destroy(&mutex_
);
2862 // Notifies all threads created with this notification to start. Must
2863 // be called from the controller thread.
2865 pthread_mutex_lock(&mutex_
);
2867 pthread_mutex_unlock(&mutex_
);
2870 // Blocks until the controller thread notifies. Must be called from a test
2872 void WaitForNotification() {
2874 pthread_mutex_lock(&mutex_
);
2875 const bool notified
= notified_
;
2876 pthread_mutex_unlock(&mutex_
);
2879 SleepMilliseconds(10);
2884 pthread_mutex_t mutex_
;
2887 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification
);
2890 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
2892 GTEST_API_
void SleepMilliseconds(int n
);
2894 // Provides leak-safe Windows kernel handle ownership.
2895 // Used in death tests and in threading support.
2896 class GTEST_API_ AutoHandle
{
2898 // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to
2899 // avoid including <windows.h> in this header file. Including <windows.h> is
2900 // undesirable because it defines a lot of symbols and macros that tend to
2901 // conflict with client code. This assumption is verified by
2902 // WindowsTypesTest.HANDLEIsVoidStar.
2903 typedef void* Handle
;
2905 explicit AutoHandle(Handle handle
);
2911 void Reset(Handle handle
);
2914 // Returns true iff the handle is a valid handle object that can be closed.
2915 bool IsCloseable() const;
2919 GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle
);
2922 // Allows a controller thread to pause execution of newly created
2923 // threads until notified. Instances of this class must be created
2924 // and destroyed in the controller thread.
2926 // This class is only for testing Google Test's own constructs. Do not
2927 // use it in user tests, either directly or indirectly.
2928 class GTEST_API_ Notification
{
2932 void WaitForNotification();
2937 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification
);
2939 # endif // GTEST_HAS_NOTIFICATION_
2941 // On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD
2942 // defined, but we don't want to use MinGW's pthreads implementation, which
2943 // has conformance problems with some versions of the POSIX standard.
2944 # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
2946 // As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
2947 // Consequently, it cannot select a correct instantiation of ThreadWithParam
2948 // in order to call its Run(). Introducing ThreadWithParamBase as a
2949 // non-templated base class for ThreadWithParam allows us to bypass this
2951 class ThreadWithParamBase
{
2953 virtual ~ThreadWithParamBase() {}
2954 virtual void Run() = 0;
2957 // pthread_create() accepts a pointer to a function type with the C linkage.
2958 // According to the Standard (7.5/1), function types with different linkages
2959 // are different even if they are otherwise identical. Some compilers (for
2960 // example, SunStudio) treat them as different types. Since class methods
2961 // cannot be defined with C-linkage we need to define a free C-function to
2962 // pass into pthread_create().
2963 extern "C" inline void* ThreadFuncWithCLinkage(void* thread
) {
2964 static_cast<ThreadWithParamBase
*>(thread
)->Run();
2968 // Helper class for testing Google Test's multi-threading constructs.
2969 // To use it, write:
2971 // void ThreadFunc(int param) { /* Do things with param */ }
2972 // Notification thread_can_start;
2974 // // The thread_can_start parameter is optional; you can supply NULL.
2975 // ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
2976 // thread_can_start.Notify();
2978 // These classes are only for testing Google Test's own constructs. Do
2979 // not use them in user tests, either directly or indirectly.
2980 template <typename T
>
2981 class ThreadWithParam
: public ThreadWithParamBase
{
2983 typedef void UserThreadFunc(T
);
2985 ThreadWithParam(UserThreadFunc
* func
, T param
, Notification
* thread_can_start
)
2988 thread_can_start_(thread_can_start
),
2990 ThreadWithParamBase
* const base
= this;
2991 // The thread can be created only after all fields except thread_
2992 // have been initialized.
2993 GTEST_CHECK_POSIX_SUCCESS_(
2994 pthread_create(&thread_
, 0, &ThreadFuncWithCLinkage
, base
));
2996 ~ThreadWithParam() { Join(); }
3000 GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_
, 0));
3005 virtual void Run() {
3006 if (thread_can_start_
!= NULL
)
3007 thread_can_start_
->WaitForNotification();
3012 UserThreadFunc
* const func_
; // User-supplied thread function.
3013 const T param_
; // User-supplied parameter to the thread function.
3014 // When non-NULL, used to block execution until the controller thread
3016 Notification
* const thread_can_start_
;
3017 bool finished_
; // true iff we know that the thread function has finished.
3018 pthread_t thread_
; // The native thread object.
3020 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam
);
3022 # endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||
3023 // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
3025 # if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
3026 // Mutex and ThreadLocal have already been imported into the namespace.
3027 // Nothing to do here.
3029 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
3031 // Mutex implements mutex on Windows platforms. It is used in conjunction
3032 // with class MutexLock:
3036 // MutexLock lock(&mutex); // Acquires the mutex and releases it at the
3037 // // end of the current scope.
3039 // A static Mutex *must* be defined or declared using one of the following
3041 // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
3042 // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
3044 // (A non-static Mutex is defined/declared in the usual way).
3045 class GTEST_API_ Mutex
{
3047 enum MutexType
{ kStatic
= 0, kDynamic
= 1 };
3048 // We rely on kStaticMutex being 0 as it is to what the linker initializes
3049 // type_ in static mutexes. critical_section_ will be initialized lazily
3050 // in ThreadSafeLazyInit().
3051 enum StaticConstructorSelector
{ kStaticMutex
= 0 };
3053 // This constructor intentionally does nothing. It relies on type_ being
3054 // statically initialized to 0 (effectively setting it to kStatic) and on
3055 // ThreadSafeLazyInit() to lazily initialize the rest of the members.
3056 explicit Mutex(StaticConstructorSelector
/*dummy*/) {}
3065 // Does nothing if the current thread holds the mutex. Otherwise, crashes
3066 // with high probability.
3070 // Initializes owner_thread_id_ and critical_section_ in static mutexes.
3071 void ThreadSafeLazyInit();
3073 // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503,
3074 // we assume that 0 is an invalid value for thread IDs.
3075 unsigned int owner_thread_id_
;
3077 // For static mutexes, we rely on these members being initialized to zeros
3080 long critical_section_init_phase_
; // NOLINT
3081 GTEST_CRITICAL_SECTION
* critical_section_
;
3083 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex
);
3086 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
3087 extern ::testing::internal::Mutex mutex
3089 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
3090 ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)
3092 // We cannot name this class MutexLock because the ctor declaration would
3093 // conflict with a macro named MutexLock, which is defined on some
3094 // platforms. That macro is used as a defensive measure to prevent against
3095 // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
3096 // "MutexLock l(&mu)". Hence the typedef trick below.
3097 class GTestMutexLock
{
3099 explicit GTestMutexLock(Mutex
* mutex
)
3100 : mutex_(mutex
) { mutex_
->Lock(); }
3102 ~GTestMutexLock() { mutex_
->Unlock(); }
3105 Mutex
* const mutex_
;
3107 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock
);
3110 typedef GTestMutexLock MutexLock
;
3112 // Base class for ValueHolder<T>. Allows a caller to hold and delete a value
3113 // without knowing its type.
3114 class ThreadLocalValueHolderBase
{
3116 virtual ~ThreadLocalValueHolderBase() {}
3119 // Provides a way for a thread to send notifications to a ThreadLocal
3120 // regardless of its parameter type.
3121 class ThreadLocalBase
{
3123 // Creates a new ValueHolder<T> object holding a default value passed to
3124 // this ThreadLocal<T>'s constructor and returns it. It is the caller's
3125 // responsibility not to call this when the ThreadLocal<T> instance already
3126 // has a value on the current thread.
3127 virtual ThreadLocalValueHolderBase
* NewValueForCurrentThread() const = 0;
3130 ThreadLocalBase() {}
3131 virtual ~ThreadLocalBase() {}
3134 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase
);
3137 // Maps a thread to a set of ThreadLocals that have values instantiated on that
3138 // thread and notifies them when the thread exits. A ThreadLocal instance is
3139 // expected to persist until all threads it has values on have terminated.
3140 class GTEST_API_ ThreadLocalRegistry
{
3142 // Registers thread_local_instance as having value on the current thread.
3143 // Returns a value that can be used to identify the thread from other threads.
3144 static ThreadLocalValueHolderBase
* GetValueOnCurrentThread(
3145 const ThreadLocalBase
* thread_local_instance
);
3147 // Invoked when a ThreadLocal instance is destroyed.
3148 static void OnThreadLocalDestroyed(
3149 const ThreadLocalBase
* thread_local_instance
);
3152 class GTEST_API_ ThreadWithParamBase
{
3159 virtual ~Runnable() {}
3160 virtual void Run() = 0;
3163 ThreadWithParamBase(Runnable
*runnable
, Notification
* thread_can_start
);
3164 virtual ~ThreadWithParamBase();
3170 // Helper class for testing Google Test's multi-threading constructs.
3171 template <typename T
>
3172 class ThreadWithParam
: public ThreadWithParamBase
{
3174 typedef void UserThreadFunc(T
);
3176 ThreadWithParam(UserThreadFunc
* func
, T param
, Notification
* thread_can_start
)
3177 : ThreadWithParamBase(new RunnableImpl(func
, param
), thread_can_start
) {
3179 virtual ~ThreadWithParam() {}
3182 class RunnableImpl
: public Runnable
{
3184 RunnableImpl(UserThreadFunc
* func
, T param
)
3188 virtual ~RunnableImpl() {}
3189 virtual void Run() {
3194 UserThreadFunc
* const func_
;
3197 GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl
);
3200 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam
);
3203 // Implements thread-local storage on Windows systems.
3206 // ThreadLocal<int> tl(100); // 100 is the default value for each thread.
3209 // tl.set(150); // Changes the value for thread 2 only.
3210 // EXPECT_EQ(150, tl.get());
3213 // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
3215 // EXPECT_EQ(200, tl.get());
3217 // The template type argument T must have a public copy constructor.
3218 // In addition, the default ThreadLocal constructor requires T to have
3219 // a public default constructor.
3221 // The users of a TheadLocal instance have to make sure that all but one
3222 // threads (including the main one) using that instance have exited before
3223 // destroying it. Otherwise, the per-thread objects managed for them by the
3224 // ThreadLocal instance are not guaranteed to be destroyed on all platforms.
3226 // Google Test only uses global ThreadLocal objects. That means they
3227 // will die after main() has returned. Therefore, no per-thread
3228 // object managed by Google Test will be leaked as long as all threads
3229 // using Google Test have exited when main() returns.
3230 template <typename T
>
3231 class ThreadLocal
: public ThreadLocalBase
{
3233 ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}
3234 explicit ThreadLocal(const T
& value
)
3235 : default_factory_(new InstanceValueHolderFactory(value
)) {}
3237 ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); }
3239 T
* pointer() { return GetOrCreateValue(); }
3240 const T
* pointer() const { return GetOrCreateValue(); }
3241 const T
& get() const { return *pointer(); }
3242 void set(const T
& value
) { *pointer() = value
; }
3245 // Holds a value of T. Can be deleted via its base class without the caller
3246 // knowing the type of T.
3247 class ValueHolder
: public ThreadLocalValueHolderBase
{
3249 ValueHolder() : value_() {}
3250 explicit ValueHolder(const T
& value
) : value_(value
) {}
3252 T
* pointer() { return &value_
; }
3256 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder
);
3260 T
* GetOrCreateValue() const {
3261 return static_cast<ValueHolder
*>(
3262 ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer();
3265 virtual ThreadLocalValueHolderBase
* NewValueForCurrentThread() const {
3266 return default_factory_
->MakeNewHolder();
3269 class ValueHolderFactory
{
3271 ValueHolderFactory() {}
3272 virtual ~ValueHolderFactory() {}
3273 virtual ValueHolder
* MakeNewHolder() const = 0;
3276 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory
);
3279 class DefaultValueHolderFactory
: public ValueHolderFactory
{
3281 DefaultValueHolderFactory() {}
3282 virtual ValueHolder
* MakeNewHolder() const { return new ValueHolder(); }
3285 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory
);
3288 class InstanceValueHolderFactory
: public ValueHolderFactory
{
3290 explicit InstanceValueHolderFactory(const T
& value
) : value_(value
) {}
3291 virtual ValueHolder
* MakeNewHolder() const {
3292 return new ValueHolder(value_
);
3296 const T value_
; // The value for each thread.
3298 GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory
);
3301 scoped_ptr
<ValueHolderFactory
> default_factory_
;
3303 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal
);
3306 # elif GTEST_HAS_PTHREAD
3308 // MutexBase and Mutex implement mutex on pthreads-based platforms.
3311 // Acquires this mutex.
3313 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_
));
3314 owner_
= pthread_self();
3318 // Releases this mutex.
3320 // Since the lock is being released the owner_ field should no longer be
3321 // considered valid. We don't protect writing to has_owner_ here, as it's
3322 // the caller's responsibility to ensure that the current thread holds the
3323 // mutex when this is called.
3325 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_
));
3328 // Does nothing if the current thread holds the mutex. Otherwise, crashes
3329 // with high probability.
3330 void AssertHeld() const {
3331 GTEST_CHECK_(has_owner_
&& pthread_equal(owner_
, pthread_self()))
3332 << "The current thread is not holding the mutex @" << this;
3335 // A static mutex may be used before main() is entered. It may even
3336 // be used before the dynamic initialization stage. Therefore we
3337 // must be able to initialize a static mutex object at link time.
3338 // This means MutexBase has to be a POD and its member variables
3339 // have to be public.
3341 pthread_mutex_t mutex_
; // The underlying pthread mutex.
3342 // has_owner_ indicates whether the owner_ field below contains a valid thread
3343 // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
3344 // accesses to the owner_ field should be protected by a check of this field.
3345 // An alternative might be to memset() owner_ to all zeros, but there's no
3346 // guarantee that a zero'd pthread_t is necessarily invalid or even different
3347 // from pthread_self().
3349 pthread_t owner_
; // The thread holding the mutex.
3352 // Forward-declares a static mutex.
3353 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
3354 extern ::testing::internal::MutexBase mutex
3356 // Defines and statically (i.e. at link time) initializes a static mutex.
3357 // The initialization list here does not explicitly initialize each field,
3358 // instead relying on default initialization for the unspecified fields. In
3359 // particular, the owner_ field (a pthread_t) is not explicitly initialized.
3360 // This allows initialization to work whether pthread_t is a scalar or struct.
3361 // The flag -Wmissing-field-initializers must not be specified for this to work.
3362 #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
3363 ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0}
3365 // The Mutex class can only be used for mutexes created at runtime. It
3366 // shares its API with MutexBase otherwise.
3367 class Mutex
: public MutexBase
{
3370 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_
, NULL
));
3374 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_
));
3378 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex
);
3381 // We cannot name this class MutexLock because the ctor declaration would
3382 // conflict with a macro named MutexLock, which is defined on some
3383 // platforms. That macro is used as a defensive measure to prevent against
3384 // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
3385 // "MutexLock l(&mu)". Hence the typedef trick below.
3386 class GTestMutexLock
{
3388 explicit GTestMutexLock(MutexBase
* mutex
)
3389 : mutex_(mutex
) { mutex_
->Lock(); }
3391 ~GTestMutexLock() { mutex_
->Unlock(); }
3394 MutexBase
* const mutex_
;
3396 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock
);
3399 typedef GTestMutexLock MutexLock
;
3401 // Helpers for ThreadLocal.
3403 // pthread_key_create() requires DeleteThreadLocalValue() to have
3404 // C-linkage. Therefore it cannot be templatized to access
3405 // ThreadLocal<T>. Hence the need for class
3406 // ThreadLocalValueHolderBase.
3407 class ThreadLocalValueHolderBase
{
3409 virtual ~ThreadLocalValueHolderBase() {}
3412 // Called by pthread to delete thread-local data stored by
3413 // pthread_setspecific().
3414 extern "C" inline void DeleteThreadLocalValue(void* value_holder
) {
3415 delete static_cast<ThreadLocalValueHolderBase
*>(value_holder
);
3418 // Implements thread-local storage on pthreads-based systems.
3419 template <typename T
>
3420 class GTEST_API_ ThreadLocal
{
3423 : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
3424 explicit ThreadLocal(const T
& value
)
3425 : key_(CreateKey()),
3426 default_factory_(new InstanceValueHolderFactory(value
)) {}
3429 // Destroys the managed object for the current thread, if any.
3430 DeleteThreadLocalValue(pthread_getspecific(key_
));
3432 // Releases resources associated with the key. This will *not*
3433 // delete managed objects for other threads.
3434 GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_
));
3437 T
* pointer() { return GetOrCreateValue(); }
3438 const T
* pointer() const { return GetOrCreateValue(); }
3439 const T
& get() const { return *pointer(); }
3440 void set(const T
& value
) { *pointer() = value
; }
3443 // Holds a value of type T.
3444 class ValueHolder
: public ThreadLocalValueHolderBase
{
3446 ValueHolder() : value_() {}
3447 explicit ValueHolder(const T
& value
) : value_(value
) {}
3449 T
* pointer() { return &value_
; }
3453 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder
);
3456 static pthread_key_t
CreateKey() {
3458 // When a thread exits, DeleteThreadLocalValue() will be called on
3459 // the object managed for that thread.
3460 GTEST_CHECK_POSIX_SUCCESS_(
3461 pthread_key_create(&key
, &DeleteThreadLocalValue
));
3465 T
* GetOrCreateValue() const {
3466 ThreadLocalValueHolderBase
* const holder
=
3467 static_cast<ThreadLocalValueHolderBase
*>(pthread_getspecific(key_
));
3468 if (holder
!= NULL
) {
3469 return CheckedDowncastToActualType
<ValueHolder
>(holder
)->pointer();
3472 ValueHolder
* const new_holder
= default_factory_
->MakeNewHolder();
3473 ThreadLocalValueHolderBase
* const holder_base
= new_holder
;
3474 GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_
, holder_base
));
3475 return new_holder
->pointer();
3478 class ValueHolderFactory
{
3480 ValueHolderFactory() {}
3481 virtual ~ValueHolderFactory() {}
3482 virtual ValueHolder
* MakeNewHolder() const = 0;
3485 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory
);
3488 class DefaultValueHolderFactory
: public ValueHolderFactory
{
3490 DefaultValueHolderFactory() {}
3491 virtual ValueHolder
* MakeNewHolder() const { return new ValueHolder(); }
3494 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory
);
3497 class InstanceValueHolderFactory
: public ValueHolderFactory
{
3499 explicit InstanceValueHolderFactory(const T
& value
) : value_(value
) {}
3500 virtual ValueHolder
* MakeNewHolder() const {
3501 return new ValueHolder(value_
);
3505 const T value_
; // The value for each thread.
3507 GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory
);
3510 // A key pthreads uses for looking up per-thread values.
3511 const pthread_key_t key_
;
3512 scoped_ptr
<ValueHolderFactory
> default_factory_
;
3514 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal
);
3517 # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
3519 #else // GTEST_IS_THREADSAFE
3521 // A dummy implementation of synchronization primitives (mutex, lock,
3522 // and thread-local variable). Necessary for compiling Google Test where
3523 // mutex is not supported - using Google Test in multiple threads is not
3524 // supported on such platforms.
3531 void AssertHeld() const {}
3534 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
3535 extern ::testing::internal::Mutex mutex
3537 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
3539 // We cannot name this class MutexLock because the ctor declaration would
3540 // conflict with a macro named MutexLock, which is defined on some
3541 // platforms. That macro is used as a defensive measure to prevent against
3542 // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
3543 // "MutexLock l(&mu)". Hence the typedef trick below.
3544 class GTestMutexLock
{
3546 explicit GTestMutexLock(Mutex
*) {} // NOLINT
3549 typedef GTestMutexLock MutexLock
;
3551 template <typename T
>
3552 class GTEST_API_ ThreadLocal
{
3554 ThreadLocal() : value_() {}
3555 explicit ThreadLocal(const T
& value
) : value_(value
) {}
3556 T
* pointer() { return &value_
; }
3557 const T
* pointer() const { return &value_
; }
3558 const T
& get() const { return value_
; }
3559 void set(const T
& value
) { value_
= value
; }
3564 #endif // GTEST_IS_THREADSAFE
3566 // Returns the number of threads running in the process, or 0 to indicate that
3567 // we cannot detect it.
3568 GTEST_API_
size_t GetThreadCount();
3570 // Passing non-POD classes through ellipsis (...) crashes the ARM
3571 // compiler and generates a warning in Sun Studio before 12u4. The Nokia Symbian
3572 // and the IBM XL C/C++ compiler try to instantiate a copy constructor
3573 // for objects passed through ellipsis (...), failing for uncopyable
3574 // objects. We define this to ensure that only POD is passed through
3575 // ellipsis on these systems.
3576 #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || \
3577 (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5130)
3578 // We lose support for NULL detection where the compiler doesn't like
3579 // passing non-POD classes through ellipsis (...).
3580 # define GTEST_ELLIPSIS_NEEDS_POD_ 1
3582 # define GTEST_CAN_COMPARE_NULL 1
3585 // The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
3586 // const T& and const T* in a function template. These compilers
3587 // _can_ decide between class template specializations for T and T*,
3588 // so a tr1::type_traits-like is_pointer works.
3589 #if defined(__SYMBIAN32__) || defined(__IBMCPP__)
3590 # define GTEST_NEEDS_IS_POINTER_ 1
3593 template <bool bool_value
>
3594 struct bool_constant
{
3595 typedef bool_constant
<bool_value
> type
;
3596 static const bool value
= bool_value
;
3598 template <bool bool_value
> const bool bool_constant
<bool_value
>::value
;
3600 typedef bool_constant
<false> false_type
;
3601 typedef bool_constant
<true> true_type
;
3603 template <typename T
, typename U
>
3604 struct is_same
: public false_type
{};
3606 template <typename T
>
3607 struct is_same
<T
, T
> : public true_type
{};
3610 template <typename T
>
3611 struct is_pointer
: public false_type
{};
3613 template <typename T
>
3614 struct is_pointer
<T
*> : public true_type
{};
3616 template <typename Iterator
>
3617 struct IteratorTraits
{
3618 typedef typename
Iterator::value_type value_type
;
3622 template <typename T
>
3623 struct IteratorTraits
<T
*> {
3624 typedef T value_type
;
3627 template <typename T
>
3628 struct IteratorTraits
<const T
*> {
3629 typedef T value_type
;
3632 #if GTEST_OS_WINDOWS
3633 # define GTEST_PATH_SEP_ "\\"
3634 # define GTEST_HAS_ALT_PATH_SEP_ 1
3635 // The biggest signed integer type the compiler supports.
3636 typedef __int64 BiggestInt
;
3638 # define GTEST_PATH_SEP_ "/"
3639 # define GTEST_HAS_ALT_PATH_SEP_ 0
3640 typedef long long BiggestInt
; // NOLINT
3641 #endif // GTEST_OS_WINDOWS
3643 // Utilities for char.
3645 // isspace(int ch) and friends accept an unsigned char or EOF. char
3646 // may be signed, depending on the compiler (or compiler flags).
3647 // Therefore we need to cast a char to unsigned char before calling
3650 inline bool IsAlpha(char ch
) {
3651 return isalpha(static_cast<unsigned char>(ch
)) != 0;
3653 inline bool IsAlNum(char ch
) {
3654 return isalnum(static_cast<unsigned char>(ch
)) != 0;
3656 inline bool IsDigit(char ch
) {
3657 return isdigit(static_cast<unsigned char>(ch
)) != 0;
3659 inline bool IsLower(char ch
) {
3660 return islower(static_cast<unsigned char>(ch
)) != 0;
3662 inline bool IsSpace(char ch
) {
3663 return isspace(static_cast<unsigned char>(ch
)) != 0;
3665 inline bool IsUpper(char ch
) {
3666 return isupper(static_cast<unsigned char>(ch
)) != 0;
3668 inline bool IsXDigit(char ch
) {
3669 return isxdigit(static_cast<unsigned char>(ch
)) != 0;
3671 inline bool IsXDigit(wchar_t ch
) {
3672 const unsigned char low_byte
= static_cast<unsigned char>(ch
);
3673 return ch
== low_byte
&& isxdigit(low_byte
) != 0;
3676 inline char ToLower(char ch
) {
3677 return static_cast<char>(tolower(static_cast<unsigned char>(ch
)));
3679 inline char ToUpper(char ch
) {
3680 return static_cast<char>(toupper(static_cast<unsigned char>(ch
)));
3683 inline std::string
StripTrailingSpaces(std::string str
) {
3684 std::string::iterator it
= str
.end();
3685 while (it
!= str
.begin() && IsSpace(*--it
))
3690 // The testing::internal::posix namespace holds wrappers for common
3691 // POSIX functions. These wrappers hide the differences between
3692 // Windows/MSVC and POSIX systems. Since some compilers define these
3693 // standard functions as macros, the wrapper cannot have the same name
3694 // as the wrapped function.
3698 // Functions with a different name on Windows.
3700 #if GTEST_OS_WINDOWS
3702 typedef struct _stat StatStruct
;
3704 # ifdef __BORLANDC__
3705 inline int IsATTY(int fd
) { return isatty(fd
); }
3706 inline int StrCaseCmp(const char* s1
, const char* s2
) {
3707 return stricmp(s1
, s2
);
3709 inline char* StrDup(const char* src
) { return strdup(src
); }
3710 # else // !__BORLANDC__
3711 # if GTEST_OS_WINDOWS_MOBILE
3712 inline int IsATTY(int /* fd */) { return 0; }
3714 inline int IsATTY(int fd
) { return _isatty(fd
); }
3715 # endif // GTEST_OS_WINDOWS_MOBILE
3716 inline int StrCaseCmp(const char* s1
, const char* s2
) {
3717 return _stricmp(s1
, s2
);
3719 inline char* StrDup(const char* src
) { return _strdup(src
); }
3720 # endif // __BORLANDC__
3722 # if GTEST_OS_WINDOWS_MOBILE
3723 inline int FileNo(FILE* file
) { return reinterpret_cast<int>(_fileno(file
)); }
3724 // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
3725 // time and thus not defined there.
3727 inline int FileNo(FILE* file
) { return _fileno(file
); }
3728 inline int Stat(const char* path
, StatStruct
* buf
) { return _stat(path
, buf
); }
3729 inline int RmDir(const char* dir
) { return _rmdir(dir
); }
3730 inline bool IsDir(const StatStruct
& st
) {
3731 return (_S_IFDIR
& st
.st_mode
) != 0;
3733 # endif // GTEST_OS_WINDOWS_MOBILE
3737 typedef struct stat StatStruct
;
3739 inline int FileNo(FILE* file
) { return fileno(file
); }
3740 inline int IsATTY(int fd
) { return isatty(fd
); }
3741 inline int Stat(const char* path
, StatStruct
* buf
) { return stat(path
, buf
); }
3742 inline int StrCaseCmp(const char* s1
, const char* s2
) {
3743 return strcasecmp(s1
, s2
);
3745 inline char* StrDup(const char* src
) { return strdup(src
); }
3746 inline int RmDir(const char* dir
) { return rmdir(dir
); }
3747 inline bool IsDir(const StatStruct
& st
) { return S_ISDIR(st
.st_mode
); }
3749 #endif // GTEST_OS_WINDOWS
3751 // Functions deprecated by MSVC 8.0.
3753 GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
3755 inline const char* StrNCpy(char* dest
, const char* src
, size_t n
) {
3756 return strncpy(dest
, src
, n
);
3759 // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
3760 // StrError() aren't needed on Windows CE at this time and thus not
3763 #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
3764 inline int ChDir(const char* dir
) { return chdir(dir
); }
3766 inline FILE* FOpen(const char* path
, const char* mode
) {
3767 return fopen(path
, mode
);
3769 #if !GTEST_OS_WINDOWS_MOBILE
3770 inline FILE *FReopen(const char* path
, const char* mode
, FILE* stream
) {
3771 return freopen(path
, mode
, stream
);
3773 inline FILE* FDOpen(int fd
, const char* mode
) { return fdopen(fd
, mode
); }
3775 inline int FClose(FILE* fp
) { return fclose(fp
); }
3776 #if !GTEST_OS_WINDOWS_MOBILE
3777 inline int Read(int fd
, void* buf
, unsigned int count
) {
3778 return static_cast<int>(read(fd
, buf
, count
));
3780 inline int Write(int fd
, const void* buf
, unsigned int count
) {
3781 return static_cast<int>(write(fd
, buf
, count
));
3783 inline int Close(int fd
) { return close(fd
); }
3784 inline const char* StrError(int errnum
) { return strerror(errnum
); }
3786 inline const char* GetEnv(const char* name
) {
3787 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
3788 // We are on Windows CE, which has no environment variables.
3789 static_cast<void>(name
); // To prevent 'unused argument' warning.
3791 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
3792 // Environment variables which we programmatically clear will be set to the
3793 // empty string rather than unset (NULL). Handle that case.
3794 const char* const env
= getenv(name
);
3795 return (env
!= NULL
&& env
[0] != '\0') ? env
: NULL
;
3797 return getenv(name
);
3801 GTEST_DISABLE_MSC_DEPRECATED_POP_()
3803 #if GTEST_OS_WINDOWS_MOBILE
3804 // Windows CE has no C library. The abort() function is used in
3805 // several places in Google Test. This implementation provides a reasonable
3806 // imitation of standard behaviour.
3809 inline void Abort() { abort(); }
3810 #endif // GTEST_OS_WINDOWS_MOBILE
3812 } // namespace posix
3814 // MSVC "deprecates" snprintf and issues warnings wherever it is used. In
3815 // order to avoid these warnings, we need to use _snprintf or _snprintf_s on
3816 // MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
3817 // function in order to achieve that. We use macro definition here because
3818 // snprintf is a variadic function.
3819 #if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
3820 // MSVC 2005 and above support variadic macros.
3821 # define GTEST_SNPRINTF_(buffer, size, format, ...) \
3822 _snprintf_s(buffer, size, size, format, __VA_ARGS__)
3823 #elif defined(_MSC_VER)
3824 // Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
3825 // complain about _snprintf.
3826 # define GTEST_SNPRINTF_ _snprintf
3828 # define GTEST_SNPRINTF_ snprintf
3831 // The maximum number a BiggestInt can represent. This definition
3832 // works no matter BiggestInt is represented in one's complement or
3833 // two's complement.
3835 // We cannot rely on numeric_limits in STL, as __int64 and long long
3836 // are not part of standard C++ and numeric_limits doesn't need to be
3837 // defined for them.
3838 const BiggestInt kMaxBiggestInt
=
3839 ~(static_cast<BiggestInt
>(1) << (8*sizeof(BiggestInt
) - 1));
3841 // This template class serves as a compile-time function from size to
3842 // type. It maps a size in bytes to a primitive type with that
3845 // TypeWithSize<4>::UInt
3847 // is typedef-ed to be unsigned int (unsigned integer made up of 4
3850 // Such functionality should belong to STL, but I cannot find it
3853 // Google Test uses this class in the implementation of floating-point
3856 // For now it only handles UInt (unsigned int) as that's all Google Test
3857 // needs. Other types can be easily added in the future if need
3859 template <size_t size
>
3860 class TypeWithSize
{
3862 // This prevents the user from using TypeWithSize<N> with incorrect
3867 // The specialization for size 4.
3869 class TypeWithSize
<4> {
3871 // unsigned int has size 4 in both gcc and MSVC.
3873 // As base/basictypes.h doesn't compile on Windows, we cannot use
3874 // uint32, uint64, and etc here.
3876 typedef unsigned int UInt
;
3879 // The specialization for size 8.
3881 class TypeWithSize
<8> {
3883 #if GTEST_OS_WINDOWS
3884 typedef __int64 Int
;
3885 typedef unsigned __int64 UInt
;
3887 typedef long long Int
; // NOLINT
3888 typedef unsigned long long UInt
; // NOLINT
3889 #endif // GTEST_OS_WINDOWS
3892 // Integer types of known sizes.
3893 typedef TypeWithSize
<4>::Int Int32
;
3894 typedef TypeWithSize
<4>::UInt UInt32
;
3895 typedef TypeWithSize
<8>::Int Int64
;
3896 typedef TypeWithSize
<8>::UInt UInt64
;
3897 typedef TypeWithSize
<8>::Int TimeInMillis
; // Represents time in milliseconds.
3899 // Utilities for command line flags and environment variables.
3901 // Macro for referencing flags.
3902 #if !defined(GTEST_FLAG)
3903 # define GTEST_FLAG(name) FLAGS_gtest_##name
3904 #endif // !defined(GTEST_FLAG)
3906 #if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
3907 # define GTEST_USE_OWN_FLAGFILE_FLAG_ 1
3908 #endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
3910 #if !defined(GTEST_DECLARE_bool_)
3911 # define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver
3913 // Macros for declaring flags.
3914 # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
3915 # define GTEST_DECLARE_int32_(name) \
3916 GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
3917 # define GTEST_DECLARE_string_(name) \
3918 GTEST_API_ extern ::std::string GTEST_FLAG(name)
3920 // Macros for defining flags.
3921 # define GTEST_DEFINE_bool_(name, default_val, doc) \
3922 GTEST_API_ bool GTEST_FLAG(name) = (default_val)
3923 # define GTEST_DEFINE_int32_(name, default_val, doc) \
3924 GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
3925 # define GTEST_DEFINE_string_(name, default_val, doc) \
3926 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
3928 #endif // !defined(GTEST_DECLARE_bool_)
3930 // Thread annotations
3931 #if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
3932 # define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
3933 # define GTEST_LOCK_EXCLUDED_(locks)
3934 #endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
3936 // Parses 'str' for a 32-bit signed integer. If successful, writes the result
3937 // to *value and returns true; otherwise leaves *value unchanged and returns
3939 // FIXME: Find a better way to refactor flag and environment parsing
3940 // out of both gtest-port.cc and gtest.cc to avoid exporting this utility
3942 bool ParseInt32(const Message
& src_text
, const char* str
, Int32
* value
);
3944 // Parses a bool/Int32/string from the environment variable
3945 // corresponding to the given Google Test flag.
3946 bool BoolFromGTestEnv(const char* flag
, bool default_val
);
3947 GTEST_API_ Int32
Int32FromGTestEnv(const char* flag
, Int32 default_val
);
3948 std::string
OutputFlagAlsoCheckEnvVar();
3949 const char* StringFromGTestEnv(const char* flag
, const char* default_val
);
3951 } // namespace internal
3952 } // namespace testing
3954 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
3957 # include <stdlib.h>
3958 # include <sys/types.h>
3959 # include <sys/wait.h>
3960 # include <unistd.h>
3961 #endif // GTEST_OS_LINUX
3963 #if GTEST_HAS_EXCEPTIONS
3964 # include <stdexcept>
3977 // Copyright 2005, Google Inc.
3978 // All rights reserved.
3980 // Redistribution and use in source and binary forms, with or without
3981 // modification, are permitted provided that the following conditions are
3984 // * Redistributions of source code must retain the above copyright
3985 // notice, this list of conditions and the following disclaimer.
3986 // * Redistributions in binary form must reproduce the above
3987 // copyright notice, this list of conditions and the following disclaimer
3988 // in the documentation and/or other materials provided with the
3990 // * Neither the name of Google Inc. nor the names of its
3991 // contributors may be used to endorse or promote products derived from
3992 // this software without specific prior written permission.
3994 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3995 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3996 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3997 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3998 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3999 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4000 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4001 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4002 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4003 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4004 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4007 // The Google C++ Testing and Mocking Framework (Google Test)
4009 // This header file defines the Message class.
4011 // IMPORTANT NOTE: Due to limitation of the C++ language, we have to
4012 // leave some internal implementation details in this header file.
4013 // They are clearly marked by comments like this:
4015 // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
4017 // Such code is NOT meant to be used by a user directly, and is subject
4018 // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
4021 // GOOGLETEST_CM0001 DO NOT DELETE
4023 #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
4024 #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
4029 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
4030 /* class A needs to have dll-interface to be used by clients of class B */)
4032 // Ensures that there is at least one operator<< in the global namespace.
4033 // See Message& operator<<(...) below for why.
4034 void operator<<(const testing::internal::Secret
&, int);
4038 // The Message class works like an ostream repeater.
4042 // 1. You stream a bunch of values to a Message object.
4043 // It will remember the text in a stringstream.
4044 // 2. Then you stream the Message object to an ostream.
4045 // This causes the text in the Message to be streamed
4050 // testing::Message foo;
4051 // foo << 1 << " != " << 2;
4052 // std::cout << foo;
4054 // will print "1 != 2".
4056 // Message is not intended to be inherited from. In particular, its
4057 // destructor is not virtual.
4059 // Note that stringstream behaves differently in gcc and in MSVC. You
4060 // can stream a NULL char pointer to it in the former, but not in the
4061 // latter (it causes an access violation if you do). The Message
4062 // class hides this difference by treating a NULL char pointer as
4064 class GTEST_API_ Message
{
4066 // The type of basic IO manipulators (endl, ends, and flush) for
4068 typedef std::ostream
& (*BasicNarrowIoManip
)(std::ostream
&);
4071 // Constructs an empty Message.
4074 // Copy constructor.
4075 Message(const Message
& msg
) : ss_(new ::std::stringstream
) { // NOLINT
4076 *ss_
<< msg
.GetString();
4079 // Constructs a Message from a C-string.
4080 explicit Message(const char* str
) : ss_(new ::std::stringstream
) {
4084 #if GTEST_OS_SYMBIAN
4085 // Streams a value (either a pointer or not) to this object.
4086 template <typename T
>
4087 inline Message
& operator <<(const T
& value
) {
4088 StreamHelper(typename
internal::is_pointer
<T
>::type(), value
);
4092 // Streams a non-pointer value to this object.
4093 template <typename T
>
4094 inline Message
& operator <<(const T
& val
) {
4095 // Some libraries overload << for STL containers. These
4096 // overloads are defined in the global namespace instead of ::std.
4098 // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
4099 // overloads are visible in either the std namespace or the global
4100 // namespace, but not other namespaces, including the testing
4101 // namespace which Google Test's Message class is in.
4103 // To allow STL containers (and other types that has a << operator
4104 // defined in the global namespace) to be used in Google Test
4105 // assertions, testing::Message must access the custom << operator
4106 // from the global namespace. With this using declaration,
4107 // overloads of << defined in the global namespace and those
4108 // visible via Koenig lookup are both exposed in this function.
4109 using ::operator <<;
4114 // Streams a pointer value to this object.
4116 // This function is an overload of the previous one. When you
4117 // stream a pointer to a Message, this definition will be used as it
4118 // is more specialized. (The C++ Standard, section
4119 // [temp.func.order].) If you stream a non-pointer, then the
4120 // previous definition will be used.
4122 // The reason for this overload is that streaming a NULL pointer to
4123 // ostream is undefined behavior. Depending on the compiler, you
4124 // may get "0", "(nil)", "(null)", or an access violation. To
4125 // ensure consistent result across compilers, we always treat NULL
4127 template <typename T
>
4128 inline Message
& operator <<(T
* const& pointer
) { // NOLINT
4129 if (pointer
== NULL
) {
4136 #endif // GTEST_OS_SYMBIAN
4138 // Since the basic IO manipulators are overloaded for both narrow
4139 // and wide streams, we have to provide this specialized definition
4140 // of operator <<, even though its body is the same as the
4141 // templatized version above. Without this definition, streaming
4142 // endl or other basic IO manipulators to Message will confuse the
4144 Message
& operator <<(BasicNarrowIoManip val
) {
4149 // Instead of 1/0, we want to see true/false for bool values.
4150 Message
& operator <<(bool b
) {
4151 return *this << (b
? "true" : "false");
4154 // These two overloads allow streaming a wide C string to a Message
4155 // using the UTF-8 encoding.
4156 Message
& operator <<(const wchar_t* wide_c_str
);
4157 Message
& operator <<(wchar_t* wide_c_str
);
4159 #if GTEST_HAS_STD_WSTRING
4160 // Converts the given wide string to a narrow string using the UTF-8
4161 // encoding, and streams the result to this Message object.
4162 Message
& operator <<(const ::std::wstring
& wstr
);
4163 #endif // GTEST_HAS_STD_WSTRING
4165 #if GTEST_HAS_GLOBAL_WSTRING
4166 // Converts the given wide string to a narrow string using the UTF-8
4167 // encoding, and streams the result to this Message object.
4168 Message
& operator <<(const ::wstring
& wstr
);
4169 #endif // GTEST_HAS_GLOBAL_WSTRING
4171 // Gets the text streamed to this object so far as an std::string.
4172 // Each '\0' character in the buffer is replaced with "\\0".
4174 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
4175 std::string
GetString() const;
4178 #if GTEST_OS_SYMBIAN
4179 // These are needed as the Nokia Symbian Compiler cannot decide between
4180 // const T& and const T* in a function template. The Nokia compiler _can_
4181 // decide between class template specializations for T and T*, so a
4182 // tr1::type_traits-like is_pointer works, and we can overload on that.
4183 template <typename T
>
4184 inline void StreamHelper(internal::true_type
/*is_pointer*/, T
* pointer
) {
4185 if (pointer
== NULL
) {
4191 template <typename T
>
4192 inline void StreamHelper(internal::false_type
/*is_pointer*/,
4194 // See the comments in Message& operator <<(const T&) above for why
4195 // we need this using statement.
4196 using ::operator <<;
4199 #endif // GTEST_OS_SYMBIAN
4201 // We'll hold the text streamed to this object here.
4202 const internal::scoped_ptr
< ::std::stringstream
> ss_
;
4204 // We declare (but don't implement) this to prevent the compiler
4205 // from implementing the assignment operator.
4206 void operator=(const Message
&);
4209 // Streams a Message to an ostream.
4210 inline std::ostream
& operator <<(std::ostream
& os
, const Message
& sb
) {
4211 return os
<< sb
.GetString();
4214 namespace internal
{
4216 // Converts a streamable value to an std::string. A NULL pointer is
4217 // converted to "(null)". When the input value is a ::string,
4218 // ::std::string, ::wstring, or ::std::wstring object, each NUL
4219 // character in it is replaced with "\\0".
4220 template <typename T
>
4221 std::string
StreamableToString(const T
& streamable
) {
4222 return (Message() << streamable
).GetString();
4225 } // namespace internal
4226 } // namespace testing
4228 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
4230 #endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
4231 // Copyright 2008, Google Inc.
4232 // All rights reserved.
4234 // Redistribution and use in source and binary forms, with or without
4235 // modification, are permitted provided that the following conditions are
4238 // * Redistributions of source code must retain the above copyright
4239 // notice, this list of conditions and the following disclaimer.
4240 // * Redistributions in binary form must reproduce the above
4241 // copyright notice, this list of conditions and the following disclaimer
4242 // in the documentation and/or other materials provided with the
4244 // * Neither the name of Google Inc. nor the names of its
4245 // contributors may be used to endorse or promote products derived from
4246 // this software without specific prior written permission.
4248 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4249 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4250 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4251 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4252 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4253 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4254 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4255 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4256 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4257 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4258 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4260 // Google Test filepath utilities
4262 // This header file declares classes and functions used internally by
4263 // Google Test. They are subject to change without notice.
4265 // This file is #included in gtest/internal/gtest-internal.h.
4266 // Do not include this header file separately!
4268 // GOOGLETEST_CM0001 DO NOT DELETE
4270 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
4271 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
4273 // Copyright 2005, Google Inc.
4274 // All rights reserved.
4276 // Redistribution and use in source and binary forms, with or without
4277 // modification, are permitted provided that the following conditions are
4280 // * Redistributions of source code must retain the above copyright
4281 // notice, this list of conditions and the following disclaimer.
4282 // * Redistributions in binary form must reproduce the above
4283 // copyright notice, this list of conditions and the following disclaimer
4284 // in the documentation and/or other materials provided with the
4286 // * Neither the name of Google Inc. nor the names of its
4287 // contributors may be used to endorse or promote products derived from
4288 // this software without specific prior written permission.
4290 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4291 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4292 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4293 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4294 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4295 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4296 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4297 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4298 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4299 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4300 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4302 // The Google C++ Testing and Mocking Framework (Google Test)
4304 // This header file declares the String class and functions used internally by
4305 // Google Test. They are subject to change without notice. They should not used
4306 // by code external to Google Test.
4308 // This header file is #included by gtest-internal.h.
4309 // It should not be #included by other files.
4311 // GOOGLETEST_CM0001 DO NOT DELETE
4313 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
4314 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
4317 // string.h is not guaranteed to provide strcpy on C++ Builder.
4326 namespace internal
{
4328 // String - an abstract class holding static string utilities.
4329 class GTEST_API_ String
{
4331 // Static utility methods
4333 // Clones a 0-terminated C string, allocating memory using new. The
4334 // caller is responsible for deleting the return value using
4335 // delete[]. Returns the cloned string, or NULL if the input is
4338 // This is different from strdup() in string.h, which allocates
4339 // memory using malloc().
4340 static const char* CloneCString(const char* c_str
);
4342 #if GTEST_OS_WINDOWS_MOBILE
4343 // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
4344 // able to pass strings to Win32 APIs on CE we need to convert them
4345 // to 'Unicode', UTF-16.
4347 // Creates a UTF-16 wide string from the given ANSI string, allocating
4348 // memory using new. The caller is responsible for deleting the return
4349 // value using delete[]. Returns the wide string, or NULL if the
4352 // The wide string is created using the ANSI codepage (CP_ACP) to
4353 // match the behaviour of the ANSI versions of Win32 calls and the
4355 static LPCWSTR
AnsiToUtf16(const char* c_str
);
4357 // Creates an ANSI string from the given wide string, allocating
4358 // memory using new. The caller is responsible for deleting the return
4359 // value using delete[]. Returns the ANSI string, or NULL if the
4362 // The returned string is created using the ANSI codepage (CP_ACP) to
4363 // match the behaviour of the ANSI versions of Win32 calls and the
4365 static const char* Utf16ToAnsi(LPCWSTR utf16_str
);
4368 // Compares two C strings. Returns true iff they have the same content.
4370 // Unlike strcmp(), this function can handle NULL argument(s). A
4371 // NULL C string is considered different to any non-NULL C string,
4372 // including the empty string.
4373 static bool CStringEquals(const char* lhs
, const char* rhs
);
4375 // Converts a wide C string to a String using the UTF-8 encoding.
4376 // NULL will be converted to "(null)". If an error occurred during
4377 // the conversion, "(failed to convert from wide string)" is
4379 static std::string
ShowWideCString(const wchar_t* wide_c_str
);
4381 // Compares two wide C strings. Returns true iff they have the same
4384 // Unlike wcscmp(), this function can handle NULL argument(s). A
4385 // NULL C string is considered different to any non-NULL C string,
4386 // including the empty string.
4387 static bool WideCStringEquals(const wchar_t* lhs
, const wchar_t* rhs
);
4389 // Compares two C strings, ignoring case. Returns true iff they
4390 // have the same content.
4392 // Unlike strcasecmp(), this function can handle NULL argument(s).
4393 // A NULL C string is considered different to any non-NULL C string,
4394 // including the empty string.
4395 static bool CaseInsensitiveCStringEquals(const char* lhs
,
4398 // Compares two wide C strings, ignoring case. Returns true iff they
4399 // have the same content.
4401 // Unlike wcscasecmp(), this function can handle NULL argument(s).
4402 // A NULL C string is considered different to any non-NULL wide C string,
4403 // including the empty string.
4404 // NB: The implementations on different platforms slightly differ.
4405 // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
4406 // environment variable. On GNU platform this method uses wcscasecmp
4407 // which compares according to LC_CTYPE category of the current locale.
4408 // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
4410 static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs
,
4411 const wchar_t* rhs
);
4413 // Returns true iff the given string ends with the given suffix, ignoring
4414 // case. Any string is considered to end with an empty suffix.
4415 static bool EndsWithCaseInsensitive(
4416 const std::string
& str
, const std::string
& suffix
);
4418 // Formats an int value as "%02d".
4419 static std::string
FormatIntWidth2(int value
); // "%02d" for width == 2
4421 // Formats an int value as "%X".
4422 static std::string
FormatHexInt(int value
);
4424 // Formats a byte as "%02X".
4425 static std::string
FormatByte(unsigned char value
);
4428 String(); // Not meant to be instantiated.
4431 // Gets the content of the stringstream's buffer as an std::string. Each '\0'
4432 // character in the buffer is replaced with "\\0".
4433 GTEST_API_
std::string
StringStreamToString(::std::stringstream
* stream
);
4435 } // namespace internal
4436 } // namespace testing
4438 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
4440 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
4441 /* class A needs to have dll-interface to be used by clients of class B */)
4444 namespace internal
{
4446 // FilePath - a class for file and directory pathname manipulation which
4447 // handles platform-specific conventions (like the pathname separator).
4448 // Used for helper functions for naming files in a directory for xml output.
4449 // Except for Set methods, all methods are const or static, which provides an
4450 // "immutable value object" -- useful for peace of mind.
4451 // A FilePath with a value ending in a path separator ("like/this/") represents
4452 // a directory, otherwise it is assumed to represent a file. In either case,
4453 // it may or may not represent an actual file or directory in the file system.
4454 // Names are NOT checked for syntax correctness -- no checking for illegal
4455 // characters, malformed paths, etc.
4457 class GTEST_API_ FilePath
{
4459 FilePath() : pathname_("") { }
4460 FilePath(const FilePath
& rhs
) : pathname_(rhs
.pathname_
) { }
4462 explicit FilePath(const std::string
& pathname
) : pathname_(pathname
) {
4466 FilePath
& operator=(const FilePath
& rhs
) {
4471 void Set(const FilePath
& rhs
) {
4472 pathname_
= rhs
.pathname_
;
4475 const std::string
& string() const { return pathname_
; }
4476 const char* c_str() const { return pathname_
.c_str(); }
4478 // Returns the current working directory, or "" if unsuccessful.
4479 static FilePath
GetCurrentDir();
4481 // Given directory = "dir", base_name = "test", number = 0,
4482 // extension = "xml", returns "dir/test.xml". If number is greater
4483 // than zero (e.g., 12), returns "dir/test_12.xml".
4484 // On Windows platform, uses \ as the separator rather than /.
4485 static FilePath
MakeFileName(const FilePath
& directory
,
4486 const FilePath
& base_name
,
4488 const char* extension
);
4490 // Given directory = "dir", relative_path = "test.xml",
4491 // returns "dir/test.xml".
4492 // On Windows, uses \ as the separator rather than /.
4493 static FilePath
ConcatPaths(const FilePath
& directory
,
4494 const FilePath
& relative_path
);
4496 // Returns a pathname for a file that does not currently exist. The pathname
4497 // will be directory/base_name.extension or
4498 // directory/base_name_<number>.extension if directory/base_name.extension
4499 // already exists. The number will be incremented until a pathname is found
4500 // that does not already exist.
4501 // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
4502 // There could be a race condition if two or more processes are calling this
4503 // function at the same time -- they could both pick the same filename.
4504 static FilePath
GenerateUniqueFileName(const FilePath
& directory
,
4505 const FilePath
& base_name
,
4506 const char* extension
);
4508 // Returns true iff the path is "".
4509 bool IsEmpty() const { return pathname_
.empty(); }
4511 // If input name has a trailing separator character, removes it and returns
4512 // the name, otherwise return the name string unmodified.
4513 // On Windows platform, uses \ as the separator, other platforms use /.
4514 FilePath
RemoveTrailingPathSeparator() const;
4516 // Returns a copy of the FilePath with the directory part removed.
4517 // Example: FilePath("path/to/file").RemoveDirectoryName() returns
4518 // FilePath("file"). If there is no directory part ("just_a_file"), it returns
4519 // the FilePath unmodified. If there is no file part ("just_a_dir/") it
4520 // returns an empty FilePath ("").
4521 // On Windows platform, '\' is the path separator, otherwise it is '/'.
4522 FilePath
RemoveDirectoryName() const;
4524 // RemoveFileName returns the directory path with the filename removed.
4525 // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
4526 // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
4527 // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
4528 // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
4529 // On Windows platform, '\' is the path separator, otherwise it is '/'.
4530 FilePath
RemoveFileName() const;
4532 // Returns a copy of the FilePath with the case-insensitive extension removed.
4533 // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
4534 // FilePath("dir/file"). If a case-insensitive extension is not
4535 // found, returns a copy of the original FilePath.
4536 FilePath
RemoveExtension(const char* extension
) const;
4538 // Creates directories so that path exists. Returns true if successful or if
4539 // the directories already exist; returns false if unable to create
4540 // directories for any reason. Will also return false if the FilePath does
4541 // not represent a directory (that is, it doesn't end with a path separator).
4542 bool CreateDirectoriesRecursively() const;
4544 // Create the directory so that path exists. Returns true if successful or
4545 // if the directory already exists; returns false if unable to create the
4546 // directory for any reason, including if the parent directory does not
4547 // exist. Not named "CreateDirectory" because that's a macro on Windows.
4548 bool CreateFolder() const;
4550 // Returns true if FilePath describes something in the file-system,
4551 // either a file, directory, or whatever, and that something exists.
4552 bool FileOrDirectoryExists() const;
4554 // Returns true if pathname describes a directory in the file-system
4556 bool DirectoryExists() const;
4558 // Returns true if FilePath ends with a path separator, which indicates that
4559 // it is intended to represent a directory. Returns false otherwise.
4560 // This does NOT check that a directory (or file) actually exists.
4561 bool IsDirectory() const;
4563 // Returns true if pathname describes a root directory. (Windows has one
4564 // root directory per disk drive.)
4565 bool IsRootDirectory() const;
4567 // Returns true if pathname describes an absolute path.
4568 bool IsAbsolutePath() const;
4571 // Replaces multiple consecutive separators with a single separator.
4572 // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
4573 // redundancies that might be in a pathname involving "." or "..".
4575 // A pathname with multiple consecutive separators may occur either through
4576 // user error or as a result of some scripts or APIs that generate a pathname
4577 // with a trailing separator. On other platforms the same API or script
4578 // may NOT generate a pathname with a trailing "/". Then elsewhere that
4579 // pathname may have another "/" and pathname components added to it,
4580 // without checking for the separator already being there.
4581 // The script language and operating system may allow paths like "foo//bar"
4582 // but some of the functions in FilePath will not handle that correctly. In
4583 // particular, RemoveTrailingPathSeparator() only removes one separator, and
4584 // it is called in CreateDirectoriesRecursively() assuming that it will change
4585 // a pathname from directory syntax (trailing separator) to filename syntax.
4587 // On Windows this method also replaces the alternate path separator '/' with
4588 // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
4593 // Returns a pointer to the last occurence of a valid path separator in
4594 // the FilePath. On Windows, for example, both '/' and '\' are valid path
4595 // separators. Returns NULL if no path separator was found.
4596 const char* FindLastPathSeparator() const;
4598 std::string pathname_
;
4599 }; // class FilePath
4601 } // namespace internal
4602 } // namespace testing
4604 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
4606 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
4607 // This file was GENERATED by command:
4608 // pump.py gtest-type-util.h.pump
4609 // DO NOT EDIT BY HAND!!!
4611 // Copyright 2008 Google Inc.
4612 // All Rights Reserved.
4614 // Redistribution and use in source and binary forms, with or without
4615 // modification, are permitted provided that the following conditions are
4618 // * Redistributions of source code must retain the above copyright
4619 // notice, this list of conditions and the following disclaimer.
4620 // * Redistributions in binary form must reproduce the above
4621 // copyright notice, this list of conditions and the following disclaimer
4622 // in the documentation and/or other materials provided with the
4624 // * Neither the name of Google Inc. nor the names of its
4625 // contributors may be used to endorse or promote products derived from
4626 // this software without specific prior written permission.
4628 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4629 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4630 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4631 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4632 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4633 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4634 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4635 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4636 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4637 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4638 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4641 // Type utilities needed for implementing typed and type-parameterized
4642 // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
4644 // Currently we support at most 50 types in a list, and at most 50
4645 // type-parameterized tests in one type-parameterized test case.
4646 // Please contact googletestframework@googlegroups.com if you need
4649 // GOOGLETEST_CM0001 DO NOT DELETE
4651 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
4652 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
4655 // #ifdef __GNUC__ is too general here. It is possible to use gcc without using
4656 // libstdc++ (which is where cxxabi.h comes from).
4657 # if GTEST_HAS_CXXABI_H_
4658 # include <cxxabi.h>
4659 # elif defined(__HP_aCC)
4660 # include <acxx_demangle.h>
4661 # endif // GTEST_HASH_CXXABI_H_
4664 namespace internal
{
4666 // Canonicalizes a given name with respect to the Standard C++ Library.
4667 // This handles removing the inline namespace within `std` that is
4668 // used by various standard libraries (e.g., `std::__1`). Names outside
4669 // of namespace std are returned unmodified.
4670 inline std::string
CanonicalizeForStdLibVersioning(std::string s
) {
4671 static const char prefix
[] = "std::__";
4672 if (s
.compare(0, strlen(prefix
), prefix
) == 0) {
4673 std::string::size_type end
= s
.find("::", strlen(prefix
));
4674 if (end
!= s
.npos
) {
4675 // Erase everything between the initial `std` and the second `::`.
4676 s
.erase(strlen("std"), end
- strlen("std"));
4682 // GetTypeName<T>() returns a human-readable name of type T.
4683 // NB: This function is also used in Google Mock, so don't move it inside of
4684 // the typed-test-only section below.
4685 template <typename T
>
4686 std::string
GetTypeName() {
4689 const char* const name
= typeid(T
).name();
4690 # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
4692 // gcc's implementation of typeid(T).name() mangles the type name,
4693 // so we have to demangle it.
4694 # if GTEST_HAS_CXXABI_H_
4695 using abi::__cxa_demangle
;
4696 # endif // GTEST_HAS_CXXABI_H_
4697 char* const readable_name
= __cxa_demangle(name
, 0, 0, &status
);
4698 const std::string
name_str(status
== 0 ? readable_name
: name
);
4699 free(readable_name
);
4700 return CanonicalizeForStdLibVersioning(name_str
);
4703 # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
4709 # endif // GTEST_HAS_RTTI
4712 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
4714 // AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
4715 // type. This can be used as a compile-time assertion to ensure that
4716 // two types are equal.
4718 template <typename T1
, typename T2
>
4719 struct AssertTypeEq
;
4721 template <typename T
>
4722 struct AssertTypeEq
<T
, T
> {
4726 // A unique type used as the default value for the arguments of class
4727 // template Types. This allows us to simulate variadic templates
4728 // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
4729 // support directly.
4732 // The following family of struct and struct templates are used to
4733 // represent type lists. In particular, TypesN<T1, T2, ..., TN>
4734 // represents a type list with N types (T1, T2, ..., and TN) in it.
4735 // Except for Types0, every struct in the family has two member types:
4736 // Head for the first type in the list, and Tail for the rest of the
4739 // The empty type list.
4742 // Type lists of length 1, 2, 3, and so on.
4744 template <typename T1
>
4747 typedef Types0 Tail
;
4749 template <typename T1
, typename T2
>
4752 typedef Types1
<T2
> Tail
;
4755 template <typename T1
, typename T2
, typename T3
>
4758 typedef Types2
<T2
, T3
> Tail
;
4761 template <typename T1
, typename T2
, typename T3
, typename T4
>
4764 typedef Types3
<T2
, T3
, T4
> Tail
;
4767 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
4770 typedef Types4
<T2
, T3
, T4
, T5
> Tail
;
4773 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4777 typedef Types5
<T2
, T3
, T4
, T5
, T6
> Tail
;
4780 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4781 typename T6
, typename T7
>
4784 typedef Types6
<T2
, T3
, T4
, T5
, T6
, T7
> Tail
;
4787 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4788 typename T6
, typename T7
, typename T8
>
4791 typedef Types7
<T2
, T3
, T4
, T5
, T6
, T7
, T8
> Tail
;
4794 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4795 typename T6
, typename T7
, typename T8
, typename T9
>
4798 typedef Types8
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
> Tail
;
4801 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4802 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
4805 typedef Types9
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
> Tail
;
4808 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4809 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4813 typedef Types10
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
> Tail
;
4816 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4817 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4818 typename T11
, typename T12
>
4821 typedef Types11
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
> Tail
;
4824 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4825 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4826 typename T11
, typename T12
, typename T13
>
4829 typedef Types12
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
> Tail
;
4832 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4833 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4834 typename T11
, typename T12
, typename T13
, typename T14
>
4837 typedef Types13
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
> Tail
;
4840 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4841 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4842 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
>
4845 typedef Types14
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
4849 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4850 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4851 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4855 typedef Types15
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4859 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4860 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4861 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4862 typename T16
, typename T17
>
4865 typedef Types16
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4869 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4870 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4871 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4872 typename T16
, typename T17
, typename T18
>
4875 typedef Types17
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4876 T16
, T17
, T18
> Tail
;
4879 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4880 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4881 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4882 typename T16
, typename T17
, typename T18
, typename T19
>
4885 typedef Types18
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4886 T16
, T17
, T18
, T19
> Tail
;
4889 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4890 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4891 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4892 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
>
4895 typedef Types19
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4896 T16
, T17
, T18
, T19
, T20
> Tail
;
4899 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4900 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4901 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4902 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4906 typedef Types20
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4907 T16
, T17
, T18
, T19
, T20
, T21
> Tail
;
4910 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4911 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4912 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4913 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4914 typename T21
, typename T22
>
4917 typedef Types21
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4918 T16
, T17
, T18
, T19
, T20
, T21
, T22
> Tail
;
4921 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4922 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4923 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4924 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4925 typename T21
, typename T22
, typename T23
>
4928 typedef Types22
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4929 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
> Tail
;
4932 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4933 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4934 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4935 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4936 typename T21
, typename T22
, typename T23
, typename T24
>
4939 typedef Types23
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4940 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
> Tail
;
4943 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4944 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4945 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4946 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4947 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
>
4950 typedef Types24
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4951 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
> Tail
;
4954 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4955 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4956 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4957 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4958 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
4962 typedef Types25
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4963 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
> Tail
;
4966 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4967 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4968 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4969 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4970 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
4971 typename T26
, typename T27
>
4974 typedef Types26
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4975 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
> Tail
;
4978 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4979 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4980 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4981 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4982 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
4983 typename T26
, typename T27
, typename T28
>
4986 typedef Types27
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4987 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
> Tail
;
4990 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
4991 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
4992 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
4993 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
4994 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
4995 typename T26
, typename T27
, typename T28
, typename T29
>
4998 typedef Types28
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
4999 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
5003 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5004 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5005 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5006 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5007 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5008 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
>
5011 typedef Types29
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5012 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5016 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5017 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5018 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5019 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5020 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5021 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5025 typedef Types30
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5026 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5030 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5031 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5032 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5033 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5034 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5035 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5036 typename T31
, typename T32
>
5039 typedef Types31
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5040 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5041 T30
, T31
, T32
> Tail
;
5044 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5045 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5046 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5047 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5048 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5049 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5050 typename T31
, typename T32
, typename T33
>
5053 typedef Types32
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5054 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5055 T30
, T31
, T32
, T33
> Tail
;
5058 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5059 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5060 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5061 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5062 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5063 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5064 typename T31
, typename T32
, typename T33
, typename T34
>
5067 typedef Types33
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5068 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5069 T30
, T31
, T32
, T33
, T34
> Tail
;
5072 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5073 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5074 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5075 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5076 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5077 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5078 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
>
5081 typedef Types34
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5082 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5083 T30
, T31
, T32
, T33
, T34
, T35
> Tail
;
5086 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5087 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5088 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5089 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5090 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5091 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5092 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5096 typedef Types35
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5097 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5098 T30
, T31
, T32
, T33
, T34
, T35
, T36
> Tail
;
5101 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5102 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5103 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5104 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5105 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5106 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5107 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5108 typename T36
, typename T37
>
5111 typedef Types36
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5112 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5113 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
> Tail
;
5116 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5117 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5118 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5119 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5120 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5121 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5122 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5123 typename T36
, typename T37
, typename T38
>
5126 typedef Types37
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5127 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5128 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
> Tail
;
5131 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5132 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5133 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5134 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5135 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5136 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5137 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5138 typename T36
, typename T37
, typename T38
, typename T39
>
5141 typedef Types38
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5142 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5143 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
> Tail
;
5146 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5147 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5148 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5149 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5150 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5151 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5152 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5153 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
>
5156 typedef Types39
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5157 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5158 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
> Tail
;
5161 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5162 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5163 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5164 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5165 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5166 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5167 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5168 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5172 typedef Types40
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5173 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5174 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
> Tail
;
5177 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5178 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5179 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5180 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5181 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5182 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5183 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5184 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5185 typename T41
, typename T42
>
5188 typedef Types41
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5189 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5190 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
> Tail
;
5193 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5194 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5195 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5196 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5197 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5198 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5199 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5200 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5201 typename T41
, typename T42
, typename T43
>
5204 typedef Types42
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5205 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5206 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
5210 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5211 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5212 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5213 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5214 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5215 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5216 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5217 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5218 typename T41
, typename T42
, typename T43
, typename T44
>
5221 typedef Types43
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5222 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5223 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5227 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5228 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5229 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5230 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5231 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5232 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5233 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5234 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5235 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
>
5238 typedef Types44
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5239 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5240 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5244 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5245 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5246 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5247 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5248 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5249 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5250 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5251 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5252 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
5256 typedef Types45
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5257 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5258 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5259 T44
, T45
, T46
> Tail
;
5262 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5263 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5264 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5265 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5266 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5267 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5268 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5269 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5270 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
5271 typename T46
, typename T47
>
5274 typedef Types46
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5275 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5276 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5277 T44
, T45
, T46
, T47
> Tail
;
5280 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5281 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5282 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5283 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5284 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5285 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5286 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5287 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5288 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
5289 typename T46
, typename T47
, typename T48
>
5292 typedef Types47
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5293 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5294 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5295 T44
, T45
, T46
, T47
, T48
> Tail
;
5298 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5299 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5300 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5301 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5302 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5303 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5304 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5305 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5306 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
5307 typename T46
, typename T47
, typename T48
, typename T49
>
5310 typedef Types48
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5311 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5312 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5313 T44
, T45
, T46
, T47
, T48
, T49
> Tail
;
5316 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5317 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5318 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5319 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5320 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5321 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5322 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5323 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
5324 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
5325 typename T46
, typename T47
, typename T48
, typename T49
, typename T50
>
5328 typedef Types49
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5329 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5330 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
5331 T44
, T45
, T46
, T47
, T48
, T49
, T50
> Tail
;
5335 } // namespace internal
5337 // We don't want to require the users to write TypesN<...> directly,
5338 // as that would require them to count the length. Types<...> is much
5339 // easier to write, but generates horrible messages when there is a
5340 // compiler error, as gcc insists on printing out each template
5341 // argument, even if it has the default value (this means Types<int>
5342 // will appear as Types<int, None, None, ..., None> in the compiler
5345 // Our solution is to combine the best part of the two approaches: a
5346 // user would write Types<T1, ..., TN>, and Google Test will translate
5347 // that to TypesN<T1, ..., TN> internally to make error messages
5348 // readable. The translation is done by the 'type' member of the
5350 template <typename T1
= internal::None
, typename T2
= internal::None
,
5351 typename T3
= internal::None
, typename T4
= internal::None
,
5352 typename T5
= internal::None
, typename T6
= internal::None
,
5353 typename T7
= internal::None
, typename T8
= internal::None
,
5354 typename T9
= internal::None
, typename T10
= internal::None
,
5355 typename T11
= internal::None
, typename T12
= internal::None
,
5356 typename T13
= internal::None
, typename T14
= internal::None
,
5357 typename T15
= internal::None
, typename T16
= internal::None
,
5358 typename T17
= internal::None
, typename T18
= internal::None
,
5359 typename T19
= internal::None
, typename T20
= internal::None
,
5360 typename T21
= internal::None
, typename T22
= internal::None
,
5361 typename T23
= internal::None
, typename T24
= internal::None
,
5362 typename T25
= internal::None
, typename T26
= internal::None
,
5363 typename T27
= internal::None
, typename T28
= internal::None
,
5364 typename T29
= internal::None
, typename T30
= internal::None
,
5365 typename T31
= internal::None
, typename T32
= internal::None
,
5366 typename T33
= internal::None
, typename T34
= internal::None
,
5367 typename T35
= internal::None
, typename T36
= internal::None
,
5368 typename T37
= internal::None
, typename T38
= internal::None
,
5369 typename T39
= internal::None
, typename T40
= internal::None
,
5370 typename T41
= internal::None
, typename T42
= internal::None
,
5371 typename T43
= internal::None
, typename T44
= internal::None
,
5372 typename T45
= internal::None
, typename T46
= internal::None
,
5373 typename T47
= internal::None
, typename T48
= internal::None
,
5374 typename T49
= internal::None
, typename T50
= internal::None
>
5376 typedef internal::Types50
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5377 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5378 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
5379 T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
, T50
> type
;
5383 struct Types
<internal::None
, internal::None
, internal::None
, internal::None
,
5384 internal::None
, internal::None
, internal::None
, internal::None
,
5385 internal::None
, internal::None
, internal::None
, internal::None
,
5386 internal::None
, internal::None
, internal::None
, internal::None
,
5387 internal::None
, internal::None
, internal::None
, internal::None
,
5388 internal::None
, internal::None
, internal::None
, internal::None
,
5389 internal::None
, internal::None
, internal::None
, internal::None
,
5390 internal::None
, internal::None
, internal::None
, internal::None
,
5391 internal::None
, internal::None
, internal::None
, internal::None
,
5392 internal::None
, internal::None
, internal::None
, internal::None
,
5393 internal::None
, internal::None
, internal::None
, internal::None
,
5394 internal::None
, internal::None
, internal::None
, internal::None
,
5395 internal::None
, internal::None
> {
5396 typedef internal::Types0 type
;
5398 template <typename T1
>
5399 struct Types
<T1
, internal::None
, internal::None
, internal::None
,
5400 internal::None
, internal::None
, internal::None
, internal::None
,
5401 internal::None
, internal::None
, internal::None
, internal::None
,
5402 internal::None
, internal::None
, internal::None
, internal::None
,
5403 internal::None
, internal::None
, internal::None
, internal::None
,
5404 internal::None
, internal::None
, internal::None
, internal::None
,
5405 internal::None
, internal::None
, internal::None
, internal::None
,
5406 internal::None
, internal::None
, internal::None
, internal::None
,
5407 internal::None
, internal::None
, internal::None
, internal::None
,
5408 internal::None
, internal::None
, internal::None
, internal::None
,
5409 internal::None
, internal::None
, internal::None
, internal::None
,
5410 internal::None
, internal::None
, internal::None
, internal::None
,
5411 internal::None
, internal::None
> {
5412 typedef internal::Types1
<T1
> type
;
5414 template <typename T1
, typename T2
>
5415 struct Types
<T1
, T2
, internal::None
, internal::None
, internal::None
,
5416 internal::None
, internal::None
, internal::None
, internal::None
,
5417 internal::None
, internal::None
, internal::None
, internal::None
,
5418 internal::None
, internal::None
, internal::None
, internal::None
,
5419 internal::None
, internal::None
, internal::None
, internal::None
,
5420 internal::None
, internal::None
, internal::None
, internal::None
,
5421 internal::None
, internal::None
, internal::None
, internal::None
,
5422 internal::None
, internal::None
, internal::None
, internal::None
,
5423 internal::None
, internal::None
, internal::None
, internal::None
,
5424 internal::None
, internal::None
, internal::None
, internal::None
,
5425 internal::None
, internal::None
, internal::None
, internal::None
,
5426 internal::None
, internal::None
, internal::None
, internal::None
,
5428 typedef internal::Types2
<T1
, T2
> type
;
5430 template <typename T1
, typename T2
, typename T3
>
5431 struct Types
<T1
, T2
, T3
, internal::None
, internal::None
, internal::None
,
5432 internal::None
, internal::None
, internal::None
, internal::None
,
5433 internal::None
, internal::None
, internal::None
, internal::None
,
5434 internal::None
, internal::None
, internal::None
, internal::None
,
5435 internal::None
, internal::None
, internal::None
, internal::None
,
5436 internal::None
, internal::None
, internal::None
, internal::None
,
5437 internal::None
, internal::None
, internal::None
, internal::None
,
5438 internal::None
, internal::None
, internal::None
, internal::None
,
5439 internal::None
, internal::None
, internal::None
, internal::None
,
5440 internal::None
, internal::None
, internal::None
, internal::None
,
5441 internal::None
, internal::None
, internal::None
, internal::None
,
5442 internal::None
, internal::None
, internal::None
, internal::None
> {
5443 typedef internal::Types3
<T1
, T2
, T3
> type
;
5445 template <typename T1
, typename T2
, typename T3
, typename T4
>
5446 struct Types
<T1
, T2
, T3
, T4
, internal::None
, internal::None
, internal::None
,
5447 internal::None
, internal::None
, internal::None
, internal::None
,
5448 internal::None
, internal::None
, internal::None
, internal::None
,
5449 internal::None
, internal::None
, internal::None
, internal::None
,
5450 internal::None
, internal::None
, internal::None
, internal::None
,
5451 internal::None
, internal::None
, internal::None
, internal::None
,
5452 internal::None
, internal::None
, internal::None
, internal::None
,
5453 internal::None
, internal::None
, internal::None
, internal::None
,
5454 internal::None
, internal::None
, internal::None
, internal::None
,
5455 internal::None
, internal::None
, internal::None
, internal::None
,
5456 internal::None
, internal::None
, internal::None
, internal::None
,
5457 internal::None
, internal::None
, internal::None
> {
5458 typedef internal::Types4
<T1
, T2
, T3
, T4
> type
;
5460 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
5461 struct Types
<T1
, T2
, T3
, T4
, T5
, internal::None
, internal::None
,
5462 internal::None
, internal::None
, internal::None
, internal::None
,
5463 internal::None
, internal::None
, internal::None
, internal::None
,
5464 internal::None
, internal::None
, internal::None
, internal::None
,
5465 internal::None
, internal::None
, internal::None
, internal::None
,
5466 internal::None
, internal::None
, internal::None
, internal::None
,
5467 internal::None
, internal::None
, internal::None
, internal::None
,
5468 internal::None
, internal::None
, internal::None
, internal::None
,
5469 internal::None
, internal::None
, internal::None
, internal::None
,
5470 internal::None
, internal::None
, internal::None
, internal::None
,
5471 internal::None
, internal::None
, internal::None
, internal::None
,
5472 internal::None
, internal::None
, internal::None
> {
5473 typedef internal::Types5
<T1
, T2
, T3
, T4
, T5
> type
;
5475 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5477 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, internal::None
, internal::None
,
5478 internal::None
, internal::None
, internal::None
, internal::None
,
5479 internal::None
, internal::None
, internal::None
, internal::None
,
5480 internal::None
, internal::None
, internal::None
, internal::None
,
5481 internal::None
, internal::None
, internal::None
, internal::None
,
5482 internal::None
, internal::None
, internal::None
, internal::None
,
5483 internal::None
, internal::None
, internal::None
, internal::None
,
5484 internal::None
, internal::None
, internal::None
, internal::None
,
5485 internal::None
, internal::None
, internal::None
, internal::None
,
5486 internal::None
, internal::None
, internal::None
, internal::None
,
5487 internal::None
, internal::None
, internal::None
, internal::None
,
5488 internal::None
, internal::None
> {
5489 typedef internal::Types6
<T1
, T2
, T3
, T4
, T5
, T6
> type
;
5491 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5492 typename T6
, typename T7
>
5493 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, internal::None
, internal::None
,
5494 internal::None
, internal::None
, internal::None
, internal::None
,
5495 internal::None
, internal::None
, internal::None
, internal::None
,
5496 internal::None
, internal::None
, internal::None
, internal::None
,
5497 internal::None
, internal::None
, internal::None
, internal::None
,
5498 internal::None
, internal::None
, internal::None
, internal::None
,
5499 internal::None
, internal::None
, internal::None
, internal::None
,
5500 internal::None
, internal::None
, internal::None
, internal::None
,
5501 internal::None
, internal::None
, internal::None
, internal::None
,
5502 internal::None
, internal::None
, internal::None
, internal::None
,
5503 internal::None
, internal::None
, internal::None
, internal::None
,
5505 typedef internal::Types7
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> type
;
5507 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5508 typename T6
, typename T7
, typename T8
>
5509 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, internal::None
, internal::None
,
5510 internal::None
, internal::None
, internal::None
, internal::None
,
5511 internal::None
, internal::None
, internal::None
, internal::None
,
5512 internal::None
, internal::None
, internal::None
, internal::None
,
5513 internal::None
, internal::None
, internal::None
, internal::None
,
5514 internal::None
, internal::None
, internal::None
, internal::None
,
5515 internal::None
, internal::None
, internal::None
, internal::None
,
5516 internal::None
, internal::None
, internal::None
, internal::None
,
5517 internal::None
, internal::None
, internal::None
, internal::None
,
5518 internal::None
, internal::None
, internal::None
, internal::None
,
5519 internal::None
, internal::None
, internal::None
, internal::None
> {
5520 typedef internal::Types8
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
> type
;
5522 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5523 typename T6
, typename T7
, typename T8
, typename T9
>
5524 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, internal::None
,
5525 internal::None
, internal::None
, internal::None
, internal::None
,
5526 internal::None
, internal::None
, internal::None
, internal::None
,
5527 internal::None
, internal::None
, internal::None
, internal::None
,
5528 internal::None
, internal::None
, internal::None
, internal::None
,
5529 internal::None
, internal::None
, internal::None
, internal::None
,
5530 internal::None
, internal::None
, internal::None
, internal::None
,
5531 internal::None
, internal::None
, internal::None
, internal::None
,
5532 internal::None
, internal::None
, internal::None
, internal::None
,
5533 internal::None
, internal::None
, internal::None
, internal::None
,
5534 internal::None
, internal::None
, internal::None
, internal::None
> {
5535 typedef internal::Types9
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
> type
;
5537 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5538 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
5539 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, internal::None
,
5540 internal::None
, internal::None
, internal::None
, internal::None
,
5541 internal::None
, internal::None
, internal::None
, internal::None
,
5542 internal::None
, internal::None
, internal::None
, internal::None
,
5543 internal::None
, internal::None
, internal::None
, internal::None
,
5544 internal::None
, internal::None
, internal::None
, internal::None
,
5545 internal::None
, internal::None
, internal::None
, internal::None
,
5546 internal::None
, internal::None
, internal::None
, internal::None
,
5547 internal::None
, internal::None
, internal::None
, internal::None
,
5548 internal::None
, internal::None
, internal::None
, internal::None
,
5549 internal::None
, internal::None
, internal::None
> {
5550 typedef internal::Types10
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
> type
;
5552 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5553 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5555 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, internal::None
,
5556 internal::None
, internal::None
, internal::None
, internal::None
,
5557 internal::None
, internal::None
, internal::None
, internal::None
,
5558 internal::None
, internal::None
, internal::None
, internal::None
,
5559 internal::None
, internal::None
, internal::None
, internal::None
,
5560 internal::None
, internal::None
, internal::None
, internal::None
,
5561 internal::None
, internal::None
, internal::None
, internal::None
,
5562 internal::None
, internal::None
, internal::None
, internal::None
,
5563 internal::None
, internal::None
, internal::None
, internal::None
,
5564 internal::None
, internal::None
, internal::None
, internal::None
,
5565 internal::None
, internal::None
> {
5566 typedef internal::Types11
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
> type
;
5568 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5569 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5570 typename T11
, typename T12
>
5571 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, internal::None
,
5572 internal::None
, internal::None
, internal::None
, internal::None
,
5573 internal::None
, internal::None
, internal::None
, internal::None
,
5574 internal::None
, internal::None
, internal::None
, internal::None
,
5575 internal::None
, internal::None
, internal::None
, internal::None
,
5576 internal::None
, internal::None
, internal::None
, internal::None
,
5577 internal::None
, internal::None
, internal::None
, internal::None
,
5578 internal::None
, internal::None
, internal::None
, internal::None
,
5579 internal::None
, internal::None
, internal::None
, internal::None
,
5580 internal::None
, internal::None
, internal::None
, internal::None
,
5582 typedef internal::Types12
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
5585 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5586 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5587 typename T11
, typename T12
, typename T13
>
5588 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
5589 internal::None
, internal::None
, internal::None
, internal::None
,
5590 internal::None
, internal::None
, internal::None
, internal::None
,
5591 internal::None
, internal::None
, internal::None
, internal::None
,
5592 internal::None
, internal::None
, internal::None
, internal::None
,
5593 internal::None
, internal::None
, internal::None
, internal::None
,
5594 internal::None
, internal::None
, internal::None
, internal::None
,
5595 internal::None
, internal::None
, internal::None
, internal::None
,
5596 internal::None
, internal::None
, internal::None
, internal::None
,
5597 internal::None
, internal::None
, internal::None
, internal::None
,
5599 typedef internal::Types13
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5602 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5603 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5604 typename T11
, typename T12
, typename T13
, typename T14
>
5605 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
5606 internal::None
, internal::None
, internal::None
, internal::None
,
5607 internal::None
, internal::None
, internal::None
, internal::None
,
5608 internal::None
, internal::None
, internal::None
, internal::None
,
5609 internal::None
, internal::None
, internal::None
, internal::None
,
5610 internal::None
, internal::None
, internal::None
, internal::None
,
5611 internal::None
, internal::None
, internal::None
, internal::None
,
5612 internal::None
, internal::None
, internal::None
, internal::None
,
5613 internal::None
, internal::None
, internal::None
, internal::None
,
5614 internal::None
, internal::None
, internal::None
, internal::None
> {
5615 typedef internal::Types14
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5618 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5619 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5620 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
>
5621 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5622 internal::None
, internal::None
, internal::None
, internal::None
,
5623 internal::None
, internal::None
, internal::None
, internal::None
,
5624 internal::None
, internal::None
, internal::None
, internal::None
,
5625 internal::None
, internal::None
, internal::None
, internal::None
,
5626 internal::None
, internal::None
, internal::None
, internal::None
,
5627 internal::None
, internal::None
, internal::None
, internal::None
,
5628 internal::None
, internal::None
, internal::None
, internal::None
,
5629 internal::None
, internal::None
, internal::None
, internal::None
,
5630 internal::None
, internal::None
, internal::None
> {
5631 typedef internal::Types15
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5632 T13
, T14
, T15
> type
;
5634 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5635 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5636 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5638 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5639 T16
, internal::None
, internal::None
, internal::None
, internal::None
,
5640 internal::None
, internal::None
, internal::None
, internal::None
,
5641 internal::None
, internal::None
, internal::None
, internal::None
,
5642 internal::None
, internal::None
, internal::None
, internal::None
,
5643 internal::None
, internal::None
, internal::None
, internal::None
,
5644 internal::None
, internal::None
, internal::None
, internal::None
,
5645 internal::None
, internal::None
, internal::None
, internal::None
,
5646 internal::None
, internal::None
, internal::None
, internal::None
,
5647 internal::None
, internal::None
> {
5648 typedef internal::Types16
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5649 T13
, T14
, T15
, T16
> type
;
5651 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5652 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5653 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5654 typename T16
, typename T17
>
5655 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5656 T16
, T17
, internal::None
, internal::None
, internal::None
, internal::None
,
5657 internal::None
, internal::None
, internal::None
, internal::None
,
5658 internal::None
, internal::None
, internal::None
, internal::None
,
5659 internal::None
, internal::None
, internal::None
, internal::None
,
5660 internal::None
, internal::None
, internal::None
, internal::None
,
5661 internal::None
, internal::None
, internal::None
, internal::None
,
5662 internal::None
, internal::None
, internal::None
, internal::None
,
5663 internal::None
, internal::None
, internal::None
, internal::None
,
5665 typedef internal::Types17
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5666 T13
, T14
, T15
, T16
, T17
> type
;
5668 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5669 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5670 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5671 typename T16
, typename T17
, typename T18
>
5672 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5673 T16
, T17
, T18
, internal::None
, internal::None
, internal::None
,
5674 internal::None
, internal::None
, internal::None
, internal::None
,
5675 internal::None
, internal::None
, internal::None
, internal::None
,
5676 internal::None
, internal::None
, internal::None
, internal::None
,
5677 internal::None
, internal::None
, internal::None
, internal::None
,
5678 internal::None
, internal::None
, internal::None
, internal::None
,
5679 internal::None
, internal::None
, internal::None
, internal::None
,
5680 internal::None
, internal::None
, internal::None
, internal::None
,
5682 typedef internal::Types18
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5683 T13
, T14
, T15
, T16
, T17
, T18
> type
;
5685 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5686 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5687 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5688 typename T16
, typename T17
, typename T18
, typename T19
>
5689 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5690 T16
, T17
, T18
, T19
, internal::None
, internal::None
, internal::None
,
5691 internal::None
, internal::None
, internal::None
, internal::None
,
5692 internal::None
, internal::None
, internal::None
, internal::None
,
5693 internal::None
, internal::None
, internal::None
, internal::None
,
5694 internal::None
, internal::None
, internal::None
, internal::None
,
5695 internal::None
, internal::None
, internal::None
, internal::None
,
5696 internal::None
, internal::None
, internal::None
, internal::None
,
5697 internal::None
, internal::None
, internal::None
, internal::None
> {
5698 typedef internal::Types19
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5699 T13
, T14
, T15
, T16
, T17
, T18
, T19
> type
;
5701 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5702 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5703 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5704 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
>
5705 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5706 T16
, T17
, T18
, T19
, T20
, internal::None
, internal::None
, internal::None
,
5707 internal::None
, internal::None
, internal::None
, internal::None
,
5708 internal::None
, internal::None
, internal::None
, internal::None
,
5709 internal::None
, internal::None
, internal::None
, internal::None
,
5710 internal::None
, internal::None
, internal::None
, internal::None
,
5711 internal::None
, internal::None
, internal::None
, internal::None
,
5712 internal::None
, internal::None
, internal::None
, internal::None
,
5713 internal::None
, internal::None
, internal::None
> {
5714 typedef internal::Types20
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5715 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
> type
;
5717 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5718 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5719 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5720 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5722 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5723 T16
, T17
, T18
, T19
, T20
, T21
, internal::None
, internal::None
,
5724 internal::None
, internal::None
, internal::None
, internal::None
,
5725 internal::None
, internal::None
, internal::None
, internal::None
,
5726 internal::None
, internal::None
, internal::None
, internal::None
,
5727 internal::None
, internal::None
, internal::None
, internal::None
,
5728 internal::None
, internal::None
, internal::None
, internal::None
,
5729 internal::None
, internal::None
, internal::None
, internal::None
,
5730 internal::None
, internal::None
, internal::None
> {
5731 typedef internal::Types21
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5732 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
> type
;
5734 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5735 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5736 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5737 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5738 typename T21
, typename T22
>
5739 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5740 T16
, T17
, T18
, T19
, T20
, T21
, T22
, internal::None
, internal::None
,
5741 internal::None
, internal::None
, internal::None
, internal::None
,
5742 internal::None
, internal::None
, internal::None
, internal::None
,
5743 internal::None
, internal::None
, internal::None
, internal::None
,
5744 internal::None
, internal::None
, internal::None
, internal::None
,
5745 internal::None
, internal::None
, internal::None
, internal::None
,
5746 internal::None
, internal::None
, internal::None
, internal::None
,
5747 internal::None
, internal::None
> {
5748 typedef internal::Types22
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5749 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
> type
;
5751 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5752 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5753 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5754 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5755 typename T21
, typename T22
, typename T23
>
5756 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5757 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, internal::None
, internal::None
,
5758 internal::None
, internal::None
, internal::None
, internal::None
,
5759 internal::None
, internal::None
, internal::None
, internal::None
,
5760 internal::None
, internal::None
, internal::None
, internal::None
,
5761 internal::None
, internal::None
, internal::None
, internal::None
,
5762 internal::None
, internal::None
, internal::None
, internal::None
,
5763 internal::None
, internal::None
, internal::None
, internal::None
,
5765 typedef internal::Types23
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5766 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
> type
;
5768 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5769 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5770 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5771 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5772 typename T21
, typename T22
, typename T23
, typename T24
>
5773 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5774 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, internal::None
,
5775 internal::None
, internal::None
, internal::None
, internal::None
,
5776 internal::None
, internal::None
, internal::None
, internal::None
,
5777 internal::None
, internal::None
, internal::None
, internal::None
,
5778 internal::None
, internal::None
, internal::None
, internal::None
,
5779 internal::None
, internal::None
, internal::None
, internal::None
,
5780 internal::None
, internal::None
, internal::None
, internal::None
,
5782 typedef internal::Types24
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5783 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
> type
;
5785 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5786 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5787 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5788 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5789 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
>
5790 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5791 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, internal::None
,
5792 internal::None
, internal::None
, internal::None
, internal::None
,
5793 internal::None
, internal::None
, internal::None
, internal::None
,
5794 internal::None
, internal::None
, internal::None
, internal::None
,
5795 internal::None
, internal::None
, internal::None
, internal::None
,
5796 internal::None
, internal::None
, internal::None
, internal::None
,
5797 internal::None
, internal::None
, internal::None
, internal::None
> {
5798 typedef internal::Types25
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5799 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
> type
;
5801 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5802 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5803 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5804 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5805 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5807 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5808 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, internal::None
,
5809 internal::None
, internal::None
, internal::None
, internal::None
,
5810 internal::None
, internal::None
, internal::None
, internal::None
,
5811 internal::None
, internal::None
, internal::None
, internal::None
,
5812 internal::None
, internal::None
, internal::None
, internal::None
,
5813 internal::None
, internal::None
, internal::None
, internal::None
,
5814 internal::None
, internal::None
, internal::None
> {
5815 typedef internal::Types26
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5816 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
5819 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5820 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5821 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5822 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5823 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5824 typename T26
, typename T27
>
5825 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5826 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, internal::None
,
5827 internal::None
, internal::None
, internal::None
, internal::None
,
5828 internal::None
, internal::None
, internal::None
, internal::None
,
5829 internal::None
, internal::None
, internal::None
, internal::None
,
5830 internal::None
, internal::None
, internal::None
, internal::None
,
5831 internal::None
, internal::None
, internal::None
, internal::None
,
5832 internal::None
, internal::None
> {
5833 typedef internal::Types27
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5834 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5837 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5838 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5839 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5840 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5841 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5842 typename T26
, typename T27
, typename T28
>
5843 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5844 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
5845 internal::None
, internal::None
, internal::None
, internal::None
,
5846 internal::None
, internal::None
, internal::None
, internal::None
,
5847 internal::None
, internal::None
, internal::None
, internal::None
,
5848 internal::None
, internal::None
, internal::None
, internal::None
,
5849 internal::None
, internal::None
, internal::None
, internal::None
,
5850 internal::None
, internal::None
> {
5851 typedef internal::Types28
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5852 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5855 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5856 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5857 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5858 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5859 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5860 typename T26
, typename T27
, typename T28
, typename T29
>
5861 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5862 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
5863 internal::None
, internal::None
, internal::None
, internal::None
,
5864 internal::None
, internal::None
, internal::None
, internal::None
,
5865 internal::None
, internal::None
, internal::None
, internal::None
,
5866 internal::None
, internal::None
, internal::None
, internal::None
,
5867 internal::None
, internal::None
, internal::None
, internal::None
,
5869 typedef internal::Types29
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5870 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5871 T27
, T28
, T29
> type
;
5873 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5874 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5875 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5876 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5877 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5878 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
>
5879 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5880 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5881 internal::None
, internal::None
, internal::None
, internal::None
,
5882 internal::None
, internal::None
, internal::None
, internal::None
,
5883 internal::None
, internal::None
, internal::None
, internal::None
,
5884 internal::None
, internal::None
, internal::None
, internal::None
,
5885 internal::None
, internal::None
, internal::None
, internal::None
> {
5886 typedef internal::Types30
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5887 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5888 T27
, T28
, T29
, T30
> type
;
5890 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5891 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5892 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5893 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5894 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5895 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5897 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5898 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5899 T31
, internal::None
, internal::None
, internal::None
, internal::None
,
5900 internal::None
, internal::None
, internal::None
, internal::None
,
5901 internal::None
, internal::None
, internal::None
, internal::None
,
5902 internal::None
, internal::None
, internal::None
, internal::None
,
5903 internal::None
, internal::None
, internal::None
> {
5904 typedef internal::Types31
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5905 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5906 T27
, T28
, T29
, T30
, T31
> type
;
5908 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5909 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5910 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5911 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5912 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5913 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5914 typename T31
, typename T32
>
5915 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5916 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5917 T31
, T32
, internal::None
, internal::None
, internal::None
, internal::None
,
5918 internal::None
, internal::None
, internal::None
, internal::None
,
5919 internal::None
, internal::None
, internal::None
, internal::None
,
5920 internal::None
, internal::None
, internal::None
, internal::None
,
5921 internal::None
, internal::None
> {
5922 typedef internal::Types32
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5923 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5924 T27
, T28
, T29
, T30
, T31
, T32
> type
;
5926 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5927 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5928 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5929 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5930 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5931 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5932 typename T31
, typename T32
, typename T33
>
5933 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5934 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5935 T31
, T32
, T33
, internal::None
, internal::None
, internal::None
,
5936 internal::None
, internal::None
, internal::None
, internal::None
,
5937 internal::None
, internal::None
, internal::None
, internal::None
,
5938 internal::None
, internal::None
, internal::None
, internal::None
,
5939 internal::None
, internal::None
> {
5940 typedef internal::Types33
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5941 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5942 T27
, T28
, T29
, T30
, T31
, T32
, T33
> type
;
5944 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5945 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5946 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5947 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5948 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5949 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5950 typename T31
, typename T32
, typename T33
, typename T34
>
5951 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5952 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5953 T31
, T32
, T33
, T34
, internal::None
, internal::None
, internal::None
,
5954 internal::None
, internal::None
, internal::None
, internal::None
,
5955 internal::None
, internal::None
, internal::None
, internal::None
,
5956 internal::None
, internal::None
, internal::None
, internal::None
,
5958 typedef internal::Types34
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5959 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5960 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
> type
;
5962 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5963 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5964 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5965 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5966 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5967 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5968 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
>
5969 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5970 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5971 T31
, T32
, T33
, T34
, T35
, internal::None
, internal::None
, internal::None
,
5972 internal::None
, internal::None
, internal::None
, internal::None
,
5973 internal::None
, internal::None
, internal::None
, internal::None
,
5974 internal::None
, internal::None
, internal::None
, internal::None
> {
5975 typedef internal::Types35
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5976 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5977 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
> type
;
5979 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5980 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5981 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
5982 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
5983 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
5984 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
5985 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
5987 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
5988 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
5989 T31
, T32
, T33
, T34
, T35
, T36
, internal::None
, internal::None
,
5990 internal::None
, internal::None
, internal::None
, internal::None
,
5991 internal::None
, internal::None
, internal::None
, internal::None
,
5992 internal::None
, internal::None
, internal::None
, internal::None
> {
5993 typedef internal::Types36
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
5994 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
5995 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
> type
;
5997 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
5998 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
5999 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6000 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6001 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6002 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6003 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6004 typename T36
, typename T37
>
6005 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6006 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6007 T31
, T32
, T33
, T34
, T35
, T36
, T37
, internal::None
, internal::None
,
6008 internal::None
, internal::None
, internal::None
, internal::None
,
6009 internal::None
, internal::None
, internal::None
, internal::None
,
6010 internal::None
, internal::None
, internal::None
> {
6011 typedef internal::Types37
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6012 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6013 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
> type
;
6015 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6016 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6017 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6018 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6019 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6020 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6021 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6022 typename T36
, typename T37
, typename T38
>
6023 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6024 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6025 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, internal::None
, internal::None
,
6026 internal::None
, internal::None
, internal::None
, internal::None
,
6027 internal::None
, internal::None
, internal::None
, internal::None
,
6028 internal::None
, internal::None
> {
6029 typedef internal::Types38
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6030 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6031 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
> type
;
6033 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6034 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6035 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6036 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6037 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6038 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6039 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6040 typename T36
, typename T37
, typename T38
, typename T39
>
6041 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6042 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6043 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, internal::None
,
6044 internal::None
, internal::None
, internal::None
, internal::None
,
6045 internal::None
, internal::None
, internal::None
, internal::None
,
6046 internal::None
, internal::None
> {
6047 typedef internal::Types39
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6048 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6049 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
> type
;
6051 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6052 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6053 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6054 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6055 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6056 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6057 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6058 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
>
6059 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6060 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6061 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, internal::None
,
6062 internal::None
, internal::None
, internal::None
, internal::None
,
6063 internal::None
, internal::None
, internal::None
, internal::None
,
6065 typedef internal::Types40
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6066 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6067 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
6070 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6071 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6072 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6073 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6074 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6075 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6076 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6077 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6079 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6080 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6081 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, internal::None
,
6082 internal::None
, internal::None
, internal::None
, internal::None
,
6083 internal::None
, internal::None
, internal::None
, internal::None
> {
6084 typedef internal::Types41
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6085 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6086 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6089 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6090 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6091 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6092 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6093 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6094 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6095 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6096 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6097 typename T41
, typename T42
>
6098 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6099 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6100 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, internal::None
,
6101 internal::None
, internal::None
, internal::None
, internal::None
,
6102 internal::None
, internal::None
, internal::None
> {
6103 typedef internal::Types42
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6104 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6105 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6108 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6109 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6110 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6111 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6112 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6113 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6114 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6115 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6116 typename T41
, typename T42
, typename T43
>
6117 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6118 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6119 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
6120 internal::None
, internal::None
, internal::None
, internal::None
,
6121 internal::None
, internal::None
, internal::None
> {
6122 typedef internal::Types43
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6123 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6124 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6125 T41
, T42
, T43
> type
;
6127 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6128 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6129 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6130 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6131 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6132 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6133 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6134 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6135 typename T41
, typename T42
, typename T43
, typename T44
>
6136 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6137 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6138 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
6139 internal::None
, internal::None
, internal::None
, internal::None
,
6140 internal::None
, internal::None
> {
6141 typedef internal::Types44
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6142 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6143 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6144 T41
, T42
, T43
, T44
> type
;
6146 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6147 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6148 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6149 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6150 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6151 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6152 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6153 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6154 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
>
6155 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6156 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6157 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
, T45
,
6158 internal::None
, internal::None
, internal::None
, internal::None
,
6160 typedef internal::Types45
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6161 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6162 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6163 T41
, T42
, T43
, T44
, T45
> type
;
6165 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6166 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6167 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6168 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6169 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6170 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6171 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6172 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6173 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
6175 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6176 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6177 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
, T45
,
6178 T46
, internal::None
, internal::None
, internal::None
, internal::None
> {
6179 typedef internal::Types46
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6180 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6181 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6182 T41
, T42
, T43
, T44
, T45
, T46
> type
;
6184 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6185 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6186 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6187 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6188 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6189 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6190 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6191 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6192 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
6193 typename T46
, typename T47
>
6194 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6195 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6196 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
, T45
,
6197 T46
, T47
, internal::None
, internal::None
, internal::None
> {
6198 typedef internal::Types47
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6199 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6200 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6201 T41
, T42
, T43
, T44
, T45
, T46
, T47
> type
;
6203 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6204 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6205 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6206 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6207 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6208 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6209 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6210 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6211 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
6212 typename T46
, typename T47
, typename T48
>
6213 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6214 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6215 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
, T45
,
6216 T46
, T47
, T48
, internal::None
, internal::None
> {
6217 typedef internal::Types48
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6218 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6219 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6220 T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
> type
;
6222 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
6223 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
6224 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
6225 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
6226 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
6227 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
6228 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
6229 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
6230 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
6231 typename T46
, typename T47
, typename T48
, typename T49
>
6232 struct Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
,
6233 T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
, T30
,
6234 T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
, T45
,
6235 T46
, T47
, T48
, T49
, internal::None
> {
6236 typedef internal::Types49
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
6237 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
6238 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
6239 T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
> type
;
6242 namespace internal
{
6244 # define GTEST_TEMPLATE_ template <typename T> class
6246 // The template "selector" struct TemplateSel<Tmpl> is used to
6247 // represent Tmpl, which must be a class template with one type
6248 // parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
6249 // as the type Tmpl<T>. This allows us to actually instantiate the
6250 // template "selected" by TemplateSel<Tmpl>.
6252 // This trick is necessary for simulating typedef for class templates,
6253 // which C++ doesn't support directly.
6254 template <GTEST_TEMPLATE_ Tmpl
>
6255 struct TemplateSel
{
6256 template <typename T
>
6258 typedef Tmpl
<T
> type
;
6262 # define GTEST_BIND_(TmplSel, T) \
6263 TmplSel::template Bind<T>::type
6265 // A unique struct template used as the default value for the
6266 // arguments of class template Templates. This allows us to simulate
6267 // variadic templates (e.g. Templates<int>, Templates<int, double>,
6268 // and etc), which C++ doesn't support directly.
6269 template <typename T
>
6272 // The following family of struct and struct templates are used to
6273 // represent template lists. In particular, TemplatesN<T1, T2, ...,
6274 // TN> represents a list of N templates (T1, T2, ..., and TN). Except
6275 // for Templates0, every struct in the family has two member types:
6276 // Head for the selector of the first template in the list, and Tail
6277 // for the rest of the list.
6279 // The empty template list.
6280 struct Templates0
{};
6282 // Template lists of length 1, 2, 3, and so on.
6284 template <GTEST_TEMPLATE_ T1
>
6286 typedef TemplateSel
<T1
> Head
;
6287 typedef Templates0 Tail
;
6289 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
>
6291 typedef TemplateSel
<T1
> Head
;
6292 typedef Templates1
<T2
> Tail
;
6295 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
>
6297 typedef TemplateSel
<T1
> Head
;
6298 typedef Templates2
<T2
, T3
> Tail
;
6301 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6304 typedef TemplateSel
<T1
> Head
;
6305 typedef Templates3
<T2
, T3
, T4
> Tail
;
6308 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6309 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
>
6311 typedef TemplateSel
<T1
> Head
;
6312 typedef Templates4
<T2
, T3
, T4
, T5
> Tail
;
6315 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6316 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
>
6318 typedef TemplateSel
<T1
> Head
;
6319 typedef Templates5
<T2
, T3
, T4
, T5
, T6
> Tail
;
6322 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6323 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6326 typedef TemplateSel
<T1
> Head
;
6327 typedef Templates6
<T2
, T3
, T4
, T5
, T6
, T7
> Tail
;
6330 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6331 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6332 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
>
6334 typedef TemplateSel
<T1
> Head
;
6335 typedef Templates7
<T2
, T3
, T4
, T5
, T6
, T7
, T8
> Tail
;
6338 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6339 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6340 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
>
6342 typedef TemplateSel
<T1
> Head
;
6343 typedef Templates8
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
> Tail
;
6346 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6347 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6348 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6349 GTEST_TEMPLATE_ T10
>
6350 struct Templates10
{
6351 typedef TemplateSel
<T1
> Head
;
6352 typedef Templates9
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
> Tail
;
6355 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6356 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6357 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6358 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
>
6359 struct Templates11
{
6360 typedef TemplateSel
<T1
> Head
;
6361 typedef Templates10
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
> Tail
;
6364 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6365 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6366 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6367 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
>
6368 struct Templates12
{
6369 typedef TemplateSel
<T1
> Head
;
6370 typedef Templates11
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
> Tail
;
6373 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6374 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6375 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6376 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6377 GTEST_TEMPLATE_ T13
>
6378 struct Templates13
{
6379 typedef TemplateSel
<T1
> Head
;
6380 typedef Templates12
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
> Tail
;
6383 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6384 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6385 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6386 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6387 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
>
6388 struct Templates14
{
6389 typedef TemplateSel
<T1
> Head
;
6390 typedef Templates13
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
6394 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6395 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6396 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6397 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6398 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
>
6399 struct Templates15
{
6400 typedef TemplateSel
<T1
> Head
;
6401 typedef Templates14
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6405 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6406 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6407 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6408 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6409 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6410 GTEST_TEMPLATE_ T16
>
6411 struct Templates16
{
6412 typedef TemplateSel
<T1
> Head
;
6413 typedef Templates15
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6417 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6418 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6419 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6420 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6421 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6422 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
>
6423 struct Templates17
{
6424 typedef TemplateSel
<T1
> Head
;
6425 typedef Templates16
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6426 T15
, T16
, T17
> Tail
;
6429 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6430 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6431 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6432 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6433 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6434 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
>
6435 struct Templates18
{
6436 typedef TemplateSel
<T1
> Head
;
6437 typedef Templates17
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6438 T15
, T16
, T17
, T18
> Tail
;
6441 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6442 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6443 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6444 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6445 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6446 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6447 GTEST_TEMPLATE_ T19
>
6448 struct Templates19
{
6449 typedef TemplateSel
<T1
> Head
;
6450 typedef Templates18
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6451 T15
, T16
, T17
, T18
, T19
> Tail
;
6454 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6455 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6456 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6457 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6458 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6459 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6460 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
>
6461 struct Templates20
{
6462 typedef TemplateSel
<T1
> Head
;
6463 typedef Templates19
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6464 T15
, T16
, T17
, T18
, T19
, T20
> Tail
;
6467 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6468 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6469 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6470 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6471 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6472 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6473 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
>
6474 struct Templates21
{
6475 typedef TemplateSel
<T1
> Head
;
6476 typedef Templates20
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6477 T15
, T16
, T17
, T18
, T19
, T20
, T21
> Tail
;
6480 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6481 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6482 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6483 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6484 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6485 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6486 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6487 GTEST_TEMPLATE_ T22
>
6488 struct Templates22
{
6489 typedef TemplateSel
<T1
> Head
;
6490 typedef Templates21
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6491 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
> Tail
;
6494 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6495 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6496 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6497 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6498 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6499 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6500 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6501 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
>
6502 struct Templates23
{
6503 typedef TemplateSel
<T1
> Head
;
6504 typedef Templates22
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6505 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
> Tail
;
6508 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6509 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6510 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6511 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6512 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6513 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6514 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6515 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
>
6516 struct Templates24
{
6517 typedef TemplateSel
<T1
> Head
;
6518 typedef Templates23
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6519 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
> Tail
;
6522 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6523 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6524 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6525 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6526 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6527 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6528 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6529 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6530 GTEST_TEMPLATE_ T25
>
6531 struct Templates25
{
6532 typedef TemplateSel
<T1
> Head
;
6533 typedef Templates24
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6534 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
> Tail
;
6537 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6538 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6539 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6540 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6541 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6542 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6543 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6544 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6545 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
>
6546 struct Templates26
{
6547 typedef TemplateSel
<T1
> Head
;
6548 typedef Templates25
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6549 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
> Tail
;
6552 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6553 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6554 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6555 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6556 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6557 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6558 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6559 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6560 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
>
6561 struct Templates27
{
6562 typedef TemplateSel
<T1
> Head
;
6563 typedef Templates26
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6564 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
> Tail
;
6567 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6568 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6569 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6570 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6571 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6572 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6573 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6574 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6575 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6576 GTEST_TEMPLATE_ T28
>
6577 struct Templates28
{
6578 typedef TemplateSel
<T1
> Head
;
6579 typedef Templates27
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6580 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
6584 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6585 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6586 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6587 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6588 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6589 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6590 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6591 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6592 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6593 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
>
6594 struct Templates29
{
6595 typedef TemplateSel
<T1
> Head
;
6596 typedef Templates28
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6597 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6601 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6602 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6603 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6604 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6605 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6606 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6607 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6608 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6609 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6610 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
>
6611 struct Templates30
{
6612 typedef TemplateSel
<T1
> Head
;
6613 typedef Templates29
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6614 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6618 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6619 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6620 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6621 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6622 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6623 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6624 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6625 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6626 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6627 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6628 GTEST_TEMPLATE_ T31
>
6629 struct Templates31
{
6630 typedef TemplateSel
<T1
> Head
;
6631 typedef Templates30
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6632 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6633 T29
, T30
, T31
> Tail
;
6636 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6637 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6638 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6639 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6640 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6641 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6642 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6643 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6644 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6645 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6646 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
>
6647 struct Templates32
{
6648 typedef TemplateSel
<T1
> Head
;
6649 typedef Templates31
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6650 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6651 T29
, T30
, T31
, T32
> Tail
;
6654 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6655 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6656 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6657 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6658 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6659 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6660 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6661 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6662 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6663 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6664 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
>
6665 struct Templates33
{
6666 typedef TemplateSel
<T1
> Head
;
6667 typedef Templates32
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6668 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6669 T29
, T30
, T31
, T32
, T33
> Tail
;
6672 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6673 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6674 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6675 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6676 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6677 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6678 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6679 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6680 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6681 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6682 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6683 GTEST_TEMPLATE_ T34
>
6684 struct Templates34
{
6685 typedef TemplateSel
<T1
> Head
;
6686 typedef Templates33
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6687 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6688 T29
, T30
, T31
, T32
, T33
, T34
> Tail
;
6691 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6692 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6693 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6694 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6695 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6696 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6697 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6698 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6699 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6700 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6701 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6702 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
>
6703 struct Templates35
{
6704 typedef TemplateSel
<T1
> Head
;
6705 typedef Templates34
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6706 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6707 T29
, T30
, T31
, T32
, T33
, T34
, T35
> Tail
;
6710 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6711 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6712 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6713 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6714 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6715 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6716 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6717 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6718 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6719 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6720 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6721 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
>
6722 struct Templates36
{
6723 typedef TemplateSel
<T1
> Head
;
6724 typedef Templates35
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6725 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6726 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
> Tail
;
6729 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6730 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6731 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6732 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6733 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6734 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6735 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6736 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6737 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6738 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6739 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6740 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6741 GTEST_TEMPLATE_ T37
>
6742 struct Templates37
{
6743 typedef TemplateSel
<T1
> Head
;
6744 typedef Templates36
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6745 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6746 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
> Tail
;
6749 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6750 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6751 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6752 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6753 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6754 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6755 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6756 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6757 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6758 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6759 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6760 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6761 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
>
6762 struct Templates38
{
6763 typedef TemplateSel
<T1
> Head
;
6764 typedef Templates37
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6765 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6766 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
> Tail
;
6769 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6770 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6771 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6772 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6773 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6774 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6775 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6776 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6777 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6778 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6779 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6780 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6781 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
>
6782 struct Templates39
{
6783 typedef TemplateSel
<T1
> Head
;
6784 typedef Templates38
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6785 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6786 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
> Tail
;
6789 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6790 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6791 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6792 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6793 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6794 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6795 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6796 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6797 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6798 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6799 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6800 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6801 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6802 GTEST_TEMPLATE_ T40
>
6803 struct Templates40
{
6804 typedef TemplateSel
<T1
> Head
;
6805 typedef Templates39
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6806 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6807 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
> Tail
;
6810 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6811 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6812 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6813 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6814 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6815 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6816 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6817 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6818 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6819 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6820 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6821 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6822 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6823 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
>
6824 struct Templates41
{
6825 typedef TemplateSel
<T1
> Head
;
6826 typedef Templates40
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6827 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6828 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
> Tail
;
6831 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6832 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6833 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6834 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6835 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6836 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6837 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6838 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6839 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6840 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6841 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6842 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6843 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6844 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
>
6845 struct Templates42
{
6846 typedef TemplateSel
<T1
> Head
;
6847 typedef Templates41
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6848 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6849 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
6853 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6854 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6855 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6856 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6857 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6858 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6859 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6860 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6861 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6862 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6863 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6864 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6865 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6866 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
6867 GTEST_TEMPLATE_ T43
>
6868 struct Templates43
{
6869 typedef TemplateSel
<T1
> Head
;
6870 typedef Templates42
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6871 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6872 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
6876 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6877 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6878 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6879 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6880 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6881 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6882 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6883 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6884 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6885 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6886 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6887 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6888 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6889 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
6890 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
>
6891 struct Templates44
{
6892 typedef TemplateSel
<T1
> Head
;
6893 typedef Templates43
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6894 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6895 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
6899 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6900 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6901 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6902 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6903 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6904 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6905 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6906 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6907 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6908 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6909 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6910 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6911 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6912 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
6913 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
>
6914 struct Templates45
{
6915 typedef TemplateSel
<T1
> Head
;
6916 typedef Templates44
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6917 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6918 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
6919 T43
, T44
, T45
> Tail
;
6922 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6923 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6924 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6925 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6926 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6927 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6928 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6929 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6930 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6931 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6932 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6933 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6934 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6935 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
6936 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
6937 GTEST_TEMPLATE_ T46
>
6938 struct Templates46
{
6939 typedef TemplateSel
<T1
> Head
;
6940 typedef Templates45
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6941 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6942 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
6943 T43
, T44
, T45
, T46
> Tail
;
6946 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6947 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6948 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6949 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6950 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6951 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6952 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6953 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6954 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6955 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6956 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6957 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6958 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6959 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
6960 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
6961 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
>
6962 struct Templates47
{
6963 typedef TemplateSel
<T1
> Head
;
6964 typedef Templates46
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6965 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6966 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
6967 T43
, T44
, T45
, T46
, T47
> Tail
;
6970 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6971 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6972 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6973 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6974 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6975 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
6976 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
6977 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
6978 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
6979 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
6980 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
6981 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
6982 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
6983 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
6984 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
6985 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
, GTEST_TEMPLATE_ T48
>
6986 struct Templates48
{
6987 typedef TemplateSel
<T1
> Head
;
6988 typedef Templates47
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
6989 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
6990 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
6991 T43
, T44
, T45
, T46
, T47
, T48
> Tail
;
6994 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
6995 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
6996 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
6997 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
6998 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
6999 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7000 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7001 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7002 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7003 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7004 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7005 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7006 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7007 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7008 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
7009 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
, GTEST_TEMPLATE_ T48
,
7010 GTEST_TEMPLATE_ T49
>
7011 struct Templates49
{
7012 typedef TemplateSel
<T1
> Head
;
7013 typedef Templates48
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7014 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
7015 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
7016 T43
, T44
, T45
, T46
, T47
, T48
, T49
> Tail
;
7019 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7020 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7021 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7022 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7023 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7024 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7025 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7026 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7027 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7028 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7029 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7030 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7031 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7032 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7033 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
7034 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
, GTEST_TEMPLATE_ T48
,
7035 GTEST_TEMPLATE_ T49
, GTEST_TEMPLATE_ T50
>
7036 struct Templates50
{
7037 typedef TemplateSel
<T1
> Head
;
7038 typedef Templates49
<T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7039 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
7040 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
7041 T43
, T44
, T45
, T46
, T47
, T48
, T49
, T50
> Tail
;
7045 // We don't want to require the users to write TemplatesN<...> directly,
7046 // as that would require them to count the length. Templates<...> is much
7047 // easier to write, but generates horrible messages when there is a
7048 // compiler error, as gcc insists on printing out each template
7049 // argument, even if it has the default value (this means Templates<list>
7050 // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
7053 // Our solution is to combine the best part of the two approaches: a
7054 // user would write Templates<T1, ..., TN>, and Google Test will translate
7055 // that to TemplatesN<T1, ..., TN> internally to make error messages
7056 // readable. The translation is done by the 'type' member of the
7057 // Templates template.
7058 template <GTEST_TEMPLATE_ T1
= NoneT
, GTEST_TEMPLATE_ T2
= NoneT
,
7059 GTEST_TEMPLATE_ T3
= NoneT
, GTEST_TEMPLATE_ T4
= NoneT
,
7060 GTEST_TEMPLATE_ T5
= NoneT
, GTEST_TEMPLATE_ T6
= NoneT
,
7061 GTEST_TEMPLATE_ T7
= NoneT
, GTEST_TEMPLATE_ T8
= NoneT
,
7062 GTEST_TEMPLATE_ T9
= NoneT
, GTEST_TEMPLATE_ T10
= NoneT
,
7063 GTEST_TEMPLATE_ T11
= NoneT
, GTEST_TEMPLATE_ T12
= NoneT
,
7064 GTEST_TEMPLATE_ T13
= NoneT
, GTEST_TEMPLATE_ T14
= NoneT
,
7065 GTEST_TEMPLATE_ T15
= NoneT
, GTEST_TEMPLATE_ T16
= NoneT
,
7066 GTEST_TEMPLATE_ T17
= NoneT
, GTEST_TEMPLATE_ T18
= NoneT
,
7067 GTEST_TEMPLATE_ T19
= NoneT
, GTEST_TEMPLATE_ T20
= NoneT
,
7068 GTEST_TEMPLATE_ T21
= NoneT
, GTEST_TEMPLATE_ T22
= NoneT
,
7069 GTEST_TEMPLATE_ T23
= NoneT
, GTEST_TEMPLATE_ T24
= NoneT
,
7070 GTEST_TEMPLATE_ T25
= NoneT
, GTEST_TEMPLATE_ T26
= NoneT
,
7071 GTEST_TEMPLATE_ T27
= NoneT
, GTEST_TEMPLATE_ T28
= NoneT
,
7072 GTEST_TEMPLATE_ T29
= NoneT
, GTEST_TEMPLATE_ T30
= NoneT
,
7073 GTEST_TEMPLATE_ T31
= NoneT
, GTEST_TEMPLATE_ T32
= NoneT
,
7074 GTEST_TEMPLATE_ T33
= NoneT
, GTEST_TEMPLATE_ T34
= NoneT
,
7075 GTEST_TEMPLATE_ T35
= NoneT
, GTEST_TEMPLATE_ T36
= NoneT
,
7076 GTEST_TEMPLATE_ T37
= NoneT
, GTEST_TEMPLATE_ T38
= NoneT
,
7077 GTEST_TEMPLATE_ T39
= NoneT
, GTEST_TEMPLATE_ T40
= NoneT
,
7078 GTEST_TEMPLATE_ T41
= NoneT
, GTEST_TEMPLATE_ T42
= NoneT
,
7079 GTEST_TEMPLATE_ T43
= NoneT
, GTEST_TEMPLATE_ T44
= NoneT
,
7080 GTEST_TEMPLATE_ T45
= NoneT
, GTEST_TEMPLATE_ T46
= NoneT
,
7081 GTEST_TEMPLATE_ T47
= NoneT
, GTEST_TEMPLATE_ T48
= NoneT
,
7082 GTEST_TEMPLATE_ T49
= NoneT
, GTEST_TEMPLATE_ T50
= NoneT
>
7084 typedef Templates50
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7085 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7086 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7087 T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
, T50
> type
;
7091 struct Templates
<NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7092 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7093 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7094 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7095 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7097 typedef Templates0 type
;
7099 template <GTEST_TEMPLATE_ T1
>
7100 struct Templates
<T1
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7101 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7102 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7103 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7104 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7106 typedef Templates1
<T1
> type
;
7108 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
>
7109 struct Templates
<T1
, T2
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7110 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7111 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7112 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7113 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7115 typedef Templates2
<T1
, T2
> type
;
7117 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
>
7118 struct Templates
<T1
, T2
, T3
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7119 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7120 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7121 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7122 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7123 typedef Templates3
<T1
, T2
, T3
> type
;
7125 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7127 struct Templates
<T1
, T2
, T3
, T4
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7128 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7129 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7130 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7131 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7132 typedef Templates4
<T1
, T2
, T3
, T4
> type
;
7134 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7135 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
>
7136 struct Templates
<T1
, T2
, T3
, T4
, T5
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7137 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7138 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7139 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7140 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7141 typedef Templates5
<T1
, T2
, T3
, T4
, T5
> type
;
7143 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7144 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
>
7145 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7146 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7147 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7148 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7149 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7150 typedef Templates6
<T1
, T2
, T3
, T4
, T5
, T6
> type
;
7152 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7153 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7155 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7156 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7157 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7158 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7159 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7160 typedef Templates7
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> type
;
7162 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7163 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7164 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
>
7165 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, NoneT
, NoneT
, NoneT
, NoneT
,
7166 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7167 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7168 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7169 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7170 typedef Templates8
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
> type
;
7172 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7173 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7174 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
>
7175 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, NoneT
, NoneT
, NoneT
,
7176 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7177 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7178 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7179 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7180 typedef Templates9
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
> type
;
7182 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7183 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7184 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7185 GTEST_TEMPLATE_ T10
>
7186 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, NoneT
, NoneT
, NoneT
,
7187 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7188 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7189 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7190 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7191 typedef Templates10
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
> type
;
7193 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7194 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7195 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7196 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
>
7197 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, NoneT
, NoneT
,
7198 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7199 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7200 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7201 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7202 typedef Templates11
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
> type
;
7204 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7205 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7206 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7207 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
>
7208 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, NoneT
,
7209 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7210 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7211 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7212 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7213 typedef Templates12
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
> type
;
7215 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7216 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7217 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7218 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7219 GTEST_TEMPLATE_ T13
>
7220 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, NoneT
,
7221 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7222 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7223 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7224 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7225 typedef Templates13
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
7228 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7229 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7230 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7231 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7232 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
>
7233 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7234 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7235 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7236 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7237 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7238 typedef Templates14
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7241 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7242 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7243 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7244 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7245 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
>
7246 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7247 T15
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7248 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7249 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7250 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7251 typedef Templates15
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7254 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7255 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7256 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7257 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7258 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7259 GTEST_TEMPLATE_ T16
>
7260 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7261 T15
, T16
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7262 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7263 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7264 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7265 typedef Templates16
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7266 T14
, T15
, T16
> type
;
7268 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7269 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7270 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7271 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7272 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7273 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
>
7274 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7275 T15
, T16
, T17
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7276 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7277 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7278 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7279 typedef Templates17
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7280 T14
, T15
, T16
, T17
> type
;
7282 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7283 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7284 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7285 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7286 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7287 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
>
7288 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7289 T15
, T16
, T17
, T18
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7290 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7291 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7292 NoneT
, NoneT
, NoneT
, NoneT
> {
7293 typedef Templates18
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7294 T14
, T15
, T16
, T17
, T18
> type
;
7296 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7297 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7298 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7299 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7300 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7301 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7302 GTEST_TEMPLATE_ T19
>
7303 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7304 T15
, T16
, T17
, T18
, T19
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7305 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7306 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7307 NoneT
, NoneT
, NoneT
, NoneT
> {
7308 typedef Templates19
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7309 T14
, T15
, T16
, T17
, T18
, T19
> type
;
7311 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7312 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7313 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7314 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7315 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7316 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7317 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
>
7318 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7319 T15
, T16
, T17
, T18
, T19
, T20
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7320 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7321 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7322 NoneT
, NoneT
, NoneT
, NoneT
> {
7323 typedef Templates20
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7324 T14
, T15
, T16
, T17
, T18
, T19
, T20
> type
;
7326 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7327 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7328 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7329 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7330 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7331 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7332 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
>
7333 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7334 T15
, T16
, T17
, T18
, T19
, T20
, T21
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7335 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7336 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7337 NoneT
, NoneT
, NoneT
, NoneT
> {
7338 typedef Templates21
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7339 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
> type
;
7341 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7342 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7343 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7344 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7345 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7346 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7347 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7348 GTEST_TEMPLATE_ T22
>
7349 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7350 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7351 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7352 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7353 NoneT
, NoneT
, NoneT
> {
7354 typedef Templates22
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7355 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
> type
;
7357 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7358 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7359 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7360 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7361 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7362 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7363 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7364 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
>
7365 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7366 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, NoneT
, NoneT
, NoneT
, NoneT
,
7367 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7368 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7369 NoneT
, NoneT
, NoneT
> {
7370 typedef Templates23
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7371 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
> type
;
7373 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7374 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7375 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7376 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7377 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7378 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7379 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7380 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
>
7381 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7382 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, NoneT
, NoneT
, NoneT
,
7383 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7384 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7385 NoneT
, NoneT
, NoneT
> {
7386 typedef Templates24
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7387 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
> type
;
7389 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7390 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7391 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7392 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7393 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7394 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7395 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7396 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7397 GTEST_TEMPLATE_ T25
>
7398 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7399 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, NoneT
, NoneT
, NoneT
,
7400 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7401 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7403 typedef Templates25
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7404 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
> type
;
7406 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7407 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7408 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7409 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7410 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7411 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7412 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7413 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7414 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
>
7415 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7416 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, NoneT
, NoneT
,
7417 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7418 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7420 typedef Templates26
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7421 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
> type
;
7423 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7424 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7425 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7426 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7427 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7428 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7429 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7430 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7431 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
>
7432 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7433 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, NoneT
,
7434 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7435 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7437 typedef Templates27
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7438 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
7441 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7442 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7443 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7444 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7445 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7446 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7447 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7448 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7449 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7450 GTEST_TEMPLATE_ T28
>
7451 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7452 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
7453 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7454 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7456 typedef Templates28
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7457 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7460 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7461 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7462 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7463 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7464 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7465 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7466 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7467 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7468 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7469 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
>
7470 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7471 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7472 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7473 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7475 typedef Templates29
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7476 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7479 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7480 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7481 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7482 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7483 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7484 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7485 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7486 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7487 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7488 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
>
7489 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7490 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7491 T30
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7492 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7493 typedef Templates30
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7494 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7495 T28
, T29
, T30
> type
;
7497 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7498 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7499 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7500 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7501 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7502 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7503 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7504 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7505 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7506 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7507 GTEST_TEMPLATE_ T31
>
7508 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7509 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7510 T30
, T31
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7511 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7512 typedef Templates31
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7513 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7514 T28
, T29
, T30
, T31
> type
;
7516 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7517 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7518 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7519 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7520 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7521 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7522 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7523 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7524 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7525 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7526 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
>
7527 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7528 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7529 T30
, T31
, T32
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7530 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7531 typedef Templates32
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7532 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7533 T28
, T29
, T30
, T31
, T32
> type
;
7535 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7536 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7537 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7538 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7539 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7540 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7541 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7542 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7543 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7544 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7545 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
>
7546 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7547 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7548 T30
, T31
, T32
, T33
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7549 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7550 typedef Templates33
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7551 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7552 T28
, T29
, T30
, T31
, T32
, T33
> type
;
7554 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7555 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7556 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7557 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7558 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7559 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7560 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7561 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7562 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7563 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7564 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7565 GTEST_TEMPLATE_ T34
>
7566 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7567 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7568 T30
, T31
, T32
, T33
, T34
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7569 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7570 typedef Templates34
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7571 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7572 T28
, T29
, T30
, T31
, T32
, T33
, T34
> type
;
7574 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7575 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7576 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7577 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7578 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7579 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7580 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7581 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7582 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7583 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7584 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7585 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
>
7586 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7587 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7588 T30
, T31
, T32
, T33
, T34
, T35
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7589 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7590 typedef Templates35
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7591 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7592 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
> type
;
7594 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7595 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7596 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7597 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7598 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7599 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7600 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7601 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7602 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7603 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7604 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7605 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
>
7606 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7607 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7608 T30
, T31
, T32
, T33
, T34
, T35
, T36
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7609 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7610 typedef Templates36
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7611 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7612 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
> type
;
7614 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7615 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7616 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7617 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7618 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7619 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7620 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7621 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7622 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7623 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7624 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7625 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7626 GTEST_TEMPLATE_ T37
>
7627 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7628 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7629 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
,
7630 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7631 typedef Templates37
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7632 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7633 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
> type
;
7635 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7636 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7637 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7638 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7639 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7640 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7641 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7642 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7643 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7644 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7645 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7646 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7647 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
>
7648 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7649 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7650 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, NoneT
, NoneT
, NoneT
, NoneT
,
7651 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7652 typedef Templates38
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7653 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7654 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
> type
;
7656 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7657 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7658 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7659 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7660 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7661 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7662 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7663 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7664 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7665 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7666 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7667 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7668 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
>
7669 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7670 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7671 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, NoneT
, NoneT
, NoneT
,
7672 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7673 typedef Templates39
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7674 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7675 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
> type
;
7677 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7678 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7679 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7680 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7681 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7682 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7683 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7684 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7685 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7686 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7687 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7688 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7689 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7690 GTEST_TEMPLATE_ T40
>
7691 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7692 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7693 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, NoneT
, NoneT
, NoneT
,
7694 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7695 typedef Templates40
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7696 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7697 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
> type
;
7699 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7700 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7701 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7702 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7703 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7704 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7705 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7706 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7707 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7708 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7709 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7710 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7711 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7712 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
>
7713 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7714 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7715 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, NoneT
, NoneT
,
7716 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7717 typedef Templates41
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7718 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7719 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
7722 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7723 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7724 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7725 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7726 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7727 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7728 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7729 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7730 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7731 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7732 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7733 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7734 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7735 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
>
7736 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7737 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7738 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, NoneT
,
7739 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7740 typedef Templates42
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7741 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7742 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7745 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7746 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7747 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7748 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7749 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7750 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7751 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7752 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7753 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7754 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7755 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7756 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7757 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7758 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7759 GTEST_TEMPLATE_ T43
>
7760 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7761 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7762 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
7763 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7764 typedef Templates43
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7765 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7766 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7769 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7770 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7771 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7772 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7773 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7774 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7775 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7776 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7777 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7778 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7779 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7780 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7781 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7782 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7783 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
>
7784 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7785 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7786 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
7787 NoneT
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7788 typedef Templates44
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7789 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7790 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7791 T42
, T43
, T44
> type
;
7793 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7794 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7795 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7796 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7797 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7798 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7799 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7800 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7801 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7802 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7803 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7804 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7805 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7806 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7807 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
>
7808 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7809 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7810 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
7811 T45
, NoneT
, NoneT
, NoneT
, NoneT
, NoneT
> {
7812 typedef Templates45
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7813 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7814 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7815 T42
, T43
, T44
, T45
> type
;
7817 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7818 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7819 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7820 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7821 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7822 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7823 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7824 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7825 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7826 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7827 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7828 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7829 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7830 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7831 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
7832 GTEST_TEMPLATE_ T46
>
7833 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7834 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7835 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
7836 T45
, T46
, NoneT
, NoneT
, NoneT
, NoneT
> {
7837 typedef Templates46
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7838 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7839 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7840 T42
, T43
, T44
, T45
, T46
> type
;
7842 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7843 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7844 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7845 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7846 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7847 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7848 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7849 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7850 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7851 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7852 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7853 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7854 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7855 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7856 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
7857 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
>
7858 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7859 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7860 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
7861 T45
, T46
, T47
, NoneT
, NoneT
, NoneT
> {
7862 typedef Templates47
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7863 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7864 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7865 T42
, T43
, T44
, T45
, T46
, T47
> type
;
7867 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7868 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7869 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7870 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7871 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7872 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7873 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7874 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7875 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7876 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7877 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7878 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7879 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7880 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7881 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
7882 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
, GTEST_TEMPLATE_ T48
>
7883 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7884 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7885 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
7886 T45
, T46
, T47
, T48
, NoneT
, NoneT
> {
7887 typedef Templates48
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7888 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7889 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7890 T42
, T43
, T44
, T45
, T46
, T47
, T48
> type
;
7892 template <GTEST_TEMPLATE_ T1
, GTEST_TEMPLATE_ T2
, GTEST_TEMPLATE_ T3
,
7893 GTEST_TEMPLATE_ T4
, GTEST_TEMPLATE_ T5
, GTEST_TEMPLATE_ T6
,
7894 GTEST_TEMPLATE_ T7
, GTEST_TEMPLATE_ T8
, GTEST_TEMPLATE_ T9
,
7895 GTEST_TEMPLATE_ T10
, GTEST_TEMPLATE_ T11
, GTEST_TEMPLATE_ T12
,
7896 GTEST_TEMPLATE_ T13
, GTEST_TEMPLATE_ T14
, GTEST_TEMPLATE_ T15
,
7897 GTEST_TEMPLATE_ T16
, GTEST_TEMPLATE_ T17
, GTEST_TEMPLATE_ T18
,
7898 GTEST_TEMPLATE_ T19
, GTEST_TEMPLATE_ T20
, GTEST_TEMPLATE_ T21
,
7899 GTEST_TEMPLATE_ T22
, GTEST_TEMPLATE_ T23
, GTEST_TEMPLATE_ T24
,
7900 GTEST_TEMPLATE_ T25
, GTEST_TEMPLATE_ T26
, GTEST_TEMPLATE_ T27
,
7901 GTEST_TEMPLATE_ T28
, GTEST_TEMPLATE_ T29
, GTEST_TEMPLATE_ T30
,
7902 GTEST_TEMPLATE_ T31
, GTEST_TEMPLATE_ T32
, GTEST_TEMPLATE_ T33
,
7903 GTEST_TEMPLATE_ T34
, GTEST_TEMPLATE_ T35
, GTEST_TEMPLATE_ T36
,
7904 GTEST_TEMPLATE_ T37
, GTEST_TEMPLATE_ T38
, GTEST_TEMPLATE_ T39
,
7905 GTEST_TEMPLATE_ T40
, GTEST_TEMPLATE_ T41
, GTEST_TEMPLATE_ T42
,
7906 GTEST_TEMPLATE_ T43
, GTEST_TEMPLATE_ T44
, GTEST_TEMPLATE_ T45
,
7907 GTEST_TEMPLATE_ T46
, GTEST_TEMPLATE_ T47
, GTEST_TEMPLATE_ T48
,
7908 GTEST_TEMPLATE_ T49
>
7909 struct Templates
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
,
7910 T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
, T29
,
7911 T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
, T44
,
7912 T45
, T46
, T47
, T48
, T49
, NoneT
> {
7913 typedef Templates49
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7914 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
7915 T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
7916 T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
> type
;
7919 // The TypeList template makes it possible to use either a single type
7920 // or a Types<...> list in TYPED_TEST_CASE() and
7921 // INSTANTIATE_TYPED_TEST_CASE_P().
7923 template <typename T
>
7925 typedef Types1
<T
> type
;
7928 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
7929 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
7930 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
7931 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
7932 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
7933 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
7934 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
7935 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
7936 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
7937 typename T46
, typename T47
, typename T48
, typename T49
, typename T50
>
7938 struct TypeList
<Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
7939 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
7940 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
7941 T44
, T45
, T46
, T47
, T48
, T49
, T50
> > {
7942 typedef typename Types
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
7943 T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
7944 T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
7945 T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
, T50
>::type type
;
7948 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7950 } // namespace internal
7951 } // namespace testing
7953 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
7955 // Due to C++ preprocessor weirdness, we need double indirection to
7956 // concatenate two tokens when one of them is __LINE__. Writing
7960 // will result in the token foo__LINE__, instead of foo followed by
7961 // the current line number. For more details, see
7962 // http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
7963 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
7964 #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
7966 // Stringifies its argument.
7967 #define GTEST_STRINGIFY_(name) #name
7969 class ProtocolMessage
;
7970 namespace proto2
{ class Message
; }
7974 // Forward declarations.
7976 class AssertionResult
; // Result of an assertion.
7977 class Message
; // Represents a failure message.
7978 class Test
; // Represents a test.
7979 class TestInfo
; // Information about a test.
7980 class TestPartResult
; // Result of a test part.
7981 class UnitTest
; // A collection of test cases.
7983 template <typename T
>
7984 ::std::string
PrintToString(const T
& value
);
7986 namespace internal
{
7988 struct TraceInfo
; // Information about a trace point.
7989 class TestInfoImpl
; // Opaque implementation of TestInfo
7990 class UnitTestImpl
; // Opaque implementation of UnitTest
7992 // The text used in failure messages to indicate the start of the
7994 GTEST_API_
extern const char kStackTraceMarker
[];
7996 // Two overloaded helpers for checking at compile time whether an
7997 // expression is a null pointer literal (i.e. NULL or any 0-valued
7998 // compile-time integral constant). Their return values have
7999 // different sizes, so we can use sizeof() to test which version is
8000 // picked by the compiler. These helpers have no implementations, as
8001 // we only need their signatures.
8003 // Given IsNullLiteralHelper(x), the compiler will pick the first
8004 // version if x can be implicitly converted to Secret*, and pick the
8005 // second version otherwise. Since Secret is a secret and incomplete
8006 // type, the only expression a user can write that has type Secret* is
8007 // a null pointer literal. Therefore, we know that x is a null
8008 // pointer literal if and only if the first version is picked by the
8010 char IsNullLiteralHelper(Secret
* p
);
8011 char (&IsNullLiteralHelper(...))[2]; // NOLINT
8013 // A compile-time bool constant that is true if and only if x is a
8014 // null pointer literal (i.e. NULL or any 0-valued compile-time
8015 // integral constant).
8016 #ifdef GTEST_ELLIPSIS_NEEDS_POD_
8017 // We lose support for NULL detection where the compiler doesn't like
8018 // passing non-POD classes through ellipsis (...).
8019 # define GTEST_IS_NULL_LITERAL_(x) false
8021 # define GTEST_IS_NULL_LITERAL_(x) \
8022 (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
8023 #endif // GTEST_ELLIPSIS_NEEDS_POD_
8025 // Appends the user-supplied message to the Google-Test-generated message.
8026 GTEST_API_
std::string
AppendUserMessage(
8027 const std::string
& gtest_msg
, const Message
& user_msg
);
8029 #if GTEST_HAS_EXCEPTIONS
8031 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \
8032 /* an exported class was derived from a class that was not exported */)
8034 // This exception is thrown by (and only by) a failed Google Test
8035 // assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
8036 // are enabled). We derive it from std::runtime_error, which is for
8037 // errors presumably detectable only at run time. Since
8038 // std::runtime_error inherits from std::exception, many testing
8039 // frameworks know how to extract and print the message inside it.
8040 class GTEST_API_ GoogleTestFailureException
: public ::std::runtime_error
{
8042 explicit GoogleTestFailureException(const TestPartResult
& failure
);
8045 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4275
8047 #endif // GTEST_HAS_EXCEPTIONS
8049 namespace edit_distance
{
8050 // Returns the optimal edits to go from 'left' to 'right'.
8051 // All edits cost the same, with replace having lower priority than
8053 // Simple implementation of the Wagner-Fischer algorithm.
8054 // See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm
8055 enum EditType
{ kMatch
, kAdd
, kRemove
, kReplace
};
8056 GTEST_API_
std::vector
<EditType
> CalculateOptimalEdits(
8057 const std::vector
<size_t>& left
, const std::vector
<size_t>& right
);
8059 // Same as above, but the input is represented as strings.
8060 GTEST_API_
std::vector
<EditType
> CalculateOptimalEdits(
8061 const std::vector
<std::string
>& left
,
8062 const std::vector
<std::string
>& right
);
8064 // Create a diff of the input strings in Unified diff format.
8065 GTEST_API_
std::string
CreateUnifiedDiff(const std::vector
<std::string
>& left
,
8066 const std::vector
<std::string
>& right
,
8067 size_t context
= 2);
8069 } // namespace edit_distance
8071 // Calculate the diff between 'left' and 'right' and return it in unified diff
8073 // If not null, stores in 'total_line_count' the total number of lines found
8075 GTEST_API_
std::string
DiffStrings(const std::string
& left
,
8076 const std::string
& right
,
8077 size_t* total_line_count
);
8079 // Constructs and returns the message for an equality assertion
8080 // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
8082 // The first four parameters are the expressions used in the assertion
8083 // and their values, as strings. For example, for ASSERT_EQ(foo, bar)
8084 // where foo is 5 and bar is 6, we have:
8086 // expected_expression: "foo"
8087 // actual_expression: "bar"
8088 // expected_value: "5"
8089 // actual_value: "6"
8091 // The ignoring_case parameter is true iff the assertion is a
8092 // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
8093 // be inserted into the message.
8094 GTEST_API_ AssertionResult
EqFailure(const char* expected_expression
,
8095 const char* actual_expression
,
8096 const std::string
& expected_value
,
8097 const std::string
& actual_value
,
8098 bool ignoring_case
);
8100 // Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
8101 GTEST_API_
std::string
GetBoolAssertionFailureMessage(
8102 const AssertionResult
& assertion_result
,
8103 const char* expression_text
,
8104 const char* actual_predicate_value
,
8105 const char* expected_predicate_value
);
8107 // This template class represents an IEEE floating-point number
8108 // (either single-precision or double-precision, depending on the
8109 // template parameters).
8111 // The purpose of this class is to do more sophisticated number
8112 // comparison. (Due to round-off error, etc, it's very unlikely that
8113 // two floating-points will be equal exactly. Hence a naive
8114 // comparison by the == operation often doesn't work.)
8116 // Format of IEEE floating-point:
8118 // The most-significant bit being the leftmost, an IEEE
8119 // floating-point looks like
8121 // sign_bit exponent_bits fraction_bits
8123 // Here, sign_bit is a single bit that designates the sign of the
8126 // For float, there are 8 exponent bits and 23 fraction bits.
8128 // For double, there are 11 exponent bits and 52 fraction bits.
8130 // More details can be found at
8131 // http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
8133 // Template parameter:
8135 // RawType: the raw floating-point type (either float or double)
8136 template <typename RawType
>
8137 class FloatingPoint
{
8139 // Defines the unsigned integer type that has the same size as the
8140 // floating point number.
8141 typedef typename TypeWithSize
<sizeof(RawType
)>::UInt Bits
;
8145 // # of bits in a number.
8146 static const size_t kBitCount
= 8*sizeof(RawType
);
8148 // # of fraction bits in a number.
8149 static const size_t kFractionBitCount
=
8150 std::numeric_limits
<RawType
>::digits
- 1;
8152 // # of exponent bits in a number.
8153 static const size_t kExponentBitCount
= kBitCount
- 1 - kFractionBitCount
;
8155 // The mask for the sign bit.
8156 static const Bits kSignBitMask
= static_cast<Bits
>(1) << (kBitCount
- 1);
8158 // The mask for the fraction bits.
8159 static const Bits kFractionBitMask
=
8160 ~static_cast<Bits
>(0) >> (kExponentBitCount
+ 1);
8162 // The mask for the exponent bits.
8163 static const Bits kExponentBitMask
= ~(kSignBitMask
| kFractionBitMask
);
8165 // How many ULP's (Units in the Last Place) we want to tolerate when
8166 // comparing two numbers. The larger the value, the more error we
8167 // allow. A 0 value means that two numbers must be exactly the same
8168 // to be considered equal.
8170 // The maximum error of a single floating-point operation is 0.5
8171 // units in the last place. On Intel CPU's, all floating-point
8172 // calculations are done with 80-bit precision, while double has 64
8173 // bits. Therefore, 4 should be enough for ordinary use.
8175 // See the following article for more details on ULP:
8176 // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
8177 static const size_t kMaxUlps
= 4;
8179 // Constructs a FloatingPoint from a raw floating-point number.
8181 // On an Intel CPU, passing a non-normalized NAN (Not a Number)
8182 // around may change its bits, although the new value is guaranteed
8183 // to be also a NAN. Therefore, don't expect this constructor to
8184 // preserve the bits in x when x is a NAN.
8185 explicit FloatingPoint(const RawType
& x
) { u_
.value_
= x
; }
8189 // Reinterprets a bit pattern as a floating-point number.
8191 // This function is needed to test the AlmostEquals() method.
8192 static RawType
ReinterpretBits(const Bits bits
) {
8193 FloatingPoint
fp(0);
8195 return fp
.u_
.value_
;
8198 // Returns the floating-point number that represent positive infinity.
8199 static RawType
Infinity() {
8200 return ReinterpretBits(kExponentBitMask
);
8203 // Returns the maximum representable finite floating-point number.
8204 static RawType
Max();
8206 // Non-static methods
8208 // Returns the bits that represents this number.
8209 const Bits
&bits() const { return u_
.bits_
; }
8211 // Returns the exponent bits of this number.
8212 Bits
exponent_bits() const { return kExponentBitMask
& u_
.bits_
; }
8214 // Returns the fraction bits of this number.
8215 Bits
fraction_bits() const { return kFractionBitMask
& u_
.bits_
; }
8217 // Returns the sign bit of this number.
8218 Bits
sign_bit() const { return kSignBitMask
& u_
.bits_
; }
8220 // Returns true iff this is NAN (not a number).
8221 bool is_nan() const {
8222 // It's a NAN if the exponent bits are all ones and the fraction
8223 // bits are not entirely zeros.
8224 return (exponent_bits() == kExponentBitMask
) && (fraction_bits() != 0);
8227 // Returns true iff this number is at most kMaxUlps ULP's away from
8228 // rhs. In particular, this function:
8230 // - returns false if either number is (or both are) NAN.
8231 // - treats really large numbers as almost equal to infinity.
8232 // - thinks +0.0 and -0.0 are 0 DLP's apart.
8233 bool AlmostEquals(const FloatingPoint
& rhs
) const {
8234 // The IEEE standard says that any comparison operation involving
8235 // a NAN must return false.
8236 if (is_nan() || rhs
.is_nan()) return false;
8238 return DistanceBetweenSignAndMagnitudeNumbers(u_
.bits_
, rhs
.u_
.bits_
)
8243 // The data type used to store the actual floating-point number.
8244 union FloatingPointUnion
{
8245 RawType value_
; // The raw floating-point number.
8246 Bits bits_
; // The bits that represent the number.
8249 // Converts an integer from the sign-and-magnitude representation to
8250 // the biased representation. More precisely, let N be 2 to the
8251 // power of (kBitCount - 1), an integer x is represented by the
8252 // unsigned number x + N.
8256 // -N + 1 (the most negative number representable using
8257 // sign-and-magnitude) is represented by 1;
8258 // 0 is represented by N; and
8259 // N - 1 (the biggest number representable using
8260 // sign-and-magnitude) is represented by 2N - 1.
8262 // Read http://en.wikipedia.org/wiki/Signed_number_representations
8263 // for more details on signed number representations.
8264 static Bits
SignAndMagnitudeToBiased(const Bits
&sam
) {
8265 if (kSignBitMask
& sam
) {
8266 // sam represents a negative number.
8269 // sam represents a positive number.
8270 return kSignBitMask
| sam
;
8274 // Given two numbers in the sign-and-magnitude representation,
8275 // returns the distance between them as an unsigned number.
8276 static Bits
DistanceBetweenSignAndMagnitudeNumbers(const Bits
&sam1
,
8278 const Bits biased1
= SignAndMagnitudeToBiased(sam1
);
8279 const Bits biased2
= SignAndMagnitudeToBiased(sam2
);
8280 return (biased1
>= biased2
) ? (biased1
- biased2
) : (biased2
- biased1
);
8283 FloatingPointUnion u_
;
8286 // We cannot use std::numeric_limits<T>::max() as it clashes with the max()
8287 // macro defined by <windows.h>.
8289 inline float FloatingPoint
<float>::Max() { return FLT_MAX
; }
8291 inline double FloatingPoint
<double>::Max() { return DBL_MAX
; }
8293 // Typedefs the instances of the FloatingPoint template class that we
8295 typedef FloatingPoint
<float> Float
;
8296 typedef FloatingPoint
<double> Double
;
8298 // In order to catch the mistake of putting tests that use different
8299 // test fixture classes in the same test case, we need to assign
8300 // unique IDs to fixture classes and compare them. The TypeId type is
8301 // used to hold such IDs. The user should treat TypeId as an opaque
8302 // type: the only operation allowed on TypeId values is to compare
8303 // them for equality using the == operator.
8304 typedef const void* TypeId
;
8306 template <typename T
>
8307 class TypeIdHelper
{
8309 // dummy_ must not have a const type. Otherwise an overly eager
8310 // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
8311 // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
8315 template <typename T
>
8316 bool TypeIdHelper
<T
>::dummy_
= false;
8318 // GetTypeId<T>() returns the ID of type T. Different values will be
8319 // returned for different types. Calling the function twice with the
8320 // same type argument is guaranteed to return the same ID.
8321 template <typename T
>
8322 TypeId
GetTypeId() {
8323 // The compiler is required to allocate a different
8324 // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
8325 // the template. Therefore, the address of dummy_ is guaranteed to
8327 return &(TypeIdHelper
<T
>::dummy_
);
8330 // Returns the type ID of ::testing::Test. Always call this instead
8331 // of GetTypeId< ::testing::Test>() to get the type ID of
8332 // ::testing::Test, as the latter may give the wrong result due to a
8333 // suspected linker bug when compiling Google Test as a Mac OS X
8335 GTEST_API_ TypeId
GetTestTypeId();
8337 // Defines the abstract factory interface that creates instances
8338 // of a Test object.
8339 class TestFactoryBase
{
8341 virtual ~TestFactoryBase() {}
8343 // Creates a test instance to run. The instance is both created and destroyed
8344 // within TestInfoImpl::Run()
8345 virtual Test
* CreateTest() = 0;
8348 TestFactoryBase() {}
8351 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase
);
8354 // This class provides implementation of TeastFactoryBase interface.
8355 // It is used in TEST and TEST_F macros.
8356 template <class TestClass
>
8357 class TestFactoryImpl
: public TestFactoryBase
{
8359 virtual Test
* CreateTest() { return new TestClass
; }
8362 #if GTEST_OS_WINDOWS
8364 // Predicate-formatters for implementing the HRESULT checking macros
8365 // {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
8366 // We pass a long instead of HRESULT to avoid causing an
8367 // include dependency for the HRESULT type.
8368 GTEST_API_ AssertionResult
IsHRESULTSuccess(const char* expr
,
8370 GTEST_API_ AssertionResult
IsHRESULTFailure(const char* expr
,
8373 #endif // GTEST_OS_WINDOWS
8375 // Types of SetUpTestCase() and TearDownTestCase() functions.
8376 typedef void (*SetUpTestCaseFunc
)();
8377 typedef void (*TearDownTestCaseFunc
)();
8379 struct CodeLocation
{
8380 CodeLocation(const std::string
& a_file
, int a_line
)
8381 : file(a_file
), line(a_line
) {}
8387 // Creates a new TestInfo object and registers it with Google Test;
8388 // returns the created object.
8392 // test_case_name: name of the test case
8393 // name: name of the test
8394 // type_param the name of the test's type parameter, or NULL if
8395 // this is not a typed or a type-parameterized test.
8396 // value_param text representation of the test's value parameter,
8397 // or NULL if this is not a type-parameterized test.
8398 // code_location: code location where the test is defined
8399 // fixture_class_id: ID of the test fixture class
8400 // set_up_tc: pointer to the function that sets up the test case
8401 // tear_down_tc: pointer to the function that tears down the test case
8402 // factory: pointer to the factory that creates a test object.
8403 // The newly created TestInfo instance will assume
8404 // ownership of the factory object.
8405 GTEST_API_ TestInfo
* MakeAndRegisterTestInfo(
8406 const char* test_case_name
,
8408 const char* type_param
,
8409 const char* value_param
,
8410 CodeLocation code_location
,
8411 TypeId fixture_class_id
,
8412 SetUpTestCaseFunc set_up_tc
,
8413 TearDownTestCaseFunc tear_down_tc
,
8414 TestFactoryBase
* factory
);
8416 // If *pstr starts with the given prefix, modifies *pstr to be right
8417 // past the prefix and returns true; otherwise leaves *pstr unchanged
8418 // and returns false. None of pstr, *pstr, and prefix can be NULL.
8419 GTEST_API_
bool SkipPrefix(const char* prefix
, const char** pstr
);
8421 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
8423 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
8424 /* class A needs to have dll-interface to be used by clients of class B */)
8426 // State of the definition of a type-parameterized test case.
8427 class GTEST_API_ TypedTestCasePState
{
8429 TypedTestCasePState() : registered_(false) {}
8431 // Adds the given test name to defined_test_names_ and return true
8432 // if the test case hasn't been registered; otherwise aborts the
8434 bool AddTestName(const char* file
, int line
, const char* case_name
,
8435 const char* test_name
) {
8437 fprintf(stderr
, "%s Test %s must be defined before "
8438 "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
8439 FormatFileLocation(file
, line
).c_str(), test_name
, case_name
);
8443 registered_tests_
.insert(
8444 ::std::make_pair(test_name
, CodeLocation(file
, line
)));
8448 bool TestExists(const std::string
& test_name
) const {
8449 return registered_tests_
.count(test_name
) > 0;
8452 const CodeLocation
& GetCodeLocation(const std::string
& test_name
) const {
8453 RegisteredTestsMap::const_iterator it
= registered_tests_
.find(test_name
);
8454 GTEST_CHECK_(it
!= registered_tests_
.end());
8458 // Verifies that registered_tests match the test names in
8459 // defined_test_names_; returns registered_tests if successful, or
8460 // aborts the program otherwise.
8461 const char* VerifyRegisteredTestNames(
8462 const char* file
, int line
, const char* registered_tests
);
8465 typedef ::std::map
<std::string
, CodeLocation
> RegisteredTestsMap
;
8468 RegisteredTestsMap registered_tests_
;
8471 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
8473 // Skips to the first non-space char after the first comma in 'str';
8474 // returns NULL if no comma is found in 'str'.
8475 inline const char* SkipComma(const char* str
) {
8476 const char* comma
= strchr(str
, ',');
8477 if (comma
== NULL
) {
8480 while (IsSpace(*(++comma
))) {}
8484 // Returns the prefix of 'str' before the first comma in it; returns
8485 // the entire string if it contains no comma.
8486 inline std::string
GetPrefixUntilComma(const char* str
) {
8487 const char* comma
= strchr(str
, ',');
8488 return comma
== NULL
? str
: std::string(str
, comma
);
8491 // Splits a given string on a given delimiter, populating a given
8492 // vector with the fields.
8493 void SplitString(const ::std::string
& str
, char delimiter
,
8494 ::std::vector
< ::std::string
>* dest
);
8496 // The default argument to the template below for the case when the user does
8497 // not provide a name generator.
8498 struct DefaultNameGenerator
{
8499 template <typename T
>
8500 static std::string
GetName(int i
) {
8501 return StreamableToString(i
);
8505 template <typename Provided
= DefaultNameGenerator
>
8506 struct NameGeneratorSelector
{
8507 typedef Provided type
;
8510 template <typename NameGenerator
>
8511 void GenerateNamesRecursively(Types0
, std::vector
<std::string
>*, int) {}
8513 template <typename NameGenerator
, typename Types
>
8514 void GenerateNamesRecursively(Types
, std::vector
<std::string
>* result
, int i
) {
8515 result
->push_back(NameGenerator::template GetName
<typename
Types::Head
>(i
));
8516 GenerateNamesRecursively
<NameGenerator
>(typename
Types::Tail(), result
,
8520 template <typename NameGenerator
, typename Types
>
8521 std::vector
<std::string
> GenerateNames() {
8522 std::vector
<std::string
> result
;
8523 GenerateNamesRecursively
<NameGenerator
>(Types(), &result
, 0);
8527 // TypeParameterizedTest<Fixture, TestSel, Types>::Register()
8528 // registers a list of type-parameterized tests with Google Test. The
8529 // return value is insignificant - we just need to return something
8530 // such that we can call this function in a namespace scope.
8532 // Implementation note: The GTEST_TEMPLATE_ macro declares a template
8533 // template parameter. It's defined in gtest-type-util.h.
8534 template <GTEST_TEMPLATE_ Fixture
, class TestSel
, typename Types
>
8535 class TypeParameterizedTest
{
8537 // 'index' is the index of the test in the type list 'Types'
8538 // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
8539 // Types). Valid values for 'index' are [0, N - 1] where N is the
8541 static bool Register(const char* prefix
, const CodeLocation
& code_location
,
8542 const char* case_name
, const char* test_names
, int index
,
8543 const std::vector
<std::string
>& type_names
=
8544 GenerateNames
<DefaultNameGenerator
, Types
>()) {
8545 typedef typename
Types::Head Type
;
8546 typedef Fixture
<Type
> FixtureClass
;
8547 typedef typename
GTEST_BIND_(TestSel
, Type
) TestClass
;
8549 // First, registers the first type-parameterized test in the type
8551 MakeAndRegisterTestInfo(
8552 (std::string(prefix
) + (prefix
[0] == '\0' ? "" : "/") + case_name
+
8553 "/" + type_names
[index
])
8555 StripTrailingSpaces(GetPrefixUntilComma(test_names
)).c_str(),
8556 GetTypeName
<Type
>().c_str(),
8557 NULL
, // No value parameter.
8558 code_location
, GetTypeId
<FixtureClass
>(), TestClass::SetUpTestCase
,
8559 TestClass::TearDownTestCase
, new TestFactoryImpl
<TestClass
>);
8561 // Next, recurses (at compile time) with the tail of the type list.
8562 return TypeParameterizedTest
<Fixture
, TestSel
,
8563 typename
Types::Tail
>::Register(prefix
,
8572 // The base case for the compile time recursion.
8573 template <GTEST_TEMPLATE_ Fixture
, class TestSel
>
8574 class TypeParameterizedTest
<Fixture
, TestSel
, Types0
> {
8576 static bool Register(const char* /*prefix*/, const CodeLocation
&,
8577 const char* /*case_name*/, const char* /*test_names*/,
8579 const std::vector
<std::string
>& =
8580 std::vector
<std::string
>() /*type_names*/) {
8585 // TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
8586 // registers *all combinations* of 'Tests' and 'Types' with Google
8587 // Test. The return value is insignificant - we just need to return
8588 // something such that we can call this function in a namespace scope.
8589 template <GTEST_TEMPLATE_ Fixture
, typename Tests
, typename Types
>
8590 class TypeParameterizedTestCase
{
8592 static bool Register(const char* prefix
, CodeLocation code_location
,
8593 const TypedTestCasePState
* state
, const char* case_name
,
8594 const char* test_names
,
8595 const std::vector
<std::string
>& type_names
=
8596 GenerateNames
<DefaultNameGenerator
, Types
>()) {
8597 std::string test_name
= StripTrailingSpaces(
8598 GetPrefixUntilComma(test_names
));
8599 if (!state
->TestExists(test_name
)) {
8600 fprintf(stderr
, "Failed to get code location for test %s.%s at %s.",
8601 case_name
, test_name
.c_str(),
8602 FormatFileLocation(code_location
.file
.c_str(),
8603 code_location
.line
).c_str());
8607 const CodeLocation
& test_location
= state
->GetCodeLocation(test_name
);
8609 typedef typename
Tests::Head Head
;
8611 // First, register the first test in 'Test' for each type in 'Types'.
8612 TypeParameterizedTest
<Fixture
, Head
, Types
>::Register(
8613 prefix
, test_location
, case_name
, test_names
, 0, type_names
);
8615 // Next, recurses (at compile time) with the tail of the test list.
8616 return TypeParameterizedTestCase
<Fixture
, typename
Tests::Tail
,
8617 Types
>::Register(prefix
, code_location
,
8619 SkipComma(test_names
),
8624 // The base case for the compile time recursion.
8625 template <GTEST_TEMPLATE_ Fixture
, typename Types
>
8626 class TypeParameterizedTestCase
<Fixture
, Templates0
, Types
> {
8628 static bool Register(const char* /*prefix*/, const CodeLocation
&,
8629 const TypedTestCasePState
* /*state*/,
8630 const char* /*case_name*/, const char* /*test_names*/,
8631 const std::vector
<std::string
>& =
8632 std::vector
<std::string
>() /*type_names*/) {
8637 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
8639 // Returns the current OS stack trace as an std::string.
8641 // The maximum number of stack frames to be included is specified by
8642 // the gtest_stack_trace_depth flag. The skip_count parameter
8643 // specifies the number of top frames to be skipped, which doesn't
8644 // count against the number of frames to be included.
8646 // For example, if Foo() calls Bar(), which in turn calls
8647 // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
8648 // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
8649 GTEST_API_
std::string
GetCurrentOsStackTraceExceptTop(
8650 UnitTest
* unit_test
, int skip_count
);
8652 // Helpers for suppressing warnings on unreachable code or constant
8655 // Always returns true.
8656 GTEST_API_
bool AlwaysTrue();
8658 // Always returns false.
8659 inline bool AlwaysFalse() { return !AlwaysTrue(); }
8661 // Helper for suppressing false warning from Clang on a const char*
8662 // variable declared in a conditional expression always being NULL in
8664 struct GTEST_API_ ConstCharPtr
{
8665 ConstCharPtr(const char* str
) : value(str
) {}
8666 operator bool() const { return true; }
8670 // A simple Linear Congruential Generator for generating random
8671 // numbers with a uniform distribution. Unlike rand() and srand(), it
8672 // doesn't use global state (and therefore can't interfere with user
8673 // code). Unlike rand_r(), it's portable. An LCG isn't very random,
8674 // but it's good enough for our purposes.
8675 class GTEST_API_ Random
{
8677 static const UInt32 kMaxRange
= 1u << 31;
8679 explicit Random(UInt32 seed
) : state_(seed
) {}
8681 void Reseed(UInt32 seed
) { state_
= seed
; }
8683 // Generates a random number from [0, range). Crashes if 'range' is
8684 // 0 or greater than kMaxRange.
8685 UInt32
Generate(UInt32 range
);
8689 GTEST_DISALLOW_COPY_AND_ASSIGN_(Random
);
8692 // Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
8693 // compiler error iff T1 and T2 are different types.
8694 template <typename T1
, typename T2
>
8695 struct CompileAssertTypesEqual
;
8697 template <typename T
>
8698 struct CompileAssertTypesEqual
<T
, T
> {
8701 // Removes the reference from a type if it is a reference type,
8702 // otherwise leaves it unchanged. This is the same as
8703 // tr1::remove_reference, which is not widely available yet.
8704 template <typename T
>
8705 struct RemoveReference
{ typedef T type
; }; // NOLINT
8706 template <typename T
>
8707 struct RemoveReference
<T
&> { typedef T type
; }; // NOLINT
8709 // A handy wrapper around RemoveReference that works when the argument
8710 // T depends on template parameters.
8711 #define GTEST_REMOVE_REFERENCE_(T) \
8712 typename ::testing::internal::RemoveReference<T>::type
8714 // Removes const from a type if it is a const type, otherwise leaves
8715 // it unchanged. This is the same as tr1::remove_const, which is not
8716 // widely available yet.
8717 template <typename T
>
8718 struct RemoveConst
{ typedef T type
; }; // NOLINT
8719 template <typename T
>
8720 struct RemoveConst
<const T
> { typedef T type
; }; // NOLINT
8722 // MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
8723 // definition to fail to remove the const in 'const int[3]' and 'const
8724 // char[3][4]'. The following specialization works around the bug.
8725 template <typename T
, size_t N
>
8726 struct RemoveConst
<const T
[N
]> {
8727 typedef typename RemoveConst
<T
>::type type
[N
];
8730 #if defined(_MSC_VER) && _MSC_VER < 1400
8731 // This is the only specialization that allows VC++ 7.1 to remove const in
8732 // 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC
8733 // and thus needs to be conditionally compiled.
8734 template <typename T
, size_t N
>
8735 struct RemoveConst
<T
[N
]> {
8736 typedef typename RemoveConst
<T
>::type type
[N
];
8740 // A handy wrapper around RemoveConst that works when the argument
8741 // T depends on template parameters.
8742 #define GTEST_REMOVE_CONST_(T) \
8743 typename ::testing::internal::RemoveConst<T>::type
8745 // Turns const U&, U&, const U, and U all into U.
8746 #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
8747 GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
8749 // ImplicitlyConvertible<From, To>::value is a compile-time bool
8750 // constant that's true iff type From can be implicitly converted to
8752 template <typename From
, typename To
>
8753 class ImplicitlyConvertible
{
8755 // We need the following helper functions only for their types.
8756 // They have no implementations.
8758 // MakeFrom() is an expression whose type is From. We cannot simply
8759 // use From(), as the type From may not have a public default
8761 static typename AddReference
<From
>::type
MakeFrom();
8763 // These two functions are overloaded. Given an expression
8764 // Helper(x), the compiler will pick the first version if x can be
8765 // implicitly converted to type To; otherwise it will pick the
8768 // The first version returns a value of size 1, and the second
8769 // version returns a value of size 2. Therefore, by checking the
8770 // size of Helper(x), which can be done at compile time, we can tell
8771 // which version of Helper() is used, and hence whether x can be
8772 // implicitly converted to type To.
8773 static char Helper(To
);
8774 static char (&Helper(...))[2]; // NOLINT
8776 // We have to put the 'public' section after the 'private' section,
8777 // or MSVC refuses to compile the code.
8779 #if defined(__BORLANDC__)
8780 // C++Builder cannot use member overload resolution during template
8781 // instantiation. The simplest workaround is to use its C++0x type traits
8782 // functions (C++Builder 2009 and above only).
8783 static const bool value
= __is_convertible(From
, To
);
8785 // MSVC warns about implicitly converting from double to int for
8786 // possible loss of data, so we need to temporarily disable the
8788 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244)
8789 static const bool value
=
8790 sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
8791 GTEST_DISABLE_MSC_WARNINGS_POP_()
8792 #endif // __BORLANDC__
8794 template <typename From
, typename To
>
8795 const bool ImplicitlyConvertible
<From
, To
>::value
;
8797 // IsAProtocolMessage<T>::value is a compile-time bool constant that's
8798 // true iff T is type ProtocolMessage, proto2::Message, or a subclass
8800 template <typename T
>
8801 struct IsAProtocolMessage
8802 : public bool_constant
<
8803 ImplicitlyConvertible
<const T
*, const ::ProtocolMessage
*>::value
||
8804 ImplicitlyConvertible
<const T
*, const ::proto2::Message
*>::value
> {
8807 // When the compiler sees expression IsContainerTest<C>(0), if C is an
8808 // STL-style container class, the first overload of IsContainerTest
8809 // will be viable (since both C::iterator* and C::const_iterator* are
8810 // valid types and NULL can be implicitly converted to them). It will
8811 // be picked over the second overload as 'int' is a perfect match for
8812 // the type of argument 0. If C::iterator or C::const_iterator is not
8813 // a valid type, the first overload is not viable, and the second
8814 // overload will be picked. Therefore, we can determine whether C is
8815 // a container class by checking the type of IsContainerTest<C>(0).
8816 // The value of the expression is insignificant.
8818 // In C++11 mode we check the existence of a const_iterator and that an
8819 // iterator is properly implemented for the container.
8821 // For pre-C++11 that we look for both C::iterator and C::const_iterator.
8822 // The reason is that C++ injects the name of a class as a member of the
8823 // class itself (e.g. you can refer to class iterator as either
8824 // 'iterator' or 'iterator::iterator'). If we look for C::iterator
8825 // only, for example, we would mistakenly think that a class named
8826 // iterator is an STL container.
8828 // Also note that the simpler approach of overloading
8829 // IsContainerTest(typename C::const_iterator*) and
8830 // IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
8831 typedef int IsContainer
;
8832 #if GTEST_LANG_CXX11
8834 class Iterator
= decltype(::std::declval
<const C
&>().begin()),
8835 class = decltype(::std::declval
<const C
&>().end()),
8836 class = decltype(++::std::declval
<Iterator
&>()),
8837 class = decltype(*::std::declval
<Iterator
>()),
8838 class = typename
C::const_iterator
>
8839 IsContainer
IsContainerTest(int /* dummy */) {
8844 IsContainer
IsContainerTest(int /* dummy */,
8845 typename
C::iterator
* /* it */ = NULL
,
8846 typename
C::const_iterator
* /* const_it */ = NULL
) {
8849 #endif // GTEST_LANG_CXX11
8851 typedef char IsNotContainer
;
8853 IsNotContainer
IsContainerTest(long /* dummy */) { return '\0'; }
8855 // Trait to detect whether a type T is a hash table.
8856 // The heuristic used is that the type contains an inner type `hasher` and does
8857 // not contain an inner type `reverse_iterator`.
8858 // If the container is iterable in reverse, then order might actually matter.
8859 template <typename T
>
8860 struct IsHashTable
{
8862 template <typename U
>
8863 static char test(typename
U::hasher
*, typename
U::reverse_iterator
*);
8864 template <typename U
>
8865 static int test(typename
U::hasher
*, ...);
8866 template <typename U
>
8867 static char test(...);
8870 static const bool value
= sizeof(test
<T
>(0, 0)) == sizeof(int);
8873 template <typename T
>
8874 const bool IsHashTable
<T
>::value
;
8876 template<typename T
>
8878 typedef void value_type
;
8881 template <typename T
, typename
= void>
8882 struct HasValueType
: false_type
{};
8883 template <typename T
>
8884 struct HasValueType
<T
, VoidT
<typename
T::value_type
> > : true_type
{
8887 template <typename C
,
8888 bool = sizeof(IsContainerTest
<C
>(0)) == sizeof(IsContainer
),
8889 bool = HasValueType
<C
>::value
>
8890 struct IsRecursiveContainerImpl
;
8892 template <typename C
, bool HV
>
8893 struct IsRecursiveContainerImpl
<C
, false, HV
> : public false_type
{};
8895 // Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to
8896 // obey the same inconsistencies as the IsContainerTest, namely check if
8897 // something is a container is relying on only const_iterator in C++11 and
8898 // is relying on both const_iterator and iterator otherwise
8899 template <typename C
>
8900 struct IsRecursiveContainerImpl
<C
, true, false> : public false_type
{};
8902 template <typename C
>
8903 struct IsRecursiveContainerImpl
<C
, true, true> {
8904 #if GTEST_LANG_CXX11
8905 typedef typename IteratorTraits
<typename
C::const_iterator
>::value_type
8908 typedef typename IteratorTraits
<typename
C::iterator
>::value_type value_type
;
8910 typedef is_same
<value_type
, C
> type
;
8913 // IsRecursiveContainer<Type> is a unary compile-time predicate that
8914 // evaluates whether C is a recursive container type. A recursive container
8915 // type is a container type whose value_type is equal to the container type
8916 // itself. An example for a recursive container type is
8917 // boost::filesystem::path, whose iterator has a value_type that is equal to
8918 // boost::filesystem::path.
8919 template <typename C
>
8920 struct IsRecursiveContainer
: public IsRecursiveContainerImpl
<C
>::type
{};
8922 // EnableIf<condition>::type is void when 'Cond' is true, and
8923 // undefined when 'Cond' is false. To use SFINAE to make a function
8924 // overload only apply when a particular expression is true, add
8925 // "typename EnableIf<expression>::type* = 0" as the last parameter.
8926 template<bool> struct EnableIf
;
8927 template<> struct EnableIf
<true> { typedef void type
; }; // NOLINT
8929 // Utilities for native arrays.
8931 // ArrayEq() compares two k-dimensional native arrays using the
8932 // elements' operator==, where k can be any integer >= 0. When k is
8933 // 0, ArrayEq() degenerates into comparing a single pair of values.
8935 template <typename T
, typename U
>
8936 bool ArrayEq(const T
* lhs
, size_t size
, const U
* rhs
);
8938 // This generic version is used when k is 0.
8939 template <typename T
, typename U
>
8940 inline bool ArrayEq(const T
& lhs
, const U
& rhs
) { return lhs
== rhs
; }
8942 // This overload is used when k >= 1.
8943 template <typename T
, typename U
, size_t N
>
8944 inline bool ArrayEq(const T(&lhs
)[N
], const U(&rhs
)[N
]) {
8945 return internal::ArrayEq(lhs
, N
, rhs
);
8948 // This helper reduces code bloat. If we instead put its logic inside
8949 // the previous ArrayEq() function, arrays with different sizes would
8950 // lead to different copies of the template code.
8951 template <typename T
, typename U
>
8952 bool ArrayEq(const T
* lhs
, size_t size
, const U
* rhs
) {
8953 for (size_t i
= 0; i
!= size
; i
++) {
8954 if (!internal::ArrayEq(lhs
[i
], rhs
[i
]))
8960 // Finds the first element in the iterator range [begin, end) that
8961 // equals elem. Element may be a native array type itself.
8962 template <typename Iter
, typename Element
>
8963 Iter
ArrayAwareFind(Iter begin
, Iter end
, const Element
& elem
) {
8964 for (Iter it
= begin
; it
!= end
; ++it
) {
8965 if (internal::ArrayEq(*it
, elem
))
8971 // CopyArray() copies a k-dimensional native array using the elements'
8972 // operator=, where k can be any integer >= 0. When k is 0,
8973 // CopyArray() degenerates into copying a single value.
8975 template <typename T
, typename U
>
8976 void CopyArray(const T
* from
, size_t size
, U
* to
);
8978 // This generic version is used when k is 0.
8979 template <typename T
, typename U
>
8980 inline void CopyArray(const T
& from
, U
* to
) { *to
= from
; }
8982 // This overload is used when k >= 1.
8983 template <typename T
, typename U
, size_t N
>
8984 inline void CopyArray(const T(&from
)[N
], U(*to
)[N
]) {
8985 internal::CopyArray(from
, N
, *to
);
8988 // This helper reduces code bloat. If we instead put its logic inside
8989 // the previous CopyArray() function, arrays with different sizes
8990 // would lead to different copies of the template code.
8991 template <typename T
, typename U
>
8992 void CopyArray(const T
* from
, size_t size
, U
* to
) {
8993 for (size_t i
= 0; i
!= size
; i
++) {
8994 internal::CopyArray(from
[i
], to
+ i
);
8998 // The relation between an NativeArray object (see below) and the
8999 // native array it represents.
9000 // We use 2 different structs to allow non-copyable types to be used, as long
9001 // as RelationToSourceReference() is passed.
9002 struct RelationToSourceReference
{};
9003 struct RelationToSourceCopy
{};
9005 // Adapts a native array to a read-only STL-style container. Instead
9006 // of the complete STL container concept, this adaptor only implements
9007 // members useful for Google Mock's container matchers. New members
9008 // should be added as needed. To simplify the implementation, we only
9009 // support Element being a raw type (i.e. having no top-level const or
9010 // reference modifier). It's the client's responsibility to satisfy
9011 // this requirement. Element can be an array type itself (hence
9012 // multi-dimensional arrays are supported).
9013 template <typename Element
>
9016 // STL-style container typedefs.
9017 typedef Element value_type
;
9018 typedef Element
* iterator
;
9019 typedef const Element
* const_iterator
;
9021 // Constructs from a native array. References the source.
9022 NativeArray(const Element
* array
, size_t count
, RelationToSourceReference
) {
9023 InitRef(array
, count
);
9026 // Constructs from a native array. Copies the source.
9027 NativeArray(const Element
* array
, size_t count
, RelationToSourceCopy
) {
9028 InitCopy(array
, count
);
9031 // Copy constructor.
9032 NativeArray(const NativeArray
& rhs
) {
9033 (this->*rhs
.clone_
)(rhs
.array_
, rhs
.size_
);
9037 if (clone_
!= &NativeArray::InitRef
)
9041 // STL-style container methods.
9042 size_t size() const { return size_
; }
9043 const_iterator
begin() const { return array_
; }
9044 const_iterator
end() const { return array_
+ size_
; }
9045 bool operator==(const NativeArray
& rhs
) const {
9046 return size() == rhs
.size() &&
9047 ArrayEq(begin(), size(), rhs
.begin());
9052 kCheckTypeIsNotConstOrAReference
= StaticAssertTypeEqHelper
<
9053 Element
, GTEST_REMOVE_REFERENCE_AND_CONST_(Element
)>::value
9056 // Initializes this object with a copy of the input.
9057 void InitCopy(const Element
* array
, size_t a_size
) {
9058 Element
* const copy
= new Element
[a_size
];
9059 CopyArray(array
, a_size
, copy
);
9062 clone_
= &NativeArray::InitCopy
;
9065 // Initializes this object with a reference of the input.
9066 void InitRef(const Element
* array
, size_t a_size
) {
9069 clone_
= &NativeArray::InitRef
;
9072 const Element
* array_
;
9074 void (NativeArray::*clone_
)(const Element
*, size_t);
9076 GTEST_DISALLOW_ASSIGN_(NativeArray
);
9079 } // namespace internal
9080 } // namespace testing
9082 #define GTEST_MESSAGE_AT_(file, line, message, result_type) \
9083 ::testing::internal::AssertHelper(result_type, file, line, message) \
9084 = ::testing::Message()
9086 #define GTEST_MESSAGE_(message, result_type) \
9087 GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
9089 #define GTEST_FATAL_FAILURE_(message) \
9090 return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
9092 #define GTEST_NONFATAL_FAILURE_(message) \
9093 GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
9095 #define GTEST_SUCCESS_(message) \
9096 GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
9098 // Suppress MSVC warning 4702 (unreachable code) for the code following
9099 // statement if it returns or throws (or doesn't return or throw in some
9101 #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
9102 if (::testing::internal::AlwaysTrue()) { statement; }
9104 #define GTEST_TEST_THROW_(statement, expected_exception, fail) \
9105 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9106 if (::testing::internal::ConstCharPtr gtest_msg = "") { \
9107 bool gtest_caught_expected = false; \
9109 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9111 catch (expected_exception const&) { \
9112 gtest_caught_expected = true; \
9116 "Expected: " #statement " throws an exception of type " \
9117 #expected_exception ".\n Actual: it throws a different type."; \
9118 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
9120 if (!gtest_caught_expected) { \
9122 "Expected: " #statement " throws an exception of type " \
9123 #expected_exception ".\n Actual: it throws nothing."; \
9124 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
9127 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
9128 fail(gtest_msg.value)
9130 #define GTEST_TEST_NO_THROW_(statement, fail) \
9131 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9132 if (::testing::internal::AlwaysTrue()) { \
9134 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9137 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
9140 GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
9141 fail("Expected: " #statement " doesn't throw an exception.\n" \
9142 " Actual: it throws.")
9144 #define GTEST_TEST_ANY_THROW_(statement, fail) \
9145 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9146 if (::testing::internal::AlwaysTrue()) { \
9147 bool gtest_caught_any = false; \
9149 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9152 gtest_caught_any = true; \
9154 if (!gtest_caught_any) { \
9155 goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
9158 GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
9159 fail("Expected: " #statement " throws an exception.\n" \
9160 " Actual: it doesn't.")
9163 // Implements Boolean test assertions such as EXPECT_TRUE. expression can be
9164 // either a boolean expression or an AssertionResult. text is a textual
9165 // represenation of expression as it was passed into the EXPECT_TRUE.
9166 #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
9167 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9168 if (const ::testing::AssertionResult gtest_ar_ = \
9169 ::testing::AssertionResult(expression)) \
9172 fail(::testing::internal::GetBoolAssertionFailureMessage(\
9173 gtest_ar_, text, #actual, #expected).c_str())
9175 #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
9176 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9177 if (::testing::internal::AlwaysTrue()) { \
9178 ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
9179 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9180 if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
9181 goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
9184 GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
9185 fail("Expected: " #statement " doesn't generate new fatal " \
9186 "failures in the current thread.\n" \
9187 " Actual: it does.")
9189 // Expands to the name of the class that implements the given test.
9190 #define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
9191 test_case_name##_##test_name##_Test
9193 // Helper macro for defining tests.
9194 #define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
9195 class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
9197 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
9199 virtual void TestBody();\
9200 static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
9201 GTEST_DISALLOW_COPY_AND_ASSIGN_(\
9202 GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
9205 ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
9207 ::testing::internal::MakeAndRegisterTestInfo(\
9208 #test_case_name, #test_name, NULL, NULL, \
9209 ::testing::internal::CodeLocation(__FILE__, __LINE__), \
9211 parent_class::SetUpTestCase, \
9212 parent_class::TearDownTestCase, \
9213 new ::testing::internal::TestFactoryImpl<\
9214 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
9215 void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
9217 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
9218 // Copyright 2005, Google Inc.
9219 // All rights reserved.
9221 // Redistribution and use in source and binary forms, with or without
9222 // modification, are permitted provided that the following conditions are
9225 // * Redistributions of source code must retain the above copyright
9226 // notice, this list of conditions and the following disclaimer.
9227 // * Redistributions in binary form must reproduce the above
9228 // copyright notice, this list of conditions and the following disclaimer
9229 // in the documentation and/or other materials provided with the
9231 // * Neither the name of Google Inc. nor the names of its
9232 // contributors may be used to endorse or promote products derived from
9233 // this software without specific prior written permission.
9235 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9236 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9237 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
9238 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9239 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9240 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9241 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
9242 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
9243 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
9244 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
9245 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9248 // The Google C++ Testing and Mocking Framework (Google Test)
9250 // This header file defines the public API for death tests. It is
9251 // #included by gtest.h so a user doesn't need to include this
9253 // GOOGLETEST_CM0001 DO NOT DELETE
9255 #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
9256 #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
9258 // Copyright 2005, Google Inc.
9259 // All rights reserved.
9261 // Redistribution and use in source and binary forms, with or without
9262 // modification, are permitted provided that the following conditions are
9265 // * Redistributions of source code must retain the above copyright
9266 // notice, this list of conditions and the following disclaimer.
9267 // * Redistributions in binary form must reproduce the above
9268 // copyright notice, this list of conditions and the following disclaimer
9269 // in the documentation and/or other materials provided with the
9271 // * Neither the name of Google Inc. nor the names of its
9272 // contributors may be used to endorse or promote products derived from
9273 // this software without specific prior written permission.
9275 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9276 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9277 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
9278 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9279 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9280 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9281 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
9282 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
9283 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
9284 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
9285 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9287 // The Google C++ Testing and Mocking Framework (Google Test)
9289 // This header file defines internal utilities needed for implementing
9290 // death tests. They are subject to change without notice.
9291 // GOOGLETEST_CM0001 DO NOT DELETE
9293 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
9294 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
9300 namespace internal
{
9302 GTEST_DECLARE_string_(internal_run_death_test
);
9304 // Names of the flags (needed for parsing Google Test flags).
9305 const char kDeathTestStyleFlag
[] = "death_test_style";
9306 const char kDeathTestUseFork
[] = "death_test_use_fork";
9307 const char kInternalRunDeathTestFlag
[] = "internal_run_death_test";
9309 #if GTEST_HAS_DEATH_TEST
9311 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
9312 /* class A needs to have dll-interface to be used by clients of class B */)
9314 // DeathTest is a class that hides much of the complexity of the
9315 // GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
9316 // returns a concrete class that depends on the prevailing death test
9317 // style, as defined by the --gtest_death_test_style and/or
9318 // --gtest_internal_run_death_test flags.
9320 // In describing the results of death tests, these terms are used with
9321 // the corresponding definitions:
9323 // exit status: The integer exit information in the format specified
9325 // exit code: The integer code passed to exit(3), _exit(2), or
9326 // returned from main()
9327 class GTEST_API_ DeathTest
{
9329 // Create returns false if there was an error determining the
9330 // appropriate action to take for the current death test; for example,
9331 // if the gtest_death_test_style flag is set to an invalid value.
9332 // The LastMessage method will return a more detailed message in that
9333 // case. Otherwise, the DeathTest pointer pointed to by the "test"
9334 // argument is set. If the death test should be skipped, the pointer
9335 // is set to NULL; otherwise, it is set to the address of a new concrete
9336 // DeathTest object that controls the execution of the current test.
9337 static bool Create(const char* statement
, const RE
* regex
,
9338 const char* file
, int line
, DeathTest
** test
);
9340 virtual ~DeathTest() { }
9342 // A helper class that aborts a death test when it's deleted.
9343 class ReturnSentinel
{
9345 explicit ReturnSentinel(DeathTest
* test
) : test_(test
) { }
9346 ~ReturnSentinel() { test_
->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT
); }
9348 DeathTest
* const test_
;
9349 GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel
);
9350 } GTEST_ATTRIBUTE_UNUSED_
;
9352 // An enumeration of possible roles that may be taken when a death
9353 // test is encountered. EXECUTE means that the death test logic should
9354 // be executed immediately. OVERSEE means that the program should prepare
9355 // the appropriate environment for a child process to execute the death
9356 // test, then wait for it to complete.
9357 enum TestRole
{ OVERSEE_TEST
, EXECUTE_TEST
};
9359 // An enumeration of the three reasons that a test might be aborted.
9361 TEST_ENCOUNTERED_RETURN_STATEMENT
,
9362 TEST_THREW_EXCEPTION
,
9366 // Assumes one of the above roles.
9367 virtual TestRole
AssumeRole() = 0;
9369 // Waits for the death test to finish and returns its status.
9370 virtual int Wait() = 0;
9372 // Returns true if the death test passed; that is, the test process
9373 // exited during the test, its exit status matches a user-supplied
9374 // predicate, and its stderr output matches a user-supplied regular
9376 // The user-supplied predicate may be a macro expression rather
9377 // than a function pointer or functor, or else Wait and Passed could
9379 virtual bool Passed(bool exit_status_ok
) = 0;
9381 // Signals that the death test did not die as expected.
9382 virtual void Abort(AbortReason reason
) = 0;
9384 // Returns a human-readable outcome message regarding the outcome of
9385 // the last death test.
9386 static const char* LastMessage();
9388 static void set_last_death_test_message(const std::string
& message
);
9391 // A string containing a description of the outcome of the last death test.
9392 static std::string last_death_test_message_
;
9394 GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest
);
9397 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
9399 // Factory interface for death tests. May be mocked out for testing.
9400 class DeathTestFactory
{
9402 virtual ~DeathTestFactory() { }
9403 virtual bool Create(const char* statement
, const RE
* regex
,
9404 const char* file
, int line
, DeathTest
** test
) = 0;
9407 // A concrete DeathTestFactory implementation for normal use.
9408 class DefaultDeathTestFactory
: public DeathTestFactory
{
9410 virtual bool Create(const char* statement
, const RE
* regex
,
9411 const char* file
, int line
, DeathTest
** test
);
9414 // Returns true if exit_status describes a process that was terminated
9415 // by a signal, or exited normally with a nonzero exit code.
9416 GTEST_API_
bool ExitedUnsuccessfully(int exit_status
);
9418 // Traps C++ exceptions escaping statement and reports them as test
9419 // failures. Note that trapping SEH exceptions is not implemented here.
9420 # if GTEST_HAS_EXCEPTIONS
9421 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
9423 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9424 } catch (const ::std::exception& gtest_exception) { \
9427 "\n%s: Caught std::exception-derived exception escaping the " \
9428 "death test statement. Exception message: %s\n", \
9429 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
9430 gtest_exception.what()); \
9432 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
9434 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
9438 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
9439 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
9443 // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
9444 // ASSERT_EXIT*, and EXPECT_EXIT*.
9445 # define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
9446 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9447 if (::testing::internal::AlwaysTrue()) { \
9448 const ::testing::internal::RE& gtest_regex = (regex); \
9449 ::testing::internal::DeathTest* gtest_dt; \
9450 if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
9451 __FILE__, __LINE__, >est_dt)) { \
9452 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
9454 if (gtest_dt != NULL) { \
9455 ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
9456 gtest_dt_ptr(gtest_dt); \
9457 switch (gtest_dt->AssumeRole()) { \
9458 case ::testing::internal::DeathTest::OVERSEE_TEST: \
9459 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
9460 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
9463 case ::testing::internal::DeathTest::EXECUTE_TEST: { \
9464 ::testing::internal::DeathTest::ReturnSentinel \
9465 gtest_sentinel(gtest_dt); \
9466 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
9467 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
9475 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
9476 fail(::testing::internal::DeathTest::LastMessage())
9477 // The symbol "fail" here expands to something into which a message
9480 // This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
9481 // NDEBUG mode. In this case we need the statements to be executed and the macro
9482 // must accept a streamed message even though the message is never printed.
9483 // The regex object is not evaluated, but it is used to prevent "unused"
9484 // warnings and to avoid an expression that doesn't compile in debug mode.
9485 #define GTEST_EXECUTE_STATEMENT_(statement, regex) \
9486 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9487 if (::testing::internal::AlwaysTrue()) { \
9488 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9489 } else if (!::testing::internal::AlwaysTrue()) { \
9490 const ::testing::internal::RE& gtest_regex = (regex); \
9491 static_cast<void>(gtest_regex); \
9493 ::testing::Message()
9495 // A class representing the parsed contents of the
9496 // --gtest_internal_run_death_test flag, as it existed when
9497 // RUN_ALL_TESTS was called.
9498 class InternalRunDeathTestFlag
{
9500 InternalRunDeathTestFlag(const std::string
& a_file
,
9504 : file_(a_file
), line_(a_line
), index_(an_index
),
9505 write_fd_(a_write_fd
) {}
9507 ~InternalRunDeathTestFlag() {
9509 posix::Close(write_fd_
);
9512 const std::string
& file() const { return file_
; }
9513 int line() const { return line_
; }
9514 int index() const { return index_
; }
9515 int write_fd() const { return write_fd_
; }
9523 GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag
);
9526 // Returns a newly created InternalRunDeathTestFlag object with fields
9527 // initialized from the GTEST_FLAG(internal_run_death_test) flag if
9528 // the flag is specified; otherwise returns NULL.
9529 InternalRunDeathTestFlag
* ParseInternalRunDeathTestFlag();
9531 #endif // GTEST_HAS_DEATH_TEST
9533 } // namespace internal
9534 } // namespace testing
9536 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
9540 // This flag controls the style of death tests. Valid values are "threadsafe",
9541 // meaning that the death test child process will re-execute the test binary
9542 // from the start, running only a single death test, or "fast",
9543 // meaning that the child process will execute the test logic immediately
9545 GTEST_DECLARE_string_(death_test_style
);
9547 #if GTEST_HAS_DEATH_TEST
9549 namespace internal
{
9551 // Returns a Boolean value indicating whether the caller is currently
9552 // executing in the context of the death test child process. Tools such as
9553 // Valgrind heap checkers may need this to modify their behavior in death
9554 // tests. IMPORTANT: This is an internal utility. Using it may break the
9555 // implementation of death tests. User code MUST NOT use it.
9556 GTEST_API_
bool InDeathTestChild();
9558 } // namespace internal
9560 // The following macros are useful for writing death tests.
9562 // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
9565 // 1. It generates a warning if there is more than one active
9566 // thread. This is because it's safe to fork() or clone() only
9567 // when there is a single thread.
9569 // 2. The parent process clone()s a sub-process and runs the death
9570 // test in it; the sub-process exits with code 0 at the end of the
9571 // death test, if it hasn't exited already.
9573 // 3. The parent process waits for the sub-process to terminate.
9575 // 4. The parent process checks the exit code and error message of
9580 // ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
9581 // for (int i = 0; i < 5; i++) {
9582 // EXPECT_DEATH(server.ProcessRequest(i),
9583 // "Invalid request .* in ProcessRequest()")
9584 // << "Failed to die on request " << i;
9587 // ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
9589 // bool KilledBySIGHUP(int exit_code) {
9590 // return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
9593 // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
9595 // On the regular expressions used in death tests:
9597 // GOOGLETEST_CM0005 DO NOT DELETE
9598 // On POSIX-compliant systems (*nix), we use the <regex.h> library,
9599 // which uses the POSIX extended regex syntax.
9601 // On other platforms (e.g. Windows or Mac), we only support a simple regex
9602 // syntax implemented as part of Google Test. This limited
9603 // implementation should be enough most of the time when writing
9604 // death tests; though it lacks many features you can find in PCRE
9605 // or POSIX extended regex syntax. For example, we don't support
9606 // union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
9607 // repetition count ("x{5,7}"), among others.
9609 // Below is the syntax that we do support. We chose it to be a
9610 // subset of both PCRE and POSIX extended regex, so it's easy to
9611 // learn wherever you come from. In the following: 'A' denotes a
9612 // literal character, period (.), or a single \\ escape sequence;
9613 // 'x' and 'y' denote regular expressions; 'm' and 'n' are for
9616 // c matches any literal character c
9617 // \\d matches any decimal digit
9618 // \\D matches any character that's not a decimal digit
9622 // \\s matches any ASCII whitespace, including \n
9623 // \\S matches any character that's not a whitespace
9626 // \\w matches any letter, _, or decimal digit
9627 // \\W matches any character that \\w doesn't match
9628 // \\c matches any literal character c, which must be a punctuation
9629 // . matches any single character except \n
9630 // A? matches 0 or 1 occurrences of A
9631 // A* matches 0 or many occurrences of A
9632 // A+ matches 1 or many occurrences of A
9633 // ^ matches the beginning of a string (not that of each line)
9634 // $ matches the end of a string (not that of each line)
9635 // xy matches x followed by y
9637 // If you accidentally use PCRE or POSIX extended regex features
9638 // not implemented by us, you will get a run-time failure. In that
9639 // case, please try to rewrite your regular expression within the
9642 // This implementation is *not* meant to be as highly tuned or robust
9643 // as a compiled regex library, but should perform well enough for a
9644 // death test, which already incurs significant overhead by launching
9649 // A "threadsafe" style death test obtains the path to the test
9650 // program from argv[0] and re-executes it in the sub-process. For
9651 // simplicity, the current implementation doesn't search the PATH
9652 // when launching the sub-process. This means that the user must
9653 // invoke the test program via a path that contains at least one
9654 // path separator (e.g. path/to/foo_test and
9655 // /absolute/path/to/bar_test are fine, but foo_test is not). This
9656 // is rarely a problem as people usually don't put the test binary
9657 // directory in PATH.
9659 // FIXME: make thread-safe death tests search the PATH.
9661 // Asserts that a given statement causes the program to exit, with an
9662 // integer exit status that satisfies predicate, and emitting error output
9663 // that matches regex.
9664 # define ASSERT_EXIT(statement, predicate, regex) \
9665 GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
9667 // Like ASSERT_EXIT, but continues on to successive tests in the
9668 // test case, if any:
9669 # define EXPECT_EXIT(statement, predicate, regex) \
9670 GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
9672 // Asserts that a given statement causes the program to exit, either by
9673 // explicitly exiting with a nonzero exit code or being killed by a
9674 // signal, and emitting error output that matches regex.
9675 # define ASSERT_DEATH(statement, regex) \
9676 ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
9678 // Like ASSERT_DEATH, but continues on to successive tests in the
9679 // test case, if any:
9680 # define EXPECT_DEATH(statement, regex) \
9681 EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
9683 // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
9685 // Tests that an exit code describes a normal exit with a given exit code.
9686 class GTEST_API_ ExitedWithCode
{
9688 explicit ExitedWithCode(int exit_code
);
9689 bool operator()(int exit_status
) const;
9691 // No implementation - assignment is unsupported.
9692 void operator=(const ExitedWithCode
& other
);
9694 const int exit_code_
;
9697 # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
9698 // Tests that an exit code describes an exit due to termination by a
9700 // GOOGLETEST_CM0006 DO NOT DELETE
9701 class GTEST_API_ KilledBySignal
{
9703 explicit KilledBySignal(int signum
);
9704 bool operator()(int exit_status
) const;
9708 # endif // !GTEST_OS_WINDOWS
9710 // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
9711 // The death testing framework causes this to have interesting semantics,
9712 // since the sideeffects of the call are only visible in opt mode, and not
9715 // In practice, this can be used to test functions that utilize the
9716 // LOG(DFATAL) macro using the following style:
9718 // int DieInDebugOr12(int* sideeffect) {
9719 // if (sideeffect) {
9720 // *sideeffect = 12;
9722 // LOG(DFATAL) << "death";
9726 // TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
9727 // int sideeffect = 0;
9728 // // Only asserts in dbg.
9729 // EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
9732 // // opt-mode has sideeffect visible.
9733 // EXPECT_EQ(12, sideeffect);
9735 // // dbg-mode no visible sideeffect.
9736 // EXPECT_EQ(0, sideeffect);
9740 // This will assert that DieInDebugReturn12InOpt() crashes in debug
9741 // mode, usually due to a DCHECK or LOG(DFATAL), but returns the
9742 // appropriate fallback value (12 in this case) in opt mode. If you
9743 // need to test that a function has appropriate side-effects in opt
9744 // mode, include assertions against the side-effects. A general
9745 // pattern for this is:
9747 // EXPECT_DEBUG_DEATH({
9748 // // Side-effects here will have an effect after this statement in
9749 // // opt mode, but none in debug mode.
9750 // EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
9755 # define EXPECT_DEBUG_DEATH(statement, regex) \
9756 GTEST_EXECUTE_STATEMENT_(statement, regex)
9758 # define ASSERT_DEBUG_DEATH(statement, regex) \
9759 GTEST_EXECUTE_STATEMENT_(statement, regex)
9763 # define EXPECT_DEBUG_DEATH(statement, regex) \
9764 EXPECT_DEATH(statement, regex)
9766 # define ASSERT_DEBUG_DEATH(statement, regex) \
9767 ASSERT_DEATH(statement, regex)
9769 # endif // NDEBUG for EXPECT_DEBUG_DEATH
9770 #endif // GTEST_HAS_DEATH_TEST
9772 // This macro is used for implementing macros such as
9773 // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
9774 // death tests are not supported. Those macros must compile on such systems
9775 // iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
9776 // systems that support death tests. This allows one to write such a macro
9777 // on a system that does not support death tests and be sure that it will
9778 // compile on a death-test supporting system. It is exposed publicly so that
9779 // systems that have death-tests with stricter requirements than
9780 // GTEST_HAS_DEATH_TEST can write their own equivalent of
9781 // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED.
9784 // statement - A statement that a macro such as EXPECT_DEATH would test
9785 // for program termination. This macro has to make sure this
9786 // statement is compiled but not executed, to ensure that
9787 // EXPECT_DEATH_IF_SUPPORTED compiles with a certain
9788 // parameter iff EXPECT_DEATH compiles with it.
9789 // regex - A regex that a macro such as EXPECT_DEATH would use to test
9790 // the output of statement. This parameter has to be
9791 // compiled but not evaluated by this macro, to ensure that
9792 // this macro only accepts expressions that a macro such as
9793 // EXPECT_DEATH would accept.
9794 // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
9795 // and a return statement for ASSERT_DEATH_IF_SUPPORTED.
9796 // This ensures that ASSERT_DEATH_IF_SUPPORTED will not
9797 // compile inside functions where ASSERT_DEATH doesn't
9800 // The branch that has an always false condition is used to ensure that
9801 // statement and regex are compiled (and thus syntactically correct) but
9802 // never executed. The unreachable code macro protects the terminator
9803 // statement from generating an 'unreachable code' warning in case
9804 // statement unconditionally returns or throws. The Message constructor at
9805 // the end allows the syntax of streaming additional messages into the
9806 // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
9807 # define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \
9808 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
9809 if (::testing::internal::AlwaysTrue()) { \
9810 GTEST_LOG_(WARNING) \
9811 << "Death tests are not supported on this platform.\n" \
9812 << "Statement '" #statement "' cannot be verified."; \
9813 } else if (::testing::internal::AlwaysFalse()) { \
9814 ::testing::internal::RE::PartialMatch(".*", (regex)); \
9815 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
9818 ::testing::Message()
9820 // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
9821 // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
9822 // death tests are supported; otherwise they just issue a warning. This is
9823 // useful when you are combining death test assertions with normal test
9824 // assertions in one test.
9825 #if GTEST_HAS_DEATH_TEST
9826 # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
9827 EXPECT_DEATH(statement, regex)
9828 # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
9829 ASSERT_DEATH(statement, regex)
9831 # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
9832 GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, )
9833 # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
9834 GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return)
9837 } // namespace testing
9839 #endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
9840 // This file was GENERATED by command:
9841 // pump.py gtest-param-test.h.pump
9842 // DO NOT EDIT BY HAND!!!
9844 // Copyright 2008, Google Inc.
9845 // All rights reserved.
9847 // Redistribution and use in source and binary forms, with or without
9848 // modification, are permitted provided that the following conditions are
9851 // * Redistributions of source code must retain the above copyright
9852 // notice, this list of conditions and the following disclaimer.
9853 // * Redistributions in binary form must reproduce the above
9854 // copyright notice, this list of conditions and the following disclaimer
9855 // in the documentation and/or other materials provided with the
9857 // * Neither the name of Google Inc. nor the names of its
9858 // contributors may be used to endorse or promote products derived from
9859 // this software without specific prior written permission.
9861 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9862 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9863 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
9864 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9865 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9866 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9867 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
9868 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
9869 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
9870 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
9871 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9873 // Macros and functions for implementing parameterized tests
9874 // in Google C++ Testing and Mocking Framework (Google Test)
9876 // This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
9878 // GOOGLETEST_CM0001 DO NOT DELETE
9879 #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
9880 #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
9883 // Value-parameterized tests allow you to test your code with different
9884 // parameters without writing multiple copies of the same test.
9886 // Here is how you use value-parameterized tests:
9890 // To write value-parameterized tests, first you should define a fixture
9891 // class. It is usually derived from testing::TestWithParam<T> (see below for
9892 // another inheritance scheme that's sometimes useful in more complicated
9893 // class hierarchies), where the type of your parameter values.
9894 // TestWithParam<T> is itself derived from testing::Test. T can be any
9895 // copyable type. If it's a raw pointer, you are responsible for managing the
9896 // lifespan of the pointed values.
9898 class FooTest
: public ::testing::TestWithParam
<const char*> {
9899 // You can implement all the usual class fixture members here.
9902 // Then, use the TEST_P macro to define as many parameterized tests
9903 // for this fixture as you want. The _P suffix is for "parameterized"
9904 // or "pattern", whichever you prefer to think.
9906 TEST_P(FooTest
, DoesBlah
) {
9907 // Inside a test, access the test parameter with the GetParam() method
9908 // of the TestWithParam<T> class:
9909 EXPECT_TRUE(foo
.Blah(GetParam()));
9913 TEST_P(FooTest
, HasBlahBlah
) {
9917 // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
9918 // case with any set of parameters you want. Google Test defines a number
9919 // of functions for generating test parameters. They return what we call
9920 // (surprise!) parameter generators. Here is a summary of them, which
9921 // are all in the testing namespace:
9924 // Range(begin, end [, step]) - Yields values {begin, begin+step,
9925 // begin+step+step, ...}. The values do not
9926 // include end. step defaults to 1.
9927 // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
9928 // ValuesIn(container) - Yields values from a C-style array, an STL
9929 // ValuesIn(begin,end) container, or an iterator range [begin, end).
9930 // Bool() - Yields sequence {false, true}.
9931 // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
9932 // for the math savvy) of the values generated
9933 // by the N generators.
9935 // For more details, see comments at the definitions of these functions below
9938 // The following statement will instantiate tests from the FooTest test case
9939 // each with parameter values "meeny", "miny", and "moe".
9941 INSTANTIATE_TEST_CASE_P(InstantiationName
,
9943 Values("meeny", "miny", "moe"));
9945 // To distinguish different instances of the pattern, (yes, you
9946 // can instantiate it more then once) the first argument to the
9947 // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
9948 // actual test case name. Remember to pick unique prefixes for different
9949 // instantiations. The tests from the instantiation above will have
9952 // * InstantiationName/FooTest.DoesBlah/0 for "meeny"
9953 // * InstantiationName/FooTest.DoesBlah/1 for "miny"
9954 // * InstantiationName/FooTest.DoesBlah/2 for "moe"
9955 // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
9956 // * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
9957 // * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
9959 // You can use these names in --gtest_filter.
9961 // This statement will instantiate all tests from FooTest again, each
9962 // with parameter values "cat" and "dog":
9964 const char* pets
[] = {"cat", "dog"};
9965 INSTANTIATE_TEST_CASE_P(AnotherInstantiationName
, FooTest
, ValuesIn(pets
));
9967 // The tests from the instantiation above will have these names:
9969 // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
9970 // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
9971 // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
9972 // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
9974 // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
9975 // in the given test case, whether their definitions come before or
9976 // AFTER the INSTANTIATE_TEST_CASE_P statement.
9978 // Please also note that generator expressions (including parameters to the
9979 // generators) are evaluated in InitGoogleTest(), after main() has started.
9980 // This allows the user on one hand, to adjust generator parameters in order
9981 // to dynamically determine a set of tests to run and on the other hand,
9982 // give the user a chance to inspect the generated tests with Google Test
9983 // reflection API before RUN_ALL_TESTS() is executed.
9985 // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
9986 // for more examples.
9988 // In the future, we plan to publish the API for defining new parameter
9989 // generators. But for now this interface remains part of the internal
9990 // implementation and is subject to change.
9993 // A parameterized test fixture must be derived from testing::Test and from
9994 // testing::WithParamInterface<T>, where T is the type of the parameter
9995 // values. Inheriting from TestWithParam<T> satisfies that requirement because
9996 // TestWithParam<T> inherits from both Test and WithParamInterface. In more
9997 // complicated hierarchies, however, it is occasionally useful to inherit
9998 // separately from Test and WithParamInterface. For example:
10000 class BaseTest
: public ::testing::Test
{
10001 // You can inherit all the usual members for a non-parameterized test
10005 class DerivedTest
: public BaseTest
, public ::testing::WithParamInterface
<int> {
10006 // The usual test fixture members go here too.
10009 TEST_F(BaseTest
, HasFoo
) {
10010 // This is an ordinary non-parameterized test.
10013 TEST_P(DerivedTest
, DoesBlah
) {
10014 // GetParam works just the same here as if you inherit from TestWithParam.
10015 EXPECT_TRUE(foo
.Blah(GetParam()));
10021 #if !GTEST_OS_SYMBIAN
10022 # include <utility>
10025 // Copyright 2008 Google Inc.
10026 // All Rights Reserved.
10028 // Redistribution and use in source and binary forms, with or without
10029 // modification, are permitted provided that the following conditions are
10032 // * Redistributions of source code must retain the above copyright
10033 // notice, this list of conditions and the following disclaimer.
10034 // * Redistributions in binary form must reproduce the above
10035 // copyright notice, this list of conditions and the following disclaimer
10036 // in the documentation and/or other materials provided with the
10038 // * Neither the name of Google Inc. nor the names of its
10039 // contributors may be used to endorse or promote products derived from
10040 // this software without specific prior written permission.
10042 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10043 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10044 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10045 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10046 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10047 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10048 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10049 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10050 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10051 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10052 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10055 // Type and function utilities for implementing parameterized tests.
10057 // GOOGLETEST_CM0001 DO NOT DELETE
10059 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
10060 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
10064 #include <iterator>
10069 // Copyright 2003 Google Inc.
10070 // All rights reserved.
10072 // Redistribution and use in source and binary forms, with or without
10073 // modification, are permitted provided that the following conditions are
10076 // * Redistributions of source code must retain the above copyright
10077 // notice, this list of conditions and the following disclaimer.
10078 // * Redistributions in binary form must reproduce the above
10079 // copyright notice, this list of conditions and the following disclaimer
10080 // in the documentation and/or other materials provided with the
10082 // * Neither the name of Google Inc. nor the names of its
10083 // contributors may be used to endorse or promote products derived from
10084 // this software without specific prior written permission.
10086 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10087 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10088 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10089 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10090 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10091 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10092 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10093 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10094 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10095 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10096 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10098 // A "smart" pointer type with reference tracking. Every pointer to a
10099 // particular object is kept on a circular linked list. When the last pointer
10100 // to an object is destroyed or reassigned, the object is deleted.
10102 // Used properly, this deletes the object when the last reference goes away.
10103 // There are several caveats:
10104 // - Like all reference counting schemes, cycles lead to leaks.
10105 // - Each smart pointer is actually two pointers (8 bytes instead of 4).
10106 // - Every time a pointer is assigned, the entire list of pointers to that
10107 // object is traversed. This class is therefore NOT SUITABLE when there
10108 // will often be more than two or three pointers to a particular object.
10109 // - References are only tracked as long as linked_ptr<> objects are copied.
10110 // If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
10111 // will happen (double deletion).
10113 // A good use of this class is storing object references in STL containers.
10114 // You can safely put linked_ptr<> in a vector<>.
10115 // Other uses may not be as good.
10117 // Note: If you use an incomplete type with linked_ptr<>, the class
10118 // *containing* linked_ptr<> must have a constructor and destructor (even
10119 // if they do nothing!).
10121 // Bill Gibbons suggested we use something like this.
10124 // Unlike other linked_ptr implementations, in this implementation
10125 // a linked_ptr object is thread-safe in the sense that:
10126 // - it's safe to copy linked_ptr objects concurrently,
10127 // - it's safe to copy *from* a linked_ptr and read its underlying
10128 // raw pointer (e.g. via get()) concurrently, and
10129 // - it's safe to write to two linked_ptrs that point to the same
10130 // shared object concurrently.
10131 // FIXME: rename this to safe_linked_ptr to avoid
10132 // confusion with normal linked_ptr.
10134 // GOOGLETEST_CM0001 DO NOT DELETE
10136 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
10137 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
10139 #include <stdlib.h>
10140 #include <assert.h>
10143 namespace testing
{
10144 namespace internal
{
10146 // Protects copying of all linked_ptr objects.
10147 GTEST_API_
GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex
);
10149 // This is used internally by all instances of linked_ptr<>. It needs to be
10150 // a non-template class because different types of linked_ptr<> can refer to
10151 // the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
10152 // So, it needs to be possible for different types of linked_ptr to participate
10153 // in the same circular linked list, so we need a single class type here.
10155 // DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
10156 class linked_ptr_internal
{
10158 // Create a new circle that includes only this instance.
10163 // Many linked_ptr operations may change p.link_ for some linked_ptr
10164 // variable p in the same circle as this object. Therefore we need
10165 // to prevent two such operations from occurring concurrently.
10167 // Note that different types of linked_ptr objects can coexist in a
10168 // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
10169 // linked_ptr<Derived2>). Therefore we must use a single mutex to
10170 // protect all linked_ptr objects. This can create serious
10171 // contention in production code, but is acceptable in a testing
10174 // Join an existing circle.
10175 void join(linked_ptr_internal
const* ptr
)
10176 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex
) {
10177 MutexLock
lock(&g_linked_ptr_mutex
);
10179 linked_ptr_internal
const* p
= ptr
;
10180 while (p
->next_
!= ptr
) {
10181 assert(p
->next_
!= this &&
10182 "Trying to join() a linked ring we are already in. "
10183 "Is GMock thread safety enabled?");
10190 // Leave whatever circle we're part of. Returns true if we were the
10191 // last member of the circle. Once this is done, you can join() another.
10193 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex
) {
10194 MutexLock
lock(&g_linked_ptr_mutex
);
10196 if (next_
== this) return true;
10197 linked_ptr_internal
const* p
= next_
;
10198 while (p
->next_
!= this) {
10199 assert(p
->next_
!= next_
&&
10200 "Trying to depart() a linked ring we are not in. "
10201 "Is GMock thread safety enabled?");
10209 mutable linked_ptr_internal
const* next_
;
10212 template <typename T
>
10215 typedef T element_type
;
10217 // Take over ownership of a raw pointer. This should happen as soon as
10218 // possible after the object is created.
10219 explicit linked_ptr(T
* ptr
= NULL
) { capture(ptr
); }
10220 ~linked_ptr() { depart(); }
10222 // Copy an existing linked_ptr<>, adding ourselves to the list of references.
10223 template <typename U
> linked_ptr(linked_ptr
<U
> const& ptr
) { copy(&ptr
); }
10224 linked_ptr(linked_ptr
const& ptr
) { // NOLINT
10225 assert(&ptr
!= this);
10229 // Assignment releases the old value and acquires the new.
10230 template <typename U
> linked_ptr
& operator=(linked_ptr
<U
> const& ptr
) {
10236 linked_ptr
& operator=(linked_ptr
const& ptr
) {
10237 if (&ptr
!= this) {
10244 // Smart pointer members.
10245 void reset(T
* ptr
= NULL
) {
10249 T
* get() const { return value_
; }
10250 T
* operator->() const { return value_
; }
10251 T
& operator*() const { return *value_
; }
10253 bool operator==(T
* p
) const { return value_
== p
; }
10254 bool operator!=(T
* p
) const { return value_
!= p
; }
10255 template <typename U
>
10256 bool operator==(linked_ptr
<U
> const& ptr
) const {
10257 return value_
== ptr
.get();
10259 template <typename U
>
10260 bool operator!=(linked_ptr
<U
> const& ptr
) const {
10261 return value_
!= ptr
.get();
10265 template <typename U
>
10266 friend class linked_ptr
;
10269 linked_ptr_internal link_
;
10272 if (link_
.depart()) delete value_
;
10275 void capture(T
* ptr
) {
10280 template <typename U
> void copy(linked_ptr
<U
> const* ptr
) {
10281 value_
= ptr
->get();
10283 link_
.join(&ptr
->link_
);
10289 template<typename T
> inline
10290 bool operator==(T
* ptr
, const linked_ptr
<T
>& x
) {
10291 return ptr
== x
.get();
10294 template<typename T
> inline
10295 bool operator!=(T
* ptr
, const linked_ptr
<T
>& x
) {
10296 return ptr
!= x
.get();
10299 // A function to convert T* into linked_ptr<T>
10300 // Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
10301 // for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
10302 template <typename T
>
10303 linked_ptr
<T
> make_linked_ptr(T
* ptr
) {
10304 return linked_ptr
<T
>(ptr
);
10307 } // namespace internal
10308 } // namespace testing
10310 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
10311 // Copyright 2007, Google Inc.
10312 // All rights reserved.
10314 // Redistribution and use in source and binary forms, with or without
10315 // modification, are permitted provided that the following conditions are
10318 // * Redistributions of source code must retain the above copyright
10319 // notice, this list of conditions and the following disclaimer.
10320 // * Redistributions in binary form must reproduce the above
10321 // copyright notice, this list of conditions and the following disclaimer
10322 // in the documentation and/or other materials provided with the
10324 // * Neither the name of Google Inc. nor the names of its
10325 // contributors may be used to endorse or promote products derived from
10326 // this software without specific prior written permission.
10328 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10329 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10330 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10331 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10332 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10333 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10334 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10335 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10336 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10337 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10338 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10341 // Google Test - The Google C++ Testing and Mocking Framework
10343 // This file implements a universal value printer that can print a
10344 // value of any type T:
10346 // void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
10348 // A user can teach this function how to print a class type T by
10349 // defining either operator<<() or PrintTo() in the namespace that
10350 // defines T. More specifically, the FIRST defined function in the
10351 // following list will be used (assuming T is defined in namespace
10354 // 1. foo::PrintTo(const T&, ostream*)
10355 // 2. operator<<(ostream&, const T&) defined in either foo or the
10356 // global namespace.
10358 // However if T is an STL-style container then it is printed element-wise
10359 // unless foo::PrintTo(const T&, ostream*) is defined. Note that
10360 // operator<<() is ignored for container types.
10362 // If none of the above is defined, it will print the debug string of
10363 // the value if it is a protocol buffer, or print the raw bytes in the
10364 // value otherwise.
10366 // To aid debugging: when T is a reference type, the address of the
10367 // value is also printed; when T is a (const) char pointer, both the
10368 // pointer value and the NUL-terminated string it points to are
10371 // We also provide some convenient wrappers:
10373 // // Prints a value to a string. For a (const or not) char
10374 // // pointer, the NUL-terminated string (but not the pointer) is
10376 // std::string ::testing::PrintToString(const T& value);
10378 // // Prints a value tersely: for a reference type, the referenced
10379 // // value (but not the address) is printed; for a (const or not) char
10380 // // pointer, the NUL-terminated string (but not the pointer) is
10382 // void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
10384 // // Prints value using the type inferred by the compiler. The difference
10385 // // from UniversalTersePrint() is that this function prints both the
10386 // // pointer and the NUL-terminated string for a (const or not) char pointer.
10387 // void ::testing::internal::UniversalPrint(const T& value, ostream*);
10389 // // Prints the fields of a tuple tersely to a string vector, one
10390 // // element for each field. Tuple support must be enabled in
10391 // // gtest-port.h.
10392 // std::vector<string> UniversalTersePrintTupleFieldsToStrings(
10393 // const Tuple& value);
10395 // Known limitation:
10397 // The print primitives print the elements of an STL-style container
10398 // using the compiler-inferred type of *iter where iter is a
10399 // const_iterator of the container. When const_iterator is an input
10400 // iterator but not a forward iterator, this inferred type may not
10401 // match value_type, and the print output may be incorrect. In
10402 // practice, this is rarely a problem as for most containers
10403 // const_iterator is a forward iterator. We'll fix this if there's an
10404 // actual need for it. Note that this fix cannot rely on value_type
10405 // being defined as many user-defined container types don't have
10408 // GOOGLETEST_CM0001 DO NOT DELETE
10410 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
10411 #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
10413 #include <ostream> // NOLINT
10419 #if GTEST_HAS_STD_TUPLE_
10424 #include "absl/strings/string_view.h"
10425 #include "absl/types/optional.h"
10426 #include "absl/types/variant.h"
10427 #endif // GTEST_HAS_ABSL
10429 namespace testing
{
10431 // Definitions in the 'internal' and 'internal2' name spaces are
10432 // subject to change without notice. DO NOT USE THEM IN USER CODE!
10433 namespace internal2
{
10435 // Prints the given number of bytes in the given object to the given
10437 GTEST_API_
void PrintBytesInObjectTo(const unsigned char* obj_bytes
,
10439 ::std::ostream
* os
);
10441 // For selecting which printer to use when a given type has neither <<
10444 kProtobuf
, // a protobuf type
10445 kConvertibleToInteger
, // a type implicitly convertible to BiggestInt
10446 // (e.g. a named or unnamed enum type)
10448 kConvertibleToStringView
, // a type implicitly convertible to
10449 // absl::string_view
10451 kOtherType
// anything else
10454 // TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
10455 // by the universal printer to print a value of type T when neither
10456 // operator<< nor PrintTo() is defined for T, where kTypeKind is the
10457 // "kind" of T as defined by enum TypeKind.
10458 template <typename T
, TypeKind kTypeKind
>
10459 class TypeWithoutFormatter
{
10461 // This default version is called when kTypeKind is kOtherType.
10462 static void PrintValue(const T
& value
, ::std::ostream
* os
) {
10463 PrintBytesInObjectTo(static_cast<const unsigned char*>(
10464 reinterpret_cast<const void*>(&value
)),
10465 sizeof(value
), os
);
10469 // We print a protobuf using its ShortDebugString() when the string
10470 // doesn't exceed this many characters; otherwise we print it using
10471 // DebugString() for better readability.
10472 const size_t kProtobufOneLinerMaxLength
= 50;
10474 template <typename T
>
10475 class TypeWithoutFormatter
<T
, kProtobuf
> {
10477 static void PrintValue(const T
& value
, ::std::ostream
* os
) {
10478 std::string pretty_str
= value
.ShortDebugString();
10479 if (pretty_str
.length() > kProtobufOneLinerMaxLength
) {
10480 pretty_str
= "\n" + value
.DebugString();
10482 *os
<< ("<" + pretty_str
+ ">");
10486 template <typename T
>
10487 class TypeWithoutFormatter
<T
, kConvertibleToInteger
> {
10489 // Since T has no << operator or PrintTo() but can be implicitly
10490 // converted to BiggestInt, we print it as a BiggestInt.
10492 // Most likely T is an enum type (either named or unnamed), in which
10493 // case printing it as an integer is the desired behavior. In case
10494 // T is not an enum, printing it as an integer is the best we can do
10495 // given that it has no user-defined printer.
10496 static void PrintValue(const T
& value
, ::std::ostream
* os
) {
10497 const internal::BiggestInt kBigInt
= value
;
10503 template <typename T
>
10504 class TypeWithoutFormatter
<T
, kConvertibleToStringView
> {
10506 // Since T has neither operator<< nor PrintTo() but can be implicitly
10507 // converted to absl::string_view, we print it as a absl::string_view.
10509 // Note: the implementation is further below, as it depends on
10510 // internal::PrintTo symbol which is defined later in the file.
10511 static void PrintValue(const T
& value
, ::std::ostream
* os
);
10515 // Prints the given value to the given ostream. If the value is a
10516 // protocol message, its debug string is printed; if it's an enum or
10517 // of a type implicitly convertible to BiggestInt, it's printed as an
10518 // integer; otherwise the bytes in the value are printed. This is
10519 // what UniversalPrinter<T>::Print() does when it knows nothing about
10520 // type T and T has neither << operator nor PrintTo().
10522 // A user can override this behavior for a class type Foo by defining
10523 // a << operator in the namespace where Foo is defined.
10525 // We put this operator in namespace 'internal2' instead of 'internal'
10526 // to simplify the implementation, as much code in 'internal' needs to
10527 // use << in STL, which would conflict with our own << were it defined
10530 // Note that this operator<< takes a generic std::basic_ostream<Char,
10531 // CharTraits> type instead of the more restricted std::ostream. If
10532 // we define it to take an std::ostream instead, we'll get an
10533 // "ambiguous overloads" compiler error when trying to print a type
10534 // Foo that supports streaming to std::basic_ostream<Char,
10535 // CharTraits>, as the compiler cannot tell whether
10536 // operator<<(std::ostream&, const T&) or
10537 // operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
10539 template <typename Char
, typename CharTraits
, typename T
>
10540 ::std::basic_ostream
<Char
, CharTraits
>& operator<<(
10541 ::std::basic_ostream
<Char
, CharTraits
>& os
, const T
& x
) {
10542 TypeWithoutFormatter
<T
, (internal::IsAProtocolMessage
<T
>::value
10544 : internal::ImplicitlyConvertible
<
10545 const T
&, internal::BiggestInt
>::value
10546 ? kConvertibleToInteger
10549 internal::ImplicitlyConvertible
<
10550 const T
&, absl::string_view
>::value
10551 ? kConvertibleToStringView
10554 kOtherType
)>::PrintValue(x
, &os
);
10558 } // namespace internal2
10559 } // namespace testing
10561 // This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
10562 // magic needed for implementing UniversalPrinter won't work.
10563 namespace testing_internal
{
10565 // Used to print a value that is not an STL-style container when the
10566 // user doesn't define PrintTo() for it.
10567 template <typename T
>
10568 void DefaultPrintNonContainerTo(const T
& value
, ::std::ostream
* os
) {
10569 // With the following statement, during unqualified name lookup,
10570 // testing::internal2::operator<< appears as if it was declared in
10571 // the nearest enclosing namespace that contains both
10572 // ::testing_internal and ::testing::internal2, i.e. the global
10573 // namespace. For more details, refer to the C++ Standard section
10574 // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
10575 // testing::internal2::operator<< in case T doesn't come with a <<
10578 // We cannot write 'using ::testing::internal2::operator<<;', which
10579 // gcc 3.3 fails to compile due to a compiler bug.
10580 using namespace ::testing::internal2
; // NOLINT
10582 // Assuming T is defined in namespace foo, in the next statement,
10583 // the compiler will consider all of:
10585 // 1. foo::operator<< (thanks to Koenig look-up),
10586 // 2. ::operator<< (as the current namespace is enclosed in ::),
10587 // 3. testing::internal2::operator<< (thanks to the using statement above).
10589 // The operator<< whose type matches T best will be picked.
10591 // We deliberately allow #2 to be a candidate, as sometimes it's
10592 // impossible to define #1 (e.g. when foo is ::std, defining
10593 // anything in it is undefined behavior unless you are a compiler
10598 } // namespace testing_internal
10600 namespace testing
{
10601 namespace internal
{
10603 // FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
10604 // value of type ToPrint that is an operand of a comparison assertion
10605 // (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in
10606 // the comparison, and is used to help determine the best way to
10607 // format the value. In particular, when the value is a C string
10608 // (char pointer) and the other operand is an STL string object, we
10609 // want to format the C string as a string, since we know it is
10610 // compared by value with the string object. If the value is a char
10611 // pointer but the other operand is not an STL string object, we don't
10612 // know whether the pointer is supposed to point to a NUL-terminated
10613 // string, and thus want to print it as a pointer to be safe.
10615 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
10617 // The default case.
10618 template <typename ToPrint
, typename OtherOperand
>
10619 class FormatForComparison
{
10621 static ::std::string
Format(const ToPrint
& value
) {
10622 return ::testing::PrintToString(value
);
10627 template <typename ToPrint
, size_t N
, typename OtherOperand
>
10628 class FormatForComparison
<ToPrint
[N
], OtherOperand
> {
10630 static ::std::string
Format(const ToPrint
* value
) {
10631 return FormatForComparison
<const ToPrint
*, OtherOperand
>::Format(value
);
10635 // By default, print C string as pointers to be safe, as we don't know
10636 // whether they actually point to a NUL-terminated string.
10638 #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \
10639 template <typename OtherOperand> \
10640 class FormatForComparison<CharType*, OtherOperand> { \
10642 static ::std::string Format(CharType* value) { \
10643 return ::testing::PrintToString(static_cast<const void*>(value)); \
10647 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
10648 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
10649 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
10650 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
10652 #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
10654 // If a C string is compared with an STL string object, we know it's meant
10655 // to point to a NUL-terminated string, and thus can print it as a string.
10657 #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
10659 class FormatForComparison<CharType*, OtherStringType> { \
10661 static ::std::string Format(CharType* value) { \
10662 return ::testing::PrintToString(value); \
10666 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string
);
10667 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string
);
10669 #if GTEST_HAS_GLOBAL_STRING
10670 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string
);
10671 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string
);
10674 #if GTEST_HAS_GLOBAL_WSTRING
10675 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring
);
10676 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring
);
10679 #if GTEST_HAS_STD_WSTRING
10680 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring
);
10681 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring
);
10684 #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
10686 // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
10687 // operand to be used in a failure message. The type (but not value)
10688 // of the other operand may affect the format. This allows us to
10689 // print a char* as a raw pointer when it is compared against another
10690 // char* or void*, and print it as a C string when it is compared
10691 // against an std::string object, for example.
10693 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
10694 template <typename T1
, typename T2
>
10695 std::string
FormatForComparisonFailureMessage(
10696 const T1
& value
, const T2
& /* other_operand */) {
10697 return FormatForComparison
<T1
, T2
>::Format(value
);
10700 // UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
10701 // value to the given ostream. The caller must ensure that
10702 // 'ostream_ptr' is not NULL, or the behavior is undefined.
10704 // We define UniversalPrinter as a class template (as opposed to a
10705 // function template), as we need to partially specialize it for
10706 // reference types, which cannot be done with function templates.
10707 template <typename T
>
10708 class UniversalPrinter
;
10710 template <typename T
>
10711 void UniversalPrint(const T
& value
, ::std::ostream
* os
);
10713 enum DefaultPrinterType
{
10716 kPrintFunctionPointer
,
10719 template <DefaultPrinterType type
> struct WrapPrinterType
{};
10721 // Used to print an STL-style container when the user doesn't define
10722 // a PrintTo() for it.
10723 template <typename C
>
10724 void DefaultPrintTo(WrapPrinterType
<kPrintContainer
> /* dummy */,
10725 const C
& container
, ::std::ostream
* os
) {
10726 const size_t kMaxCount
= 32; // The maximum number of elements to print.
10729 for (typename
C::const_iterator it
= container
.begin();
10730 it
!= container
.end(); ++it
, ++count
) {
10733 if (count
== kMaxCount
) { // Enough has been printed.
10739 // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
10740 // handle *it being a native array.
10741 internal::UniversalPrint(*it
, os
);
10750 // Used to print a pointer that is neither a char pointer nor a member
10751 // pointer, when the user doesn't define PrintTo() for it. (A member
10752 // variable pointer or member function pointer doesn't really point to
10753 // a location in the address space. Their representation is
10754 // implementation-defined. Therefore they will be printed as raw
10756 template <typename T
>
10757 void DefaultPrintTo(WrapPrinterType
<kPrintPointer
> /* dummy */,
10758 T
* p
, ::std::ostream
* os
) {
10762 // T is not a function type. We just call << to print p,
10763 // relying on ADL to pick up user-defined << for their pointer
10768 template <typename T
>
10769 void DefaultPrintTo(WrapPrinterType
<kPrintFunctionPointer
> /* dummy */,
10770 T
* p
, ::std::ostream
* os
) {
10774 // T is a function type, so '*os << p' doesn't do what we want
10775 // (it just prints p as bool). We want to print p as a const
10777 *os
<< reinterpret_cast<const void*>(p
);
10781 // Used to print a non-container, non-pointer value when the user
10782 // doesn't define PrintTo() for it.
10783 template <typename T
>
10784 void DefaultPrintTo(WrapPrinterType
<kPrintOther
> /* dummy */,
10785 const T
& value
, ::std::ostream
* os
) {
10786 ::testing_internal::DefaultPrintNonContainerTo(value
, os
);
10789 // Prints the given value using the << operator if it has one;
10790 // otherwise prints the bytes in it. This is what
10791 // UniversalPrinter<T>::Print() does when PrintTo() is not specialized
10792 // or overloaded for type T.
10794 // A user can override this behavior for a class type Foo by defining
10795 // an overload of PrintTo() in the namespace where Foo is defined. We
10796 // give the user this option as sometimes defining a << operator for
10797 // Foo is not desirable (e.g. the coding style may prevent doing it,
10798 // or there is already a << operator but it doesn't do what the user
10800 template <typename T
>
10801 void PrintTo(const T
& value
, ::std::ostream
* os
) {
10802 // DefaultPrintTo() is overloaded. The type of its first argument
10803 // determines which version will be picked.
10805 // Note that we check for container types here, prior to we check
10806 // for protocol message types in our operator<<. The rationale is:
10808 // For protocol messages, we want to give people a chance to
10809 // override Google Mock's format by defining a PrintTo() or
10810 // operator<<. For STL containers, other formats can be
10811 // incompatible with Google Mock's format for the container
10812 // elements; therefore we check for container types here to ensure
10813 // that our format is used.
10815 // Note that MSVC and clang-cl do allow an implicit conversion from
10816 // pointer-to-function to pointer-to-object, but clang-cl warns on it.
10817 // So don't use ImplicitlyConvertible if it can be helped since it will
10818 // cause this warning, and use a separate overload of DefaultPrintTo for
10819 // function pointers so that the `*os << p` in the object pointer overload
10820 // doesn't cause that warning either.
10823 (sizeof(IsContainerTest
<T
>(0)) == sizeof(IsContainer
)) &&
10824 !IsRecursiveContainer
<T
>::value
10826 : !is_pointer
<T
>::value
10828 #if GTEST_LANG_CXX11
10829 : std::is_function
<typename
std::remove_pointer
<T
>::type
>::value
10831 : !internal::ImplicitlyConvertible
<T
, const void*>::value
10833 ? kPrintFunctionPointer
10834 : kPrintPointer
> (),
10838 // The following list of PrintTo() overloads tells
10839 // UniversalPrinter<T>::Print() how to print standard types (built-in
10840 // types, strings, plain arrays, and pointers).
10842 // Overloads for various char types.
10843 GTEST_API_
void PrintTo(unsigned char c
, ::std::ostream
* os
);
10844 GTEST_API_
void PrintTo(signed char c
, ::std::ostream
* os
);
10845 inline void PrintTo(char c
, ::std::ostream
* os
) {
10846 // When printing a plain char, we always treat it as unsigned. This
10847 // way, the output won't be affected by whether the compiler thinks
10848 // char is signed or not.
10849 PrintTo(static_cast<unsigned char>(c
), os
);
10852 // Overloads for other simple built-in types.
10853 inline void PrintTo(bool x
, ::std::ostream
* os
) {
10854 *os
<< (x
? "true" : "false");
10857 // Overload for wchar_t type.
10858 // Prints a wchar_t as a symbol if it is printable or as its internal
10859 // code otherwise and also as its decimal code (except for L'\0').
10860 // The L'\0' char is printed as "L'\\0'". The decimal code is printed
10861 // as signed integer when wchar_t is implemented by the compiler
10862 // as a signed type and is printed as an unsigned integer when wchar_t
10863 // is implemented as an unsigned type.
10864 GTEST_API_
void PrintTo(wchar_t wc
, ::std::ostream
* os
);
10866 // Overloads for C strings.
10867 GTEST_API_
void PrintTo(const char* s
, ::std::ostream
* os
);
10868 inline void PrintTo(char* s
, ::std::ostream
* os
) {
10869 PrintTo(ImplicitCast_
<const char*>(s
), os
);
10872 // signed/unsigned char is often used for representing binary data, so
10873 // we print pointers to it as void* to be safe.
10874 inline void PrintTo(const signed char* s
, ::std::ostream
* os
) {
10875 PrintTo(ImplicitCast_
<const void*>(s
), os
);
10877 inline void PrintTo(signed char* s
, ::std::ostream
* os
) {
10878 PrintTo(ImplicitCast_
<const void*>(s
), os
);
10880 inline void PrintTo(const unsigned char* s
, ::std::ostream
* os
) {
10881 PrintTo(ImplicitCast_
<const void*>(s
), os
);
10883 inline void PrintTo(unsigned char* s
, ::std::ostream
* os
) {
10884 PrintTo(ImplicitCast_
<const void*>(s
), os
);
10887 // MSVC can be configured to define wchar_t as a typedef of unsigned
10888 // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
10889 // type. When wchar_t is a typedef, defining an overload for const
10890 // wchar_t* would cause unsigned short* be printed as a wide string,
10891 // possibly causing invalid memory accesses.
10892 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
10893 // Overloads for wide C strings
10894 GTEST_API_
void PrintTo(const wchar_t* s
, ::std::ostream
* os
);
10895 inline void PrintTo(wchar_t* s
, ::std::ostream
* os
) {
10896 PrintTo(ImplicitCast_
<const wchar_t*>(s
), os
);
10900 // Overload for C arrays. Multi-dimensional arrays are printed
10903 // Prints the given number of elements in an array, without printing
10904 // the curly braces.
10905 template <typename T
>
10906 void PrintRawArrayTo(const T a
[], size_t count
, ::std::ostream
* os
) {
10907 UniversalPrint(a
[0], os
);
10908 for (size_t i
= 1; i
!= count
; i
++) {
10910 UniversalPrint(a
[i
], os
);
10914 // Overloads for ::string and ::std::string.
10915 #if GTEST_HAS_GLOBAL_STRING
10916 GTEST_API_
void PrintStringTo(const ::string
&s
, ::std::ostream
* os
);
10917 inline void PrintTo(const ::string
& s
, ::std::ostream
* os
) {
10918 PrintStringTo(s
, os
);
10920 #endif // GTEST_HAS_GLOBAL_STRING
10922 GTEST_API_
void PrintStringTo(const ::std::string
&s
, ::std::ostream
* os
);
10923 inline void PrintTo(const ::std::string
& s
, ::std::ostream
* os
) {
10924 PrintStringTo(s
, os
);
10927 // Overloads for ::wstring and ::std::wstring.
10928 #if GTEST_HAS_GLOBAL_WSTRING
10929 GTEST_API_
void PrintWideStringTo(const ::wstring
&s
, ::std::ostream
* os
);
10930 inline void PrintTo(const ::wstring
& s
, ::std::ostream
* os
) {
10931 PrintWideStringTo(s
, os
);
10933 #endif // GTEST_HAS_GLOBAL_WSTRING
10935 #if GTEST_HAS_STD_WSTRING
10936 GTEST_API_
void PrintWideStringTo(const ::std::wstring
&s
, ::std::ostream
* os
);
10937 inline void PrintTo(const ::std::wstring
& s
, ::std::ostream
* os
) {
10938 PrintWideStringTo(s
, os
);
10940 #endif // GTEST_HAS_STD_WSTRING
10943 // Overload for absl::string_view.
10944 inline void PrintTo(absl::string_view sp
, ::std::ostream
* os
) {
10945 PrintTo(::std::string(sp
), os
);
10947 #endif // GTEST_HAS_ABSL
10949 #if GTEST_LANG_CXX11
10950 inline void PrintTo(std::nullptr_t
, ::std::ostream
* os
) { *os
<< "(nullptr)"; }
10951 #endif // GTEST_LANG_CXX11
10953 #if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
10954 // Helper function for printing a tuple. T must be instantiated with
10956 template <typename T
>
10957 void PrintTupleTo(const T
& t
, ::std::ostream
* os
);
10958 #endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
10960 #if GTEST_HAS_TR1_TUPLE
10961 // Overload for ::std::tr1::tuple. Needed for printing function arguments,
10962 // which are packed as tuples.
10964 // Overloaded PrintTo() for tuples of various arities. We support
10965 // tuples of up-to 10 fields. The following implementation works
10966 // regardless of whether tr1::tuple is implemented using the
10967 // non-standard variadic template feature or not.
10969 inline void PrintTo(const ::std::tr1::tuple
<>& t
, ::std::ostream
* os
) {
10970 PrintTupleTo(t
, os
);
10973 template <typename T1
>
10974 void PrintTo(const ::std::tr1::tuple
<T1
>& t
, ::std::ostream
* os
) {
10975 PrintTupleTo(t
, os
);
10978 template <typename T1
, typename T2
>
10979 void PrintTo(const ::std::tr1::tuple
<T1
, T2
>& t
, ::std::ostream
* os
) {
10980 PrintTupleTo(t
, os
);
10983 template <typename T1
, typename T2
, typename T3
>
10984 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
>& t
, ::std::ostream
* os
) {
10985 PrintTupleTo(t
, os
);
10988 template <typename T1
, typename T2
, typename T3
, typename T4
>
10989 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
, T4
>& t
, ::std::ostream
* os
) {
10990 PrintTupleTo(t
, os
);
10993 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
10994 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
, T4
, T5
>& t
,
10995 ::std::ostream
* os
) {
10996 PrintTupleTo(t
, os
);
10999 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
11001 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
, T4
, T5
, T6
>& t
,
11002 ::std::ostream
* os
) {
11003 PrintTupleTo(t
, os
);
11006 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
11007 typename T6
, typename T7
>
11008 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>& t
,
11009 ::std::ostream
* os
) {
11010 PrintTupleTo(t
, os
);
11013 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
11014 typename T6
, typename T7
, typename T8
>
11015 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
>& t
,
11016 ::std::ostream
* os
) {
11017 PrintTupleTo(t
, os
);
11020 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
11021 typename T6
, typename T7
, typename T8
, typename T9
>
11022 void PrintTo(const ::std::tr1::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
>& t
,
11023 ::std::ostream
* os
) {
11024 PrintTupleTo(t
, os
);
11027 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
11028 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
11030 const ::std::tr1::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
>& t
,
11031 ::std::ostream
* os
) {
11032 PrintTupleTo(t
, os
);
11034 #endif // GTEST_HAS_TR1_TUPLE
11036 #if GTEST_HAS_STD_TUPLE_
11037 template <typename
... Types
>
11038 void PrintTo(const ::std::tuple
<Types
...>& t
, ::std::ostream
* os
) {
11039 PrintTupleTo(t
, os
);
11041 #endif // GTEST_HAS_STD_TUPLE_
11043 // Overload for std::pair.
11044 template <typename T1
, typename T2
>
11045 void PrintTo(const ::std::pair
<T1
, T2
>& value
, ::std::ostream
* os
) {
11047 // We cannot use UniversalPrint(value.first, os) here, as T1 may be
11048 // a reference type. The same for printing value.second.
11049 UniversalPrinter
<T1
>::Print(value
.first
, os
);
11051 UniversalPrinter
<T2
>::Print(value
.second
, os
);
11055 // Implements printing a non-reference type T by letting the compiler
11056 // pick the right overload of PrintTo() for T.
11057 template <typename T
>
11058 class UniversalPrinter
{
11060 // MSVC warns about adding const to a function type, so we want to
11061 // disable the warning.
11062 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
11064 // Note: we deliberately don't call this PrintTo(), as that name
11065 // conflicts with ::testing::internal::PrintTo in the body of the
11067 static void Print(const T
& value
, ::std::ostream
* os
) {
11068 // By default, ::testing::internal::PrintTo() is used for printing
11071 // Thanks to Koenig look-up, if T is a class and has its own
11072 // PrintTo() function defined in its namespace, that function will
11073 // be visible here. Since it is more specific than the generic ones
11074 // in ::testing::internal, it will be picked by the compiler in the
11075 // following statement - exactly what we want.
11076 PrintTo(value
, os
);
11079 GTEST_DISABLE_MSC_WARNINGS_POP_()
11084 // Printer for absl::optional
11086 template <typename T
>
11087 class UniversalPrinter
<::absl::optional
<T
>> {
11089 static void Print(const ::absl::optional
<T
>& value
, ::std::ostream
* os
) {
11094 UniversalPrint(*value
, os
);
11100 // Printer for absl::variant
11102 template <typename
... T
>
11103 class UniversalPrinter
<::absl::variant
<T
...>> {
11105 static void Print(const ::absl::variant
<T
...>& value
, ::std::ostream
* os
) {
11107 absl::visit(Visitor
{os
}, value
);
11113 template <typename U
>
11114 void operator()(const U
& u
) const {
11115 *os
<< "'" << GetTypeName
<U
>() << "' with value ";
11116 UniversalPrint(u
, os
);
11118 ::std::ostream
* os
;
11122 #endif // GTEST_HAS_ABSL
11124 // UniversalPrintArray(begin, len, os) prints an array of 'len'
11125 // elements, starting at address 'begin'.
11126 template <typename T
>
11127 void UniversalPrintArray(const T
* begin
, size_t len
, ::std::ostream
* os
) {
11132 const size_t kThreshold
= 18;
11133 const size_t kChunkSize
= 8;
11134 // If the array has more than kThreshold elements, we'll have to
11135 // omit some details by printing only the first and the last
11136 // kChunkSize elements.
11137 // FIXME: let the user control the threshold using a flag.
11138 if (len
<= kThreshold
) {
11139 PrintRawArrayTo(begin
, len
, os
);
11141 PrintRawArrayTo(begin
, kChunkSize
, os
);
11143 PrintRawArrayTo(begin
+ len
- kChunkSize
, kChunkSize
, os
);
11148 // This overload prints a (const) char array compactly.
11149 GTEST_API_
void UniversalPrintArray(
11150 const char* begin
, size_t len
, ::std::ostream
* os
);
11152 // This overload prints a (const) wchar_t array compactly.
11153 GTEST_API_
void UniversalPrintArray(
11154 const wchar_t* begin
, size_t len
, ::std::ostream
* os
);
11156 // Implements printing an array type T[N].
11157 template <typename T
, size_t N
>
11158 class UniversalPrinter
<T
[N
]> {
11160 // Prints the given array, omitting some elements when there are too
11162 static void Print(const T (&a
)[N
], ::std::ostream
* os
) {
11163 UniversalPrintArray(a
, N
, os
);
11167 // Implements printing a reference type T&.
11168 template <typename T
>
11169 class UniversalPrinter
<T
&> {
11171 // MSVC warns about adding const to a function type, so we want to
11172 // disable the warning.
11173 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
11175 static void Print(const T
& value
, ::std::ostream
* os
) {
11176 // Prints the address of the value. We use reinterpret_cast here
11177 // as static_cast doesn't compile when T is a function type.
11178 *os
<< "@" << reinterpret_cast<const void*>(&value
) << " ";
11180 // Then prints the value itself.
11181 UniversalPrint(value
, os
);
11184 GTEST_DISABLE_MSC_WARNINGS_POP_()
11187 // Prints a value tersely: for a reference type, the referenced value
11188 // (but not the address) is printed; for a (const) char pointer, the
11189 // NUL-terminated string (but not the pointer) is printed.
11191 template <typename T
>
11192 class UniversalTersePrinter
{
11194 static void Print(const T
& value
, ::std::ostream
* os
) {
11195 UniversalPrint(value
, os
);
11198 template <typename T
>
11199 class UniversalTersePrinter
<T
&> {
11201 static void Print(const T
& value
, ::std::ostream
* os
) {
11202 UniversalPrint(value
, os
);
11205 template <typename T
, size_t N
>
11206 class UniversalTersePrinter
<T
[N
]> {
11208 static void Print(const T (&value
)[N
], ::std::ostream
* os
) {
11209 UniversalPrinter
<T
[N
]>::Print(value
, os
);
11213 class UniversalTersePrinter
<const char*> {
11215 static void Print(const char* str
, ::std::ostream
* os
) {
11219 UniversalPrint(std::string(str
), os
);
11224 class UniversalTersePrinter
<char*> {
11226 static void Print(char* str
, ::std::ostream
* os
) {
11227 UniversalTersePrinter
<const char*>::Print(str
, os
);
11231 #if GTEST_HAS_STD_WSTRING
11233 class UniversalTersePrinter
<const wchar_t*> {
11235 static void Print(const wchar_t* str
, ::std::ostream
* os
) {
11239 UniversalPrint(::std::wstring(str
), os
);
11246 class UniversalTersePrinter
<wchar_t*> {
11248 static void Print(wchar_t* str
, ::std::ostream
* os
) {
11249 UniversalTersePrinter
<const wchar_t*>::Print(str
, os
);
11253 template <typename T
>
11254 void UniversalTersePrint(const T
& value
, ::std::ostream
* os
) {
11255 UniversalTersePrinter
<T
>::Print(value
, os
);
11258 // Prints a value using the type inferred by the compiler. The
11259 // difference between this and UniversalTersePrint() is that for a
11260 // (const) char pointer, this prints both the pointer and the
11261 // NUL-terminated string.
11262 template <typename T
>
11263 void UniversalPrint(const T
& value
, ::std::ostream
* os
) {
11264 // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
11265 // UniversalPrinter with T directly.
11267 UniversalPrinter
<T1
>::Print(value
, os
);
11270 typedef ::std::vector
< ::std::string
> Strings
;
11272 // TuplePolicy<TupleT> must provide:
11274 // size of tuple TupleT.
11275 // - get<size_t I>(const TupleT& t)
11276 // static function extracting element I of tuple TupleT.
11277 // - tuple_element<size_t I>::type
11278 // type of element I of tuple TupleT.
11279 template <typename TupleT
>
11280 struct TuplePolicy
;
11282 #if GTEST_HAS_TR1_TUPLE
11283 template <typename TupleT
>
11284 struct TuplePolicy
{
11285 typedef TupleT Tuple
;
11286 static const size_t tuple_size
= ::std::tr1::tuple_size
<Tuple
>::value
;
11288 template <size_t I
>
11289 struct tuple_element
: ::std::tr1::tuple_element
<static_cast<int>(I
), Tuple
> {
11292 template <size_t I
>
11293 static typename AddReference
<const typename ::std::tr1::tuple_element
<
11294 static_cast<int>(I
), Tuple
>::type
>::type
11295 get(const Tuple
& tuple
) {
11296 return ::std::tr1::get
<I
>(tuple
);
11299 template <typename TupleT
>
11300 const size_t TuplePolicy
<TupleT
>::tuple_size
;
11301 #endif // GTEST_HAS_TR1_TUPLE
11303 #if GTEST_HAS_STD_TUPLE_
11304 template <typename
... Types
>
11305 struct TuplePolicy
< ::std::tuple
<Types
...> > {
11306 typedef ::std::tuple
<Types
...> Tuple
;
11307 static const size_t tuple_size
= ::std::tuple_size
<Tuple
>::value
;
11309 template <size_t I
>
11310 struct tuple_element
: ::std::tuple_element
<I
, Tuple
> {};
11312 template <size_t I
>
11313 static const typename ::std::tuple_element
<I
, Tuple
>::type
& get(
11314 const Tuple
& tuple
) {
11315 return ::std::get
<I
>(tuple
);
11318 template <typename
... Types
>
11319 const size_t TuplePolicy
< ::std::tuple
<Types
...> >::tuple_size
;
11320 #endif // GTEST_HAS_STD_TUPLE_
11322 #if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
11323 // This helper template allows PrintTo() for tuples and
11324 // UniversalTersePrintTupleFieldsToStrings() to be defined by
11325 // induction on the number of tuple fields. The idea is that
11326 // TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
11327 // fields in tuple t, and can be defined in terms of
11328 // TuplePrefixPrinter<N - 1>.
11330 // The inductive case.
11331 template <size_t N
>
11332 struct TuplePrefixPrinter
{
11333 // Prints the first N fields of a tuple.
11334 template <typename Tuple
>
11335 static void PrintPrefixTo(const Tuple
& t
, ::std::ostream
* os
) {
11336 TuplePrefixPrinter
<N
- 1>::PrintPrefixTo(t
, os
);
11337 GTEST_INTENTIONAL_CONST_COND_PUSH_()
11339 GTEST_INTENTIONAL_CONST_COND_POP_()
11343 typename TuplePolicy
<Tuple
>::template tuple_element
<N
- 1>::type
>
11344 ::Print(TuplePolicy
<Tuple
>::template get
<N
- 1>(t
), os
);
11347 // Tersely prints the first N fields of a tuple to a string vector,
11348 // one element for each field.
11349 template <typename Tuple
>
11350 static void TersePrintPrefixToStrings(const Tuple
& t
, Strings
* strings
) {
11351 TuplePrefixPrinter
<N
- 1>::TersePrintPrefixToStrings(t
, strings
);
11352 ::std::stringstream ss
;
11353 UniversalTersePrint(TuplePolicy
<Tuple
>::template get
<N
- 1>(t
), &ss
);
11354 strings
->push_back(ss
.str());
11360 struct TuplePrefixPrinter
<0> {
11361 template <typename Tuple
>
11362 static void PrintPrefixTo(const Tuple
&, ::std::ostream
*) {}
11364 template <typename Tuple
>
11365 static void TersePrintPrefixToStrings(const Tuple
&, Strings
*) {}
11368 // Helper function for printing a tuple.
11369 // Tuple must be either std::tr1::tuple or std::tuple type.
11370 template <typename Tuple
>
11371 void PrintTupleTo(const Tuple
& t
, ::std::ostream
* os
) {
11373 TuplePrefixPrinter
<TuplePolicy
<Tuple
>::tuple_size
>::PrintPrefixTo(t
, os
);
11377 // Prints the fields of a tuple tersely to a string vector, one
11378 // element for each field. See the comment before
11379 // UniversalTersePrint() for how we define "tersely".
11380 template <typename Tuple
>
11381 Strings
UniversalTersePrintTupleFieldsToStrings(const Tuple
& value
) {
11383 TuplePrefixPrinter
<TuplePolicy
<Tuple
>::tuple_size
>::
11384 TersePrintPrefixToStrings(value
, &result
);
11387 #endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
11389 } // namespace internal
11392 namespace internal2
{
11393 template <typename T
>
11394 void TypeWithoutFormatter
<T
, kConvertibleToStringView
>::PrintValue(
11395 const T
& value
, ::std::ostream
* os
) {
11396 internal::PrintTo(absl::string_view(value
), os
);
11398 } // namespace internal2
11401 template <typename T
>
11402 ::std::string
PrintToString(const T
& value
) {
11403 ::std::stringstream ss
;
11404 internal::UniversalTersePrinter
<T
>::Print(value
, &ss
);
11408 } // namespace testing
11410 // Include any custom printer added by the local installation.
11411 // We must include this header at the end to make sure it can use the
11412 // declarations from this file.
11413 // Copyright 2015, Google Inc.
11414 // All rights reserved.
11416 // Redistribution and use in source and binary forms, with or without
11417 // modification, are permitted provided that the following conditions are
11420 // * Redistributions of source code must retain the above copyright
11421 // notice, this list of conditions and the following disclaimer.
11422 // * Redistributions in binary form must reproduce the above
11423 // copyright notice, this list of conditions and the following disclaimer
11424 // in the documentation and/or other materials provided with the
11426 // * Neither the name of Google Inc. nor the names of its
11427 // contributors may be used to endorse or promote products derived from
11428 // this software without specific prior written permission.
11430 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
11431 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11432 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
11433 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
11434 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
11435 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11436 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
11437 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11438 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
11439 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
11440 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11442 // This file provides an injection point for custom printers in a local
11443 // installation of gTest.
11444 // It will be included from gtest-printers.h and the overrides in this file
11445 // will be visible to everyone.
11447 // Injection point for custom user configurations. See README for details
11449 // ** Custom implementation starts here **
11451 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
11452 #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
11454 #endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
11456 #endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
11458 namespace testing
{
11460 // Input to a parameterized test name generator, describing a test parameter.
11461 // Consists of the parameter value and the integer parameter index.
11462 template <class ParamType
>
11463 struct TestParamInfo
{
11464 TestParamInfo(const ParamType
& a_param
, size_t an_index
) :
11471 // A builtin parameterized test name generator which returns the result of
11472 // testing::PrintToString.
11473 struct PrintToStringParamName
{
11474 template <class ParamType
>
11475 std::string
operator()(const TestParamInfo
<ParamType
>& info
) const {
11476 return PrintToString(info
.param
);
11480 namespace internal
{
11482 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11484 // Outputs a message explaining invalid registration of different
11485 // fixture class for the same test case. This may happen when
11486 // TEST_P macro is used to define two tests with the same name
11487 // but in different namespaces.
11488 GTEST_API_
void ReportInvalidTestCaseType(const char* test_case_name
,
11489 CodeLocation code_location
);
11491 template <typename
> class ParamGeneratorInterface
;
11492 template <typename
> class ParamGenerator
;
11494 // Interface for iterating over elements provided by an implementation
11495 // of ParamGeneratorInterface<T>.
11496 template <typename T
>
11497 class ParamIteratorInterface
{
11499 virtual ~ParamIteratorInterface() {}
11500 // A pointer to the base generator instance.
11501 // Used only for the purposes of iterator comparison
11502 // to make sure that two iterators belong to the same generator.
11503 virtual const ParamGeneratorInterface
<T
>* BaseGenerator() const = 0;
11504 // Advances iterator to point to the next element
11505 // provided by the generator. The caller is responsible
11506 // for not calling Advance() on an iterator equal to
11507 // BaseGenerator()->End().
11508 virtual void Advance() = 0;
11509 // Clones the iterator object. Used for implementing copy semantics
11510 // of ParamIterator<T>.
11511 virtual ParamIteratorInterface
* Clone() const = 0;
11512 // Dereferences the current iterator and provides (read-only) access
11513 // to the pointed value. It is the caller's responsibility not to call
11514 // Current() on an iterator equal to BaseGenerator()->End().
11515 // Used for implementing ParamGenerator<T>::operator*().
11516 virtual const T
* Current() const = 0;
11517 // Determines whether the given iterator and other point to the same
11518 // element in the sequence generated by the generator.
11519 // Used for implementing ParamGenerator<T>::operator==().
11520 virtual bool Equals(const ParamIteratorInterface
& other
) const = 0;
11523 // Class iterating over elements provided by an implementation of
11524 // ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
11525 // and implements the const forward iterator concept.
11526 template <typename T
>
11527 class ParamIterator
{
11529 typedef T value_type
;
11530 typedef const T
& reference
;
11531 typedef ptrdiff_t difference_type
;
11533 // ParamIterator assumes ownership of the impl_ pointer.
11534 ParamIterator(const ParamIterator
& other
) : impl_(other
.impl_
->Clone()) {}
11535 ParamIterator
& operator=(const ParamIterator
& other
) {
11536 if (this != &other
)
11537 impl_
.reset(other
.impl_
->Clone());
11541 const T
& operator*() const { return *impl_
->Current(); }
11542 const T
* operator->() const { return impl_
->Current(); }
11543 // Prefix version of operator++.
11544 ParamIterator
& operator++() {
11548 // Postfix version of operator++.
11549 ParamIterator
operator++(int /*unused*/) {
11550 ParamIteratorInterface
<T
>* clone
= impl_
->Clone();
11552 return ParamIterator(clone
);
11554 bool operator==(const ParamIterator
& other
) const {
11555 return impl_
.get() == other
.impl_
.get() || impl_
->Equals(*other
.impl_
);
11557 bool operator!=(const ParamIterator
& other
) const {
11558 return !(*this == other
);
11562 friend class ParamGenerator
<T
>;
11563 explicit ParamIterator(ParamIteratorInterface
<T
>* impl
) : impl_(impl
) {}
11564 scoped_ptr
<ParamIteratorInterface
<T
> > impl_
;
11567 // ParamGeneratorInterface<T> is the binary interface to access generators
11568 // defined in other translation units.
11569 template <typename T
>
11570 class ParamGeneratorInterface
{
11572 typedef T ParamType
;
11574 virtual ~ParamGeneratorInterface() {}
11576 // Generator interface definition
11577 virtual ParamIteratorInterface
<T
>* Begin() const = 0;
11578 virtual ParamIteratorInterface
<T
>* End() const = 0;
11581 // Wraps ParamGeneratorInterface<T> and provides general generator syntax
11582 // compatible with the STL Container concept.
11583 // This class implements copy initialization semantics and the contained
11584 // ParamGeneratorInterface<T> instance is shared among all copies
11585 // of the original object. This is possible because that instance is immutable.
11586 template<typename T
>
11587 class ParamGenerator
{
11589 typedef ParamIterator
<T
> iterator
;
11591 explicit ParamGenerator(ParamGeneratorInterface
<T
>* impl
) : impl_(impl
) {}
11592 ParamGenerator(const ParamGenerator
& other
) : impl_(other
.impl_
) {}
11594 ParamGenerator
& operator=(const ParamGenerator
& other
) {
11595 impl_
= other
.impl_
;
11599 iterator
begin() const { return iterator(impl_
->Begin()); }
11600 iterator
end() const { return iterator(impl_
->End()); }
11603 linked_ptr
<const ParamGeneratorInterface
<T
> > impl_
;
11606 // Generates values from a range of two comparable values. Can be used to
11607 // generate sequences of user-defined types that implement operator+() and
11609 // This class is used in the Range() function.
11610 template <typename T
, typename IncrementT
>
11611 class RangeGenerator
: public ParamGeneratorInterface
<T
> {
11613 RangeGenerator(T begin
, T end
, IncrementT step
)
11614 : begin_(begin
), end_(end
),
11615 step_(step
), end_index_(CalculateEndIndex(begin
, end
, step
)) {}
11616 virtual ~RangeGenerator() {}
11618 virtual ParamIteratorInterface
<T
>* Begin() const {
11619 return new Iterator(this, begin_
, 0, step_
);
11621 virtual ParamIteratorInterface
<T
>* End() const {
11622 return new Iterator(this, end_
, end_index_
, step_
);
11626 class Iterator
: public ParamIteratorInterface
<T
> {
11628 Iterator(const ParamGeneratorInterface
<T
>* base
, T value
, int index
,
11630 : base_(base
), value_(value
), index_(index
), step_(step
) {}
11631 virtual ~Iterator() {}
11633 virtual const ParamGeneratorInterface
<T
>* BaseGenerator() const {
11636 virtual void Advance() {
11637 value_
= static_cast<T
>(value_
+ step_
);
11640 virtual ParamIteratorInterface
<T
>* Clone() const {
11641 return new Iterator(*this);
11643 virtual const T
* Current() const { return &value_
; }
11644 virtual bool Equals(const ParamIteratorInterface
<T
>& other
) const {
11645 // Having the same base generator guarantees that the other
11646 // iterator is of the same type and we can downcast.
11647 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
11648 << "The program attempted to compare iterators "
11649 << "from different generators." << std::endl
;
11650 const int other_index
=
11651 CheckedDowncastToActualType
<const Iterator
>(&other
)->index_
;
11652 return index_
== other_index
;
11656 Iterator(const Iterator
& other
)
11657 : ParamIteratorInterface
<T
>(),
11658 base_(other
.base_
), value_(other
.value_
), index_(other
.index_
),
11659 step_(other
.step_
) {}
11661 // No implementation - assignment is unsupported.
11662 void operator=(const Iterator
& other
);
11664 const ParamGeneratorInterface
<T
>* const base_
;
11667 const IncrementT step_
;
11668 }; // class RangeGenerator::Iterator
11670 static int CalculateEndIndex(const T
& begin
,
11672 const IncrementT
& step
) {
11674 for (T i
= begin
; i
< end
; i
= static_cast<T
>(i
+ step
))
11679 // No implementation - assignment is unsupported.
11680 void operator=(const RangeGenerator
& other
);
11684 const IncrementT step_
;
11685 // The index for the end() iterator. All the elements in the generated
11686 // sequence are indexed (0-based) to aid iterator comparison.
11687 const int end_index_
;
11688 }; // class RangeGenerator
11691 // Generates values from a pair of STL-style iterators. Used in the
11692 // ValuesIn() function. The elements are copied from the source range
11693 // since the source can be located on the stack, and the generator
11694 // is likely to persist beyond that stack frame.
11695 template <typename T
>
11696 class ValuesInIteratorRangeGenerator
: public ParamGeneratorInterface
<T
> {
11698 template <typename ForwardIterator
>
11699 ValuesInIteratorRangeGenerator(ForwardIterator begin
, ForwardIterator end
)
11700 : container_(begin
, end
) {}
11701 virtual ~ValuesInIteratorRangeGenerator() {}
11703 virtual ParamIteratorInterface
<T
>* Begin() const {
11704 return new Iterator(this, container_
.begin());
11706 virtual ParamIteratorInterface
<T
>* End() const {
11707 return new Iterator(this, container_
.end());
11711 typedef typename ::std::vector
<T
> ContainerType
;
11713 class Iterator
: public ParamIteratorInterface
<T
> {
11715 Iterator(const ParamGeneratorInterface
<T
>* base
,
11716 typename
ContainerType::const_iterator iterator
)
11717 : base_(base
), iterator_(iterator
) {}
11718 virtual ~Iterator() {}
11720 virtual const ParamGeneratorInterface
<T
>* BaseGenerator() const {
11723 virtual void Advance() {
11727 virtual ParamIteratorInterface
<T
>* Clone() const {
11728 return new Iterator(*this);
11730 // We need to use cached value referenced by iterator_ because *iterator_
11731 // can return a temporary object (and of type other then T), so just
11732 // having "return &*iterator_;" doesn't work.
11733 // value_ is updated here and not in Advance() because Advance()
11734 // can advance iterator_ beyond the end of the range, and we cannot
11735 // detect that fact. The client code, on the other hand, is
11736 // responsible for not calling Current() on an out-of-range iterator.
11737 virtual const T
* Current() const {
11738 if (value_
.get() == NULL
)
11739 value_
.reset(new T(*iterator_
));
11740 return value_
.get();
11742 virtual bool Equals(const ParamIteratorInterface
<T
>& other
) const {
11743 // Having the same base generator guarantees that the other
11744 // iterator is of the same type and we can downcast.
11745 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
11746 << "The program attempted to compare iterators "
11747 << "from different generators." << std::endl
;
11748 return iterator_
==
11749 CheckedDowncastToActualType
<const Iterator
>(&other
)->iterator_
;
11753 Iterator(const Iterator
& other
)
11754 // The explicit constructor call suppresses a false warning
11755 // emitted by gcc when supplied with the -Wextra option.
11756 : ParamIteratorInterface
<T
>(),
11757 base_(other
.base_
),
11758 iterator_(other
.iterator_
) {}
11760 const ParamGeneratorInterface
<T
>* const base_
;
11761 typename
ContainerType::const_iterator iterator_
;
11762 // A cached value of *iterator_. We keep it here to allow access by
11763 // pointer in the wrapping iterator's operator->().
11764 // value_ needs to be mutable to be accessed in Current().
11765 // Use of scoped_ptr helps manage cached value's lifetime,
11766 // which is bound by the lifespan of the iterator itself.
11767 mutable scoped_ptr
<const T
> value_
;
11768 }; // class ValuesInIteratorRangeGenerator::Iterator
11770 // No implementation - assignment is unsupported.
11771 void operator=(const ValuesInIteratorRangeGenerator
& other
);
11773 const ContainerType container_
;
11774 }; // class ValuesInIteratorRangeGenerator
11776 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11778 // Default parameterized test name generator, returns a string containing the
11779 // integer test parameter index.
11780 template <class ParamType
>
11781 std::string
DefaultParamName(const TestParamInfo
<ParamType
>& info
) {
11782 Message name_stream
;
11783 name_stream
<< info
.index
;
11784 return name_stream
.GetString();
11787 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11789 // Parameterized test name overload helpers, which help the
11790 // INSTANTIATE_TEST_CASE_P macro choose between the default parameterized
11791 // test name generator and user param name generator.
11792 template <class ParamType
, class ParamNameGenFunctor
>
11793 ParamNameGenFunctor
GetParamNameGen(ParamNameGenFunctor func
) {
11797 template <class ParamType
>
11798 struct ParamNameGenFunc
{
11799 typedef std::string
Type(const TestParamInfo
<ParamType
>&);
11802 template <class ParamType
>
11803 typename ParamNameGenFunc
<ParamType
>::Type
*GetParamNameGen() {
11804 return DefaultParamName
;
11807 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11809 // Stores a parameter value and later creates tests parameterized with that
11811 template <class TestClass
>
11812 class ParameterizedTestFactory
: public TestFactoryBase
{
11814 typedef typename
TestClass::ParamType ParamType
;
11815 explicit ParameterizedTestFactory(ParamType parameter
) :
11816 parameter_(parameter
) {}
11817 virtual Test
* CreateTest() {
11818 TestClass::SetParam(¶meter_
);
11819 return new TestClass();
11823 const ParamType parameter_
;
11825 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory
);
11828 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11830 // TestMetaFactoryBase is a base class for meta-factories that create
11831 // test factories for passing into MakeAndRegisterTestInfo function.
11832 template <class ParamType
>
11833 class TestMetaFactoryBase
{
11835 virtual ~TestMetaFactoryBase() {}
11837 virtual TestFactoryBase
* CreateTestFactory(ParamType parameter
) = 0;
11840 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11842 // TestMetaFactory creates test factories for passing into
11843 // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
11844 // ownership of test factory pointer, same factory object cannot be passed
11845 // into that method twice. But ParameterizedTestCaseInfo is going to call
11846 // it for each Test/Parameter value combination. Thus it needs meta factory
11848 template <class TestCase
>
11849 class TestMetaFactory
11850 : public TestMetaFactoryBase
<typename
TestCase::ParamType
> {
11852 typedef typename
TestCase::ParamType ParamType
;
11854 TestMetaFactory() {}
11856 virtual TestFactoryBase
* CreateTestFactory(ParamType parameter
) {
11857 return new ParameterizedTestFactory
<TestCase
>(parameter
);
11861 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory
);
11864 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11866 // ParameterizedTestCaseInfoBase is a generic interface
11867 // to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
11868 // accumulates test information provided by TEST_P macro invocations
11869 // and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
11870 // and uses that information to register all resulting test instances
11871 // in RegisterTests method. The ParameterizeTestCaseRegistry class holds
11872 // a collection of pointers to the ParameterizedTestCaseInfo objects
11873 // and calls RegisterTests() on each of them when asked.
11874 class ParameterizedTestCaseInfoBase
{
11876 virtual ~ParameterizedTestCaseInfoBase() {}
11878 // Base part of test case name for display purposes.
11879 virtual const std::string
& GetTestCaseName() const = 0;
11880 // Test case id to verify identity.
11881 virtual TypeId
GetTestCaseTypeId() const = 0;
11882 // UnitTest class invokes this method to register tests in this
11883 // test case right before running them in RUN_ALL_TESTS macro.
11884 // This method should not be called more then once on any single
11885 // instance of a ParameterizedTestCaseInfoBase derived class.
11886 virtual void RegisterTests() = 0;
11889 ParameterizedTestCaseInfoBase() {}
11892 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase
);
11895 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
11897 // ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
11898 // macro invocations for a particular test case and generators
11899 // obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
11900 // test case. It registers tests with all values generated by all
11901 // generators when asked.
11902 template <class TestCase
>
11903 class ParameterizedTestCaseInfo
: public ParameterizedTestCaseInfoBase
{
11905 // ParamType and GeneratorCreationFunc are private types but are required
11906 // for declarations of public methods AddTestPattern() and
11907 // AddTestCaseInstantiation().
11908 typedef typename
TestCase::ParamType ParamType
;
11909 // A function that returns an instance of appropriate generator type.
11910 typedef ParamGenerator
<ParamType
>(GeneratorCreationFunc
)();
11911 typedef typename ParamNameGenFunc
<ParamType
>::Type ParamNameGeneratorFunc
;
11913 explicit ParameterizedTestCaseInfo(
11914 const char* name
, CodeLocation code_location
)
11915 : test_case_name_(name
), code_location_(code_location
) {}
11917 // Test case base name for display purposes.
11918 virtual const std::string
& GetTestCaseName() const { return test_case_name_
; }
11919 // Test case id to verify identity.
11920 virtual TypeId
GetTestCaseTypeId() const { return GetTypeId
<TestCase
>(); }
11921 // TEST_P macro uses AddTestPattern() to record information
11922 // about a single test in a LocalTestInfo structure.
11923 // test_case_name is the base name of the test case (without invocation
11924 // prefix). test_base_name is the name of an individual test without
11925 // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
11926 // test case base name and DoBar is test base name.
11927 void AddTestPattern(const char* test_case_name
,
11928 const char* test_base_name
,
11929 TestMetaFactoryBase
<ParamType
>* meta_factory
) {
11930 tests_
.push_back(linked_ptr
<TestInfo
>(new TestInfo(test_case_name
,
11934 // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
11935 // about a generator.
11936 int AddTestCaseInstantiation(const std::string
& instantiation_name
,
11937 GeneratorCreationFunc
* func
,
11938 ParamNameGeneratorFunc
* name_func
,
11939 const char* file
, int line
) {
11940 instantiations_
.push_back(
11941 InstantiationInfo(instantiation_name
, func
, name_func
, file
, line
));
11942 return 0; // Return value used only to run this method in namespace scope.
11944 // UnitTest class invokes this method to register tests in this test case
11945 // test cases right before running tests in RUN_ALL_TESTS macro.
11946 // This method should not be called more then once on any single
11947 // instance of a ParameterizedTestCaseInfoBase derived class.
11948 // UnitTest has a guard to prevent from calling this method more then once.
11949 virtual void RegisterTests() {
11950 for (typename
TestInfoContainer::iterator test_it
= tests_
.begin();
11951 test_it
!= tests_
.end(); ++test_it
) {
11952 linked_ptr
<TestInfo
> test_info
= *test_it
;
11953 for (typename
InstantiationContainer::iterator gen_it
=
11954 instantiations_
.begin(); gen_it
!= instantiations_
.end();
11956 const std::string
& instantiation_name
= gen_it
->name
;
11957 ParamGenerator
<ParamType
> generator((*gen_it
->generator
)());
11958 ParamNameGeneratorFunc
* name_func
= gen_it
->name_func
;
11959 const char* file
= gen_it
->file
;
11960 int line
= gen_it
->line
;
11962 std::string test_case_name
;
11963 if ( !instantiation_name
.empty() )
11964 test_case_name
= instantiation_name
+ "/";
11965 test_case_name
+= test_info
->test_case_base_name
;
11968 std::set
<std::string
> test_param_names
;
11969 for (typename ParamGenerator
<ParamType
>::iterator param_it
=
11971 param_it
!= generator
.end(); ++param_it
, ++i
) {
11972 Message test_name_stream
;
11974 std::string param_name
= name_func(
11975 TestParamInfo
<ParamType
>(*param_it
, i
));
11977 GTEST_CHECK_(IsValidParamName(param_name
))
11978 << "Parameterized test name '" << param_name
11979 << "' is invalid, in " << file
11980 << " line " << line
<< std::endl
;
11982 GTEST_CHECK_(test_param_names
.count(param_name
) == 0)
11983 << "Duplicate parameterized test name '" << param_name
11984 << "', in " << file
<< " line " << line
<< std::endl
;
11986 test_param_names
.insert(param_name
);
11988 test_name_stream
<< test_info
->test_base_name
<< "/" << param_name
;
11989 MakeAndRegisterTestInfo(
11990 test_case_name
.c_str(),
11991 test_name_stream
.GetString().c_str(),
11992 NULL
, // No type parameter.
11993 PrintToString(*param_it
).c_str(),
11995 GetTestCaseTypeId(),
11996 TestCase::SetUpTestCase
,
11997 TestCase::TearDownTestCase
,
11998 test_info
->test_meta_factory
->CreateTestFactory(*param_it
));
12005 // LocalTestInfo structure keeps information about a single test registered
12006 // with TEST_P macro.
12008 TestInfo(const char* a_test_case_base_name
,
12009 const char* a_test_base_name
,
12010 TestMetaFactoryBase
<ParamType
>* a_test_meta_factory
) :
12011 test_case_base_name(a_test_case_base_name
),
12012 test_base_name(a_test_base_name
),
12013 test_meta_factory(a_test_meta_factory
) {}
12015 const std::string test_case_base_name
;
12016 const std::string test_base_name
;
12017 const scoped_ptr
<TestMetaFactoryBase
<ParamType
> > test_meta_factory
;
12019 typedef ::std::vector
<linked_ptr
<TestInfo
> > TestInfoContainer
;
12020 // Records data received from INSTANTIATE_TEST_CASE_P macros:
12021 // <Instantiation name, Sequence generator creation function,
12022 // Name generator function, Source file, Source line>
12023 struct InstantiationInfo
{
12024 InstantiationInfo(const std::string
&name_in
,
12025 GeneratorCreationFunc
* generator_in
,
12026 ParamNameGeneratorFunc
* name_func_in
,
12027 const char* file_in
,
12030 generator(generator_in
),
12031 name_func(name_func_in
),
12036 GeneratorCreationFunc
* generator
;
12037 ParamNameGeneratorFunc
* name_func
;
12041 typedef ::std::vector
<InstantiationInfo
> InstantiationContainer
;
12043 static bool IsValidParamName(const std::string
& name
) {
12044 // Check for empty string
12048 // Check for invalid characters
12049 for (std::string::size_type index
= 0; index
< name
.size(); ++index
) {
12050 if (!isalnum(name
[index
]) && name
[index
] != '_')
12057 const std::string test_case_name_
;
12058 CodeLocation code_location_
;
12059 TestInfoContainer tests_
;
12060 InstantiationContainer instantiations_
;
12062 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo
);
12063 }; // class ParameterizedTestCaseInfo
12065 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
12067 // ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
12068 // classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
12069 // macros use it to locate their corresponding ParameterizedTestCaseInfo
12071 class ParameterizedTestCaseRegistry
{
12073 ParameterizedTestCaseRegistry() {}
12074 ~ParameterizedTestCaseRegistry() {
12075 for (TestCaseInfoContainer::iterator it
= test_case_infos_
.begin();
12076 it
!= test_case_infos_
.end(); ++it
) {
12081 // Looks up or creates and returns a structure containing information about
12082 // tests and instantiations of a particular test case.
12083 template <class TestCase
>
12084 ParameterizedTestCaseInfo
<TestCase
>* GetTestCasePatternHolder(
12085 const char* test_case_name
,
12086 CodeLocation code_location
) {
12087 ParameterizedTestCaseInfo
<TestCase
>* typed_test_info
= NULL
;
12088 for (TestCaseInfoContainer::iterator it
= test_case_infos_
.begin();
12089 it
!= test_case_infos_
.end(); ++it
) {
12090 if ((*it
)->GetTestCaseName() == test_case_name
) {
12091 if ((*it
)->GetTestCaseTypeId() != GetTypeId
<TestCase
>()) {
12092 // Complain about incorrect usage of Google Test facilities
12093 // and terminate the program since we cannot guaranty correct
12094 // test case setup and tear-down in this case.
12095 ReportInvalidTestCaseType(test_case_name
, code_location
);
12098 // At this point we are sure that the object we found is of the same
12099 // type we are looking for, so we downcast it to that type
12100 // without further checks.
12101 typed_test_info
= CheckedDowncastToActualType
<
12102 ParameterizedTestCaseInfo
<TestCase
> >(*it
);
12107 if (typed_test_info
== NULL
) {
12108 typed_test_info
= new ParameterizedTestCaseInfo
<TestCase
>(
12109 test_case_name
, code_location
);
12110 test_case_infos_
.push_back(typed_test_info
);
12112 return typed_test_info
;
12114 void RegisterTests() {
12115 for (TestCaseInfoContainer::iterator it
= test_case_infos_
.begin();
12116 it
!= test_case_infos_
.end(); ++it
) {
12117 (*it
)->RegisterTests();
12122 typedef ::std::vector
<ParameterizedTestCaseInfoBase
*> TestCaseInfoContainer
;
12124 TestCaseInfoContainer test_case_infos_
;
12126 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry
);
12129 } // namespace internal
12130 } // namespace testing
12132 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
12133 // This file was GENERATED by command:
12134 // pump.py gtest-param-util-generated.h.pump
12135 // DO NOT EDIT BY HAND!!!
12137 // Copyright 2008 Google Inc.
12138 // All Rights Reserved.
12140 // Redistribution and use in source and binary forms, with or without
12141 // modification, are permitted provided that the following conditions are
12144 // * Redistributions of source code must retain the above copyright
12145 // notice, this list of conditions and the following disclaimer.
12146 // * Redistributions in binary form must reproduce the above
12147 // copyright notice, this list of conditions and the following disclaimer
12148 // in the documentation and/or other materials provided with the
12150 // * Neither the name of Google Inc. nor the names of its
12151 // contributors may be used to endorse or promote products derived from
12152 // this software without specific prior written permission.
12154 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12155 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12156 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12157 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12158 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12159 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12160 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12161 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12162 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12163 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12164 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12167 // Type and function utilities for implementing parameterized tests.
12168 // This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
12170 // Currently Google Test supports at most 50 arguments in Values,
12171 // and at most 10 arguments in Combine. Please contact
12172 // googletestframework@googlegroups.com if you need more.
12173 // Please note that the number of arguments to Combine is limited
12174 // by the maximum arity of the implementation of tuple which is
12175 // currently set at 10.
12177 // GOOGLETEST_CM0001 DO NOT DELETE
12179 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
12180 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
12183 namespace testing
{
12185 // Forward declarations of ValuesIn(), which is implemented in
12186 // include/gtest/gtest-param-test.h.
12187 template <typename ForwardIterator
>
12188 internal::ParamGenerator
<
12189 typename ::testing::internal::IteratorTraits
<ForwardIterator
>::value_type
>
12190 ValuesIn(ForwardIterator begin
, ForwardIterator end
);
12192 template <typename T
, size_t N
>
12193 internal::ParamGenerator
<T
> ValuesIn(const T (&array
)[N
]);
12195 template <class Container
>
12196 internal::ParamGenerator
<typename
Container::value_type
> ValuesIn(
12197 const Container
& container
);
12199 namespace internal
{
12201 // Used in the Values() function to provide polymorphic capabilities.
12202 template <typename T1
>
12203 class ValueArray1
{
12205 explicit ValueArray1(T1 v1
) : v1_(v1
) {}
12207 template <typename T
>
12208 operator ParamGenerator
<T
>() const {
12209 const T array
[] = {static_cast<T
>(v1_
)};
12210 return ValuesIn(array
);
12213 ValueArray1(const ValueArray1
& other
) : v1_(other
.v1_
) {}
12216 // No implementation - assignment is unsupported.
12217 void operator=(const ValueArray1
& other
);
12222 template <typename T1
, typename T2
>
12223 class ValueArray2
{
12225 ValueArray2(T1 v1
, T2 v2
) : v1_(v1
), v2_(v2
) {}
12227 template <typename T
>
12228 operator ParamGenerator
<T
>() const {
12229 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
)};
12230 return ValuesIn(array
);
12233 ValueArray2(const ValueArray2
& other
) : v1_(other
.v1_
), v2_(other
.v2_
) {}
12236 // No implementation - assignment is unsupported.
12237 void operator=(const ValueArray2
& other
);
12243 template <typename T1
, typename T2
, typename T3
>
12244 class ValueArray3
{
12246 ValueArray3(T1 v1
, T2 v2
, T3 v3
) : v1_(v1
), v2_(v2
), v3_(v3
) {}
12248 template <typename T
>
12249 operator ParamGenerator
<T
>() const {
12250 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12251 static_cast<T
>(v3_
)};
12252 return ValuesIn(array
);
12255 ValueArray3(const ValueArray3
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12259 // No implementation - assignment is unsupported.
12260 void operator=(const ValueArray3
& other
);
12267 template <typename T1
, typename T2
, typename T3
, typename T4
>
12268 class ValueArray4
{
12270 ValueArray4(T1 v1
, T2 v2
, T3 v3
, T4 v4
) : v1_(v1
), v2_(v2
), v3_(v3
),
12273 template <typename T
>
12274 operator ParamGenerator
<T
>() const {
12275 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12276 static_cast<T
>(v3_
), static_cast<T
>(v4_
)};
12277 return ValuesIn(array
);
12280 ValueArray4(const ValueArray4
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12281 v3_(other
.v3_
), v4_(other
.v4_
) {}
12284 // No implementation - assignment is unsupported.
12285 void operator=(const ValueArray4
& other
);
12293 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
12294 class ValueArray5
{
12296 ValueArray5(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
) : v1_(v1
), v2_(v2
), v3_(v3
),
12297 v4_(v4
), v5_(v5
) {}
12299 template <typename T
>
12300 operator ParamGenerator
<T
>() const {
12301 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12302 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
)};
12303 return ValuesIn(array
);
12306 ValueArray5(const ValueArray5
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12307 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
) {}
12310 // No implementation - assignment is unsupported.
12311 void operator=(const ValueArray5
& other
);
12320 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12322 class ValueArray6
{
12324 ValueArray6(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
) : v1_(v1
), v2_(v2
),
12325 v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
) {}
12327 template <typename T
>
12328 operator ParamGenerator
<T
>() const {
12329 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12330 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12331 static_cast<T
>(v6_
)};
12332 return ValuesIn(array
);
12335 ValueArray6(const ValueArray6
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12336 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
) {}
12339 // No implementation - assignment is unsupported.
12340 void operator=(const ValueArray6
& other
);
12350 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12351 typename T6
, typename T7
>
12352 class ValueArray7
{
12354 ValueArray7(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
) : v1_(v1
),
12355 v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
) {}
12357 template <typename T
>
12358 operator ParamGenerator
<T
>() const {
12359 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12360 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12361 static_cast<T
>(v6_
), static_cast<T
>(v7_
)};
12362 return ValuesIn(array
);
12365 ValueArray7(const ValueArray7
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12366 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12370 // No implementation - assignment is unsupported.
12371 void operator=(const ValueArray7
& other
);
12382 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12383 typename T6
, typename T7
, typename T8
>
12384 class ValueArray8
{
12386 ValueArray8(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
12387 T8 v8
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
12390 template <typename T
>
12391 operator ParamGenerator
<T
>() const {
12392 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12393 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12394 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
)};
12395 return ValuesIn(array
);
12398 ValueArray8(const ValueArray8
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12399 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12400 v7_(other
.v7_
), v8_(other
.v8_
) {}
12403 // No implementation - assignment is unsupported.
12404 void operator=(const ValueArray8
& other
);
12416 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12417 typename T6
, typename T7
, typename T8
, typename T9
>
12418 class ValueArray9
{
12420 ValueArray9(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
,
12421 T9 v9
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
12422 v8_(v8
), v9_(v9
) {}
12424 template <typename T
>
12425 operator ParamGenerator
<T
>() const {
12426 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12427 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12428 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12429 static_cast<T
>(v9_
)};
12430 return ValuesIn(array
);
12433 ValueArray9(const ValueArray9
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12434 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12435 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
) {}
12438 // No implementation - assignment is unsupported.
12439 void operator=(const ValueArray9
& other
);
12452 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12453 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
12454 class ValueArray10
{
12456 ValueArray10(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12457 T10 v10
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
12458 v8_(v8
), v9_(v9
), v10_(v10
) {}
12460 template <typename T
>
12461 operator ParamGenerator
<T
>() const {
12462 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12463 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12464 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12465 static_cast<T
>(v9_
), static_cast<T
>(v10_
)};
12466 return ValuesIn(array
);
12469 ValueArray10(const ValueArray10
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12470 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12471 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
) {}
12474 // No implementation - assignment is unsupported.
12475 void operator=(const ValueArray10
& other
);
12489 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12490 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12492 class ValueArray11
{
12494 ValueArray11(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12495 T10 v10
, T11 v11
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
),
12496 v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
) {}
12498 template <typename T
>
12499 operator ParamGenerator
<T
>() const {
12500 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12501 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12502 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12503 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
)};
12504 return ValuesIn(array
);
12507 ValueArray11(const ValueArray11
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12508 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12509 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12510 v11_(other
.v11_
) {}
12513 // No implementation - assignment is unsupported.
12514 void operator=(const ValueArray11
& other
);
12529 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12530 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12531 typename T11
, typename T12
>
12532 class ValueArray12
{
12534 ValueArray12(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12535 T10 v10
, T11 v11
, T12 v12
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
),
12536 v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
) {}
12538 template <typename T
>
12539 operator ParamGenerator
<T
>() const {
12540 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12541 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12542 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12543 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12544 static_cast<T
>(v12_
)};
12545 return ValuesIn(array
);
12548 ValueArray12(const ValueArray12
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12549 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12550 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12551 v11_(other
.v11_
), v12_(other
.v12_
) {}
12554 // No implementation - assignment is unsupported.
12555 void operator=(const ValueArray12
& other
);
12571 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12572 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12573 typename T11
, typename T12
, typename T13
>
12574 class ValueArray13
{
12576 ValueArray13(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12577 T10 v10
, T11 v11
, T12 v12
, T13 v13
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
),
12578 v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
),
12579 v12_(v12
), v13_(v13
) {}
12581 template <typename T
>
12582 operator ParamGenerator
<T
>() const {
12583 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12584 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12585 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12586 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12587 static_cast<T
>(v12_
), static_cast<T
>(v13_
)};
12588 return ValuesIn(array
);
12591 ValueArray13(const ValueArray13
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12592 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12593 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12594 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
) {}
12597 // No implementation - assignment is unsupported.
12598 void operator=(const ValueArray13
& other
);
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
>
12618 class ValueArray14
{
12620 ValueArray14(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12621 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
) : v1_(v1
), v2_(v2
), v3_(v3
),
12622 v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
12623 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
) {}
12625 template <typename T
>
12626 operator ParamGenerator
<T
>() const {
12627 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12628 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12629 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12630 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12631 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
)};
12632 return ValuesIn(array
);
12635 ValueArray14(const ValueArray14
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12636 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12637 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12638 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
) {}
12641 // No implementation - assignment is unsupported.
12642 void operator=(const ValueArray14
& other
);
12660 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12661 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12662 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
>
12663 class ValueArray15
{
12665 ValueArray15(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12666 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
) : v1_(v1
), v2_(v2
),
12667 v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
12668 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
) {}
12670 template <typename T
>
12671 operator ParamGenerator
<T
>() const {
12672 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12673 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12674 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12675 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12676 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
12677 static_cast<T
>(v15_
)};
12678 return ValuesIn(array
);
12681 ValueArray15(const ValueArray15
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12682 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12683 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12684 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
12685 v15_(other
.v15_
) {}
12688 // No implementation - assignment is unsupported.
12689 void operator=(const ValueArray15
& other
);
12708 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12709 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12710 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
12712 class ValueArray16
{
12714 ValueArray16(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12715 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
) : 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
),
12720 template <typename T
>
12721 operator ParamGenerator
<T
>() const {
12722 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12723 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12724 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12725 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12726 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
12727 static_cast<T
>(v15_
), static_cast<T
>(v16_
)};
12728 return ValuesIn(array
);
12731 ValueArray16(const ValueArray16
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12732 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12733 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12734 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
12735 v15_(other
.v15_
), v16_(other
.v16_
) {}
12738 // No implementation - assignment is unsupported.
12739 void operator=(const ValueArray16
& other
);
12759 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12760 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12761 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
12762 typename T16
, typename T17
>
12763 class ValueArray17
{
12765 ValueArray17(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12766 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
,
12767 T17 v17
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
12768 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
12769 v15_(v15
), v16_(v16
), v17_(v17
) {}
12771 template <typename T
>
12772 operator ParamGenerator
<T
>() const {
12773 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12774 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12775 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12776 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12777 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
12778 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
)};
12779 return ValuesIn(array
);
12782 ValueArray17(const ValueArray17
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12783 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12784 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12785 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
12786 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
) {}
12789 // No implementation - assignment is unsupported.
12790 void operator=(const ValueArray17
& other
);
12811 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12812 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12813 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
12814 typename T16
, typename T17
, typename T18
>
12815 class ValueArray18
{
12817 ValueArray18(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12818 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
12819 T18 v18
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
12820 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
12821 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
) {}
12823 template <typename T
>
12824 operator ParamGenerator
<T
>() const {
12825 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12826 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12827 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12828 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12829 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
12830 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
12831 static_cast<T
>(v18_
)};
12832 return ValuesIn(array
);
12835 ValueArray18(const ValueArray18
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12836 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12837 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12838 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
12839 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
) {}
12842 // No implementation - assignment is unsupported.
12843 void operator=(const ValueArray18
& other
);
12865 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12866 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12867 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
12868 typename T16
, typename T17
, typename T18
, typename T19
>
12869 class ValueArray19
{
12871 ValueArray19(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12872 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
12873 T18 v18
, T19 v19
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
),
12874 v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
),
12875 v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
) {}
12877 template <typename T
>
12878 operator ParamGenerator
<T
>() const {
12879 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12880 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12881 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12882 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12883 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
12884 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
12885 static_cast<T
>(v18_
), static_cast<T
>(v19_
)};
12886 return ValuesIn(array
);
12889 ValueArray19(const ValueArray19
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12890 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12891 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12892 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
12893 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
12894 v19_(other
.v19_
) {}
12897 // No implementation - assignment is unsupported.
12898 void operator=(const ValueArray19
& other
);
12921 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12922 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12923 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
12924 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
>
12925 class ValueArray20
{
12927 ValueArray20(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12928 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
12929 T18 v18
, T19 v19
, T20 v20
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
),
12930 v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
),
12931 v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
),
12932 v19_(v19
), v20_(v20
) {}
12934 template <typename T
>
12935 operator ParamGenerator
<T
>() const {
12936 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12937 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12938 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12939 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12940 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
12941 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
12942 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
)};
12943 return ValuesIn(array
);
12946 ValueArray20(const ValueArray20
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
12947 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
12948 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
12949 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
12950 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
12951 v19_(other
.v19_
), v20_(other
.v20_
) {}
12954 // No implementation - assignment is unsupported.
12955 void operator=(const ValueArray20
& other
);
12979 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
12980 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
12981 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
12982 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
12984 class ValueArray21
{
12986 ValueArray21(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
12987 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
12988 T18 v18
, T19 v19
, T20 v20
, T21 v21
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
),
12989 v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
),
12990 v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
),
12991 v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
) {}
12993 template <typename T
>
12994 operator ParamGenerator
<T
>() const {
12995 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
12996 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
12997 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
12998 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
12999 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13000 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13001 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13002 static_cast<T
>(v21_
)};
13003 return ValuesIn(array
);
13006 ValueArray21(const ValueArray21
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13007 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13008 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13009 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13010 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13011 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
) {}
13014 // No implementation - assignment is unsupported.
13015 void operator=(const ValueArray21
& other
);
13040 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13041 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13042 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13043 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13044 typename T21
, typename T22
>
13045 class ValueArray22
{
13047 ValueArray22(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13048 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13049 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
) : v1_(v1
), v2_(v2
), v3_(v3
),
13050 v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
13051 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
13052 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
) {}
13054 template <typename T
>
13055 operator ParamGenerator
<T
>() const {
13056 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13057 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13058 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13059 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13060 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13061 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13062 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13063 static_cast<T
>(v21_
), static_cast<T
>(v22_
)};
13064 return ValuesIn(array
);
13067 ValueArray22(const ValueArray22
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13068 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13069 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13070 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13071 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13072 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
) {}
13075 // No implementation - assignment is unsupported.
13076 void operator=(const ValueArray22
& other
);
13102 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13103 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13104 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13105 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13106 typename T21
, typename T22
, typename T23
>
13107 class ValueArray23
{
13109 ValueArray23(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13110 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13111 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
) : v1_(v1
), v2_(v2
),
13112 v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
13113 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
13114 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
13117 template <typename T
>
13118 operator ParamGenerator
<T
>() const {
13119 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13120 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13121 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13122 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13123 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13124 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13125 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13126 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
)};
13127 return ValuesIn(array
);
13130 ValueArray23(const ValueArray23
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13131 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13132 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13133 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13134 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13135 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13136 v23_(other
.v23_
) {}
13139 // No implementation - assignment is unsupported.
13140 void operator=(const ValueArray23
& other
);
13167 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13168 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13169 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13170 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13171 typename T21
, typename T22
, typename T23
, typename T24
>
13172 class ValueArray24
{
13174 ValueArray24(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13175 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13176 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
) : v1_(v1
),
13177 v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
),
13178 v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
),
13179 v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
),
13180 v22_(v22
), v23_(v23
), v24_(v24
) {}
13182 template <typename T
>
13183 operator ParamGenerator
<T
>() const {
13184 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13185 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13186 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13187 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13188 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13189 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13190 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13191 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13192 static_cast<T
>(v24_
)};
13193 return ValuesIn(array
);
13196 ValueArray24(const ValueArray24
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13197 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13198 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13199 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13200 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13201 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13202 v23_(other
.v23_
), v24_(other
.v24_
) {}
13205 // No implementation - assignment is unsupported.
13206 void operator=(const ValueArray24
& other
);
13234 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13235 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13236 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13237 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13238 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
>
13239 class ValueArray25
{
13241 ValueArray25(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13242 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13243 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
,
13244 T25 v25
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
13245 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
13246 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
13247 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
) {}
13249 template <typename T
>
13250 operator ParamGenerator
<T
>() const {
13251 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13252 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13253 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13254 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13255 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13256 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13257 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13258 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13259 static_cast<T
>(v24_
), static_cast<T
>(v25_
)};
13260 return ValuesIn(array
);
13263 ValueArray25(const ValueArray25
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13264 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13265 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13266 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13267 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13268 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13269 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
) {}
13272 // No implementation - assignment is unsupported.
13273 void operator=(const ValueArray25
& other
);
13302 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13303 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13304 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13305 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13306 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13308 class ValueArray26
{
13310 ValueArray26(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13311 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13312 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13313 T26 v26
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
13314 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
13315 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
13316 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
) {}
13318 template <typename T
>
13319 operator ParamGenerator
<T
>() const {
13320 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13321 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13322 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13323 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13324 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13325 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13326 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13327 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13328 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
)};
13329 return ValuesIn(array
);
13332 ValueArray26(const ValueArray26
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13333 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13334 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13335 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13336 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13337 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13338 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
) {}
13341 // No implementation - assignment is unsupported.
13342 void operator=(const ValueArray26
& other
);
13372 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13373 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13374 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13375 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13376 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13377 typename T26
, typename T27
>
13378 class ValueArray27
{
13380 ValueArray27(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13381 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13382 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13383 T26 v26
, T27 v27
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
),
13384 v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
),
13385 v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
),
13386 v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
),
13387 v26_(v26
), v27_(v27
) {}
13389 template <typename T
>
13390 operator ParamGenerator
<T
>() const {
13391 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13392 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13393 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13394 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13395 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13396 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13397 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13398 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13399 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13400 static_cast<T
>(v27_
)};
13401 return ValuesIn(array
);
13404 ValueArray27(const ValueArray27
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13405 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13406 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13407 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13408 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13409 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13410 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13411 v27_(other
.v27_
) {}
13414 // No implementation - assignment is unsupported.
13415 void operator=(const ValueArray27
& other
);
13446 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13447 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13448 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13449 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13450 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13451 typename T26
, typename T27
, typename T28
>
13452 class ValueArray28
{
13454 ValueArray28(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13455 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13456 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13457 T26 v26
, T27 v27
, T28 v28
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
),
13458 v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
),
13459 v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
),
13460 v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
),
13461 v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
) {}
13463 template <typename T
>
13464 operator ParamGenerator
<T
>() const {
13465 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13466 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13467 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13468 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13469 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13470 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13471 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13472 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13473 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13474 static_cast<T
>(v27_
), static_cast<T
>(v28_
)};
13475 return ValuesIn(array
);
13478 ValueArray28(const ValueArray28
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13479 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13480 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13481 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13482 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13483 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13484 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13485 v27_(other
.v27_
), v28_(other
.v28_
) {}
13488 // No implementation - assignment is unsupported.
13489 void operator=(const ValueArray28
& other
);
13521 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13522 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13523 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13524 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13525 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13526 typename T26
, typename T27
, typename T28
, typename T29
>
13527 class ValueArray29
{
13529 ValueArray29(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13530 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13531 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13532 T26 v26
, T27 v27
, T28 v28
, T29 v29
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
),
13533 v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
),
13534 v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
),
13535 v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
),
13536 v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
) {}
13538 template <typename T
>
13539 operator ParamGenerator
<T
>() const {
13540 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13541 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13542 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13543 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13544 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13545 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13546 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13547 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13548 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13549 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
)};
13550 return ValuesIn(array
);
13553 ValueArray29(const ValueArray29
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13554 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13555 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13556 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13557 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13558 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13559 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13560 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
) {}
13563 // No implementation - assignment is unsupported.
13564 void operator=(const ValueArray29
& other
);
13597 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13598 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13599 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13600 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13601 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13602 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
>
13603 class ValueArray30
{
13605 ValueArray30(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13606 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13607 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13608 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
) : v1_(v1
), v2_(v2
), v3_(v3
),
13609 v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
13610 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
13611 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
13612 v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
),
13613 v29_(v29
), v30_(v30
) {}
13615 template <typename T
>
13616 operator ParamGenerator
<T
>() const {
13617 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13618 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13619 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13620 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13621 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13622 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13623 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13624 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13625 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13626 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
13627 static_cast<T
>(v30_
)};
13628 return ValuesIn(array
);
13631 ValueArray30(const ValueArray30
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13632 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13633 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13634 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13635 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13636 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13637 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13638 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
) {}
13641 // No implementation - assignment is unsupported.
13642 void operator=(const ValueArray30
& other
);
13676 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13677 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13678 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13679 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13680 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13681 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
13683 class ValueArray31
{
13685 ValueArray31(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13686 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13687 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13688 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
) : v1_(v1
), v2_(v2
),
13689 v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
13690 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
13691 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
13692 v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
),
13693 v29_(v29
), v30_(v30
), v31_(v31
) {}
13695 template <typename T
>
13696 operator ParamGenerator
<T
>() const {
13697 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13698 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13699 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13700 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13701 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13702 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13703 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13704 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13705 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13706 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
13707 static_cast<T
>(v30_
), static_cast<T
>(v31_
)};
13708 return ValuesIn(array
);
13711 ValueArray31(const ValueArray31
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13712 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13713 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13714 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13715 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13716 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13717 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13718 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
13719 v31_(other
.v31_
) {}
13722 // No implementation - assignment is unsupported.
13723 void operator=(const ValueArray31
& other
);
13758 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13759 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13760 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13761 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13762 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13763 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
13764 typename T31
, typename T32
>
13765 class ValueArray32
{
13767 ValueArray32(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13768 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13769 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13770 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
) : v1_(v1
),
13771 v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
),
13772 v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
),
13773 v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
),
13774 v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
),
13775 v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
) {}
13777 template <typename T
>
13778 operator ParamGenerator
<T
>() const {
13779 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13780 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13781 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13782 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13783 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13784 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13785 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13786 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13787 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13788 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
13789 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
)};
13790 return ValuesIn(array
);
13793 ValueArray32(const ValueArray32
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13794 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13795 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13796 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13797 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13798 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13799 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13800 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
13801 v31_(other
.v31_
), v32_(other
.v32_
) {}
13804 // No implementation - assignment is unsupported.
13805 void operator=(const ValueArray32
& other
);
13841 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13842 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13843 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13844 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13845 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13846 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
13847 typename T31
, typename T32
, typename T33
>
13848 class ValueArray33
{
13850 ValueArray33(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13851 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13852 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13853 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
,
13854 T33 v33
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
13855 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
13856 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
13857 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
),
13858 v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
),
13861 template <typename T
>
13862 operator ParamGenerator
<T
>() const {
13863 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13864 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13865 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13866 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13867 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13868 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13869 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13870 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13871 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13872 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
13873 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
13874 static_cast<T
>(v33_
)};
13875 return ValuesIn(array
);
13878 ValueArray33(const ValueArray33
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13879 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13880 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13881 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13882 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13883 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13884 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13885 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
13886 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
) {}
13889 // No implementation - assignment is unsupported.
13890 void operator=(const ValueArray33
& other
);
13927 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
13928 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
13929 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
13930 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
13931 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
13932 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
13933 typename T31
, typename T32
, typename T33
, typename T34
>
13934 class ValueArray34
{
13936 ValueArray34(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
13937 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
13938 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
13939 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
13940 T34 v34
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
13941 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
13942 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
13943 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
),
13944 v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
),
13945 v33_(v33
), v34_(v34
) {}
13947 template <typename T
>
13948 operator ParamGenerator
<T
>() const {
13949 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
13950 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
13951 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
13952 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
13953 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
13954 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
13955 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
13956 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
13957 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
13958 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
13959 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
13960 static_cast<T
>(v33_
), static_cast<T
>(v34_
)};
13961 return ValuesIn(array
);
13964 ValueArray34(const ValueArray34
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
13965 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
13966 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
13967 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
13968 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
13969 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
13970 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
13971 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
13972 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
) {}
13975 // No implementation - assignment is unsupported.
13976 void operator=(const ValueArray34
& other
);
14014 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14015 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14016 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14017 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14018 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14019 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14020 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
>
14021 class ValueArray35
{
14023 ValueArray35(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14024 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14025 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14026 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14027 T34 v34
, T35 v35
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
),
14028 v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
),
14029 v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
),
14030 v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
),
14031 v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
),
14032 v32_(v32
), v33_(v33
), v34_(v34
), v35_(v35
) {}
14034 template <typename T
>
14035 operator ParamGenerator
<T
>() const {
14036 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14037 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14038 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14039 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14040 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14041 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14042 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14043 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14044 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14045 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14046 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14047 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
)};
14048 return ValuesIn(array
);
14051 ValueArray35(const ValueArray35
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14052 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14053 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14054 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14055 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14056 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14057 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14058 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14059 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14060 v35_(other
.v35_
) {}
14063 // No implementation - assignment is unsupported.
14064 void operator=(const ValueArray35
& other
);
14103 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14104 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14105 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14106 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14107 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14108 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14109 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14111 class ValueArray36
{
14113 ValueArray36(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14114 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14115 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14116 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14117 T34 v34
, T35 v35
, T36 v36
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
),
14118 v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
),
14119 v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
),
14120 v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
),
14121 v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
),
14122 v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
) {}
14124 template <typename T
>
14125 operator ParamGenerator
<T
>() const {
14126 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14127 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14128 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14129 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14130 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14131 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14132 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14133 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14134 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14135 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14136 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14137 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14138 static_cast<T
>(v36_
)};
14139 return ValuesIn(array
);
14142 ValueArray36(const ValueArray36
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14143 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14144 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14145 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14146 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14147 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14148 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14149 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14150 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14151 v35_(other
.v35_
), v36_(other
.v36_
) {}
14154 // No implementation - assignment is unsupported.
14155 void operator=(const ValueArray36
& other
);
14195 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14196 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14197 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14198 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14199 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14200 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14201 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14202 typename T36
, typename T37
>
14203 class ValueArray37
{
14205 ValueArray37(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14206 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14207 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14208 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14209 T34 v34
, T35 v35
, T36 v36
, T37 v37
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
),
14210 v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
),
14211 v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
),
14212 v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
),
14213 v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
),
14214 v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
), v35_(v35
),
14215 v36_(v36
), v37_(v37
) {}
14217 template <typename T
>
14218 operator ParamGenerator
<T
>() const {
14219 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14220 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14221 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14222 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14223 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14224 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14225 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14226 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14227 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14228 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14229 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14230 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14231 static_cast<T
>(v36_
), static_cast<T
>(v37_
)};
14232 return ValuesIn(array
);
14235 ValueArray37(const ValueArray37
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14236 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14237 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14238 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14239 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14240 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14241 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14242 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14243 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14244 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
) {}
14247 // No implementation - assignment is unsupported.
14248 void operator=(const ValueArray37
& other
);
14289 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14290 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14291 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14292 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14293 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14294 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14295 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14296 typename T36
, typename T37
, typename T38
>
14297 class ValueArray38
{
14299 ValueArray38(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14300 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14301 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14302 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14303 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
) : v1_(v1
), v2_(v2
), v3_(v3
),
14304 v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
14305 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
14306 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
14307 v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
),
14308 v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
),
14309 v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
) {}
14311 template <typename T
>
14312 operator ParamGenerator
<T
>() const {
14313 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14314 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14315 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14316 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14317 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14318 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14319 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14320 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14321 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14322 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14323 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14324 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14325 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
)};
14326 return ValuesIn(array
);
14329 ValueArray38(const ValueArray38
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14330 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14331 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14332 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14333 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14334 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14335 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14336 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14337 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14338 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
) {}
14341 // No implementation - assignment is unsupported.
14342 void operator=(const ValueArray38
& other
);
14384 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14385 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14386 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14387 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14388 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14389 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14390 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14391 typename T36
, typename T37
, typename T38
, typename T39
>
14392 class ValueArray39
{
14394 ValueArray39(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14395 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14396 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14397 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14398 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
) : v1_(v1
), v2_(v2
),
14399 v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
14400 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
14401 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
14402 v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
),
14403 v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
),
14404 v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
), v39_(v39
) {}
14406 template <typename T
>
14407 operator ParamGenerator
<T
>() const {
14408 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14409 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14410 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14411 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14412 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14413 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14414 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14415 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14416 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14417 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14418 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14419 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14420 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
14421 static_cast<T
>(v39_
)};
14422 return ValuesIn(array
);
14425 ValueArray39(const ValueArray39
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14426 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14427 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14428 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14429 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14430 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14431 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14432 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14433 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14434 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
14435 v39_(other
.v39_
) {}
14438 // No implementation - assignment is unsupported.
14439 void operator=(const ValueArray39
& other
);
14482 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14483 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14484 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14485 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14486 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14487 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14488 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14489 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
>
14490 class ValueArray40
{
14492 ValueArray40(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14493 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14494 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14495 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14496 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
) : v1_(v1
),
14497 v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
),
14498 v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
),
14499 v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
),
14500 v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
),
14501 v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
),
14502 v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
), v39_(v39
),
14505 template <typename T
>
14506 operator ParamGenerator
<T
>() const {
14507 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14508 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14509 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14510 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14511 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14512 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14513 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14514 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14515 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14516 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14517 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14518 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14519 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
14520 static_cast<T
>(v39_
), static_cast<T
>(v40_
)};
14521 return ValuesIn(array
);
14524 ValueArray40(const ValueArray40
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14525 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14526 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14527 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14528 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14529 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14530 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14531 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14532 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14533 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
14534 v39_(other
.v39_
), v40_(other
.v40_
) {}
14537 // No implementation - assignment is unsupported.
14538 void operator=(const ValueArray40
& other
);
14582 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14583 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14584 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14585 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14586 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14587 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14588 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14589 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
14591 class ValueArray41
{
14593 ValueArray41(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14594 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14595 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14596 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14597 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
,
14598 T41 v41
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
14599 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
14600 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
14601 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
),
14602 v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
),
14603 v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
),
14604 v39_(v39
), v40_(v40
), v41_(v41
) {}
14606 template <typename T
>
14607 operator ParamGenerator
<T
>() const {
14608 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14609 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14610 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14611 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14612 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14613 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14614 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14615 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14616 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14617 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14618 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14619 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14620 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
14621 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
)};
14622 return ValuesIn(array
);
14625 ValueArray41(const ValueArray41
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14626 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14627 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14628 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14629 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14630 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14631 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14632 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14633 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14634 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
14635 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
) {}
14638 // No implementation - assignment is unsupported.
14639 void operator=(const ValueArray41
& other
);
14684 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14685 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14686 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14687 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14688 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14689 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14690 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14691 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
14692 typename T41
, typename T42
>
14693 class ValueArray42
{
14695 ValueArray42(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14696 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14697 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14698 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14699 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
14700 T42 v42
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
14701 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
14702 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
14703 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
),
14704 v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
),
14705 v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
),
14706 v39_(v39
), v40_(v40
), v41_(v41
), v42_(v42
) {}
14708 template <typename T
>
14709 operator ParamGenerator
<T
>() const {
14710 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14711 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14712 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14713 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14714 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14715 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14716 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14717 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14718 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14719 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14720 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14721 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14722 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
14723 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
14724 static_cast<T
>(v42_
)};
14725 return ValuesIn(array
);
14728 ValueArray42(const ValueArray42
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14729 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14730 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14731 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14732 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14733 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14734 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14735 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14736 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14737 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
14738 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
) {}
14741 // No implementation - assignment is unsupported.
14742 void operator=(const ValueArray42
& other
);
14788 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14789 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14790 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14791 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14792 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14793 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14794 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14795 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
14796 typename T41
, typename T42
, typename T43
>
14797 class ValueArray43
{
14799 ValueArray43(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14800 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14801 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14802 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14803 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
14804 T42 v42
, T43 v43
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
),
14805 v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
),
14806 v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
),
14807 v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
),
14808 v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
),
14809 v32_(v32
), v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
),
14810 v38_(v38
), v39_(v39
), v40_(v40
), v41_(v41
), v42_(v42
), v43_(v43
) {}
14812 template <typename T
>
14813 operator ParamGenerator
<T
>() const {
14814 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14815 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14816 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14817 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14818 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14819 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14820 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14821 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14822 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14823 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14824 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14825 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14826 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
14827 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
14828 static_cast<T
>(v42_
), static_cast<T
>(v43_
)};
14829 return ValuesIn(array
);
14832 ValueArray43(const ValueArray43
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14833 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14834 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14835 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14836 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14837 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14838 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14839 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14840 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14841 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
14842 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
14843 v43_(other
.v43_
) {}
14846 // No implementation - assignment is unsupported.
14847 void operator=(const ValueArray43
& other
);
14894 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
14895 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
14896 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
14897 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
14898 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
14899 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
14900 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
14901 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
14902 typename T41
, typename T42
, typename T43
, typename T44
>
14903 class ValueArray44
{
14905 ValueArray44(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
14906 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
14907 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
14908 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
14909 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
14910 T42 v42
, T43 v43
, T44 v44
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
),
14911 v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
),
14912 v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
),
14913 v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
),
14914 v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
),
14915 v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
),
14916 v37_(v37
), v38_(v38
), v39_(v39
), v40_(v40
), v41_(v41
), v42_(v42
),
14917 v43_(v43
), v44_(v44
) {}
14919 template <typename T
>
14920 operator ParamGenerator
<T
>() const {
14921 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
14922 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
14923 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
14924 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
14925 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
14926 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
14927 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
14928 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
14929 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
14930 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
14931 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
14932 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
14933 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
14934 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
14935 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
)};
14936 return ValuesIn(array
);
14939 ValueArray44(const ValueArray44
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
14940 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
14941 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
14942 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
14943 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
14944 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
14945 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
14946 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
14947 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
14948 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
14949 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
14950 v43_(other
.v43_
), v44_(other
.v44_
) {}
14953 // No implementation - assignment is unsupported.
14954 void operator=(const ValueArray44
& other
);
15002 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
15003 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
15004 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
15005 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
15006 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
15007 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
15008 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
15009 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
15010 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
>
15011 class ValueArray45
{
15013 ValueArray45(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
15014 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
15015 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
15016 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
15017 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
15018 T42 v42
, T43 v43
, T44 v44
, T45 v45
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
),
15019 v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
),
15020 v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
), v17_(v17
),
15021 v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
), v23_(v23
),
15022 v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
), v29_(v29
),
15023 v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
), v35_(v35
),
15024 v36_(v36
), v37_(v37
), v38_(v38
), v39_(v39
), v40_(v40
), v41_(v41
),
15025 v42_(v42
), v43_(v43
), v44_(v44
), v45_(v45
) {}
15027 template <typename T
>
15028 operator ParamGenerator
<T
>() const {
15029 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
15030 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
15031 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
15032 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
15033 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
15034 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
15035 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
15036 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
15037 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
15038 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
15039 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
15040 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
15041 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
15042 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
15043 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
),
15044 static_cast<T
>(v45_
)};
15045 return ValuesIn(array
);
15048 ValueArray45(const ValueArray45
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
15049 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
15050 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
15051 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
15052 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
15053 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
15054 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
15055 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
15056 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
15057 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
15058 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
15059 v43_(other
.v43_
), v44_(other
.v44_
), v45_(other
.v45_
) {}
15062 // No implementation - assignment is unsupported.
15063 void operator=(const ValueArray45
& other
);
15112 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
15113 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
15114 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
15115 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
15116 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
15117 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
15118 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
15119 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
15120 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
15122 class ValueArray46
{
15124 ValueArray46(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
15125 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
15126 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
15127 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
15128 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
15129 T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
) : v1_(v1
), v2_(v2
), v3_(v3
),
15130 v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
15131 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
15132 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
15133 v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
),
15134 v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
),
15135 v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
), v39_(v39
), v40_(v40
),
15136 v41_(v41
), v42_(v42
), v43_(v43
), v44_(v44
), v45_(v45
), v46_(v46
) {}
15138 template <typename T
>
15139 operator ParamGenerator
<T
>() const {
15140 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
15141 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
15142 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
15143 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
15144 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
15145 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
15146 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
15147 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
15148 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
15149 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
15150 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
15151 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
15152 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
15153 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
15154 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
),
15155 static_cast<T
>(v45_
), static_cast<T
>(v46_
)};
15156 return ValuesIn(array
);
15159 ValueArray46(const ValueArray46
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
15160 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
15161 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
15162 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
15163 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
15164 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
15165 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
15166 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
15167 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
15168 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
15169 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
15170 v43_(other
.v43_
), v44_(other
.v44_
), v45_(other
.v45_
), v46_(other
.v46_
) {}
15173 // No implementation - assignment is unsupported.
15174 void operator=(const ValueArray46
& other
);
15224 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
15225 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
15226 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
15227 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
15228 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
15229 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
15230 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
15231 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
15232 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
15233 typename T46
, typename T47
>
15234 class ValueArray47
{
15236 ValueArray47(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
15237 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
15238 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
15239 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
15240 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
15241 T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
, T47 v47
) : v1_(v1
), v2_(v2
),
15242 v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
), v10_(v10
),
15243 v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
), v16_(v16
),
15244 v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
), v22_(v22
),
15245 v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
), v28_(v28
),
15246 v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
), v34_(v34
),
15247 v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
), v39_(v39
), v40_(v40
),
15248 v41_(v41
), v42_(v42
), v43_(v43
), v44_(v44
), v45_(v45
), v46_(v46
),
15251 template <typename T
>
15252 operator ParamGenerator
<T
>() const {
15253 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
15254 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
15255 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
15256 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
15257 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
15258 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
15259 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
15260 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
15261 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
15262 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
15263 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
15264 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
15265 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
15266 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
15267 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
),
15268 static_cast<T
>(v45_
), static_cast<T
>(v46_
), static_cast<T
>(v47_
)};
15269 return ValuesIn(array
);
15272 ValueArray47(const ValueArray47
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
15273 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
15274 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
15275 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
15276 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
15277 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
15278 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
15279 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
15280 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
15281 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
15282 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
15283 v43_(other
.v43_
), v44_(other
.v44_
), v45_(other
.v45_
), v46_(other
.v46_
),
15284 v47_(other
.v47_
) {}
15287 // No implementation - assignment is unsupported.
15288 void operator=(const ValueArray47
& other
);
15339 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
15340 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
15341 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
15342 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
15343 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
15344 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
15345 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
15346 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
15347 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
15348 typename T46
, typename T47
, typename T48
>
15349 class ValueArray48
{
15351 ValueArray48(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
15352 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
15353 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
15354 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
15355 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
15356 T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
, T47 v47
, T48 v48
) : v1_(v1
),
15357 v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
), v8_(v8
), v9_(v9
),
15358 v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
), v15_(v15
),
15359 v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
), v21_(v21
),
15360 v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
), v27_(v27
),
15361 v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
), v33_(v33
),
15362 v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
), v39_(v39
),
15363 v40_(v40
), v41_(v41
), v42_(v42
), v43_(v43
), v44_(v44
), v45_(v45
),
15364 v46_(v46
), v47_(v47
), v48_(v48
) {}
15366 template <typename T
>
15367 operator ParamGenerator
<T
>() const {
15368 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
15369 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
15370 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
15371 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
15372 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
15373 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
15374 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
15375 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
15376 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
15377 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
15378 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
15379 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
15380 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
15381 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
15382 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
),
15383 static_cast<T
>(v45_
), static_cast<T
>(v46_
), static_cast<T
>(v47_
),
15384 static_cast<T
>(v48_
)};
15385 return ValuesIn(array
);
15388 ValueArray48(const ValueArray48
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
15389 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
15390 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
15391 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
15392 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
15393 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
15394 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
15395 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
15396 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
15397 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
15398 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
15399 v43_(other
.v43_
), v44_(other
.v44_
), v45_(other
.v45_
), v46_(other
.v46_
),
15400 v47_(other
.v47_
), v48_(other
.v48_
) {}
15403 // No implementation - assignment is unsupported.
15404 void operator=(const ValueArray48
& other
);
15456 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
15457 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
15458 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
15459 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
15460 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
15461 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
15462 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
15463 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
15464 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
15465 typename T46
, typename T47
, typename T48
, typename T49
>
15466 class ValueArray49
{
15468 ValueArray49(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
15469 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
15470 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
15471 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
15472 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
15473 T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
, T47 v47
, T48 v48
,
15474 T49 v49
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
15475 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
15476 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
15477 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
),
15478 v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
),
15479 v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
),
15480 v39_(v39
), v40_(v40
), v41_(v41
), v42_(v42
), v43_(v43
), v44_(v44
),
15481 v45_(v45
), v46_(v46
), v47_(v47
), v48_(v48
), v49_(v49
) {}
15483 template <typename T
>
15484 operator ParamGenerator
<T
>() const {
15485 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
15486 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
15487 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
15488 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
15489 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
15490 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
15491 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
15492 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
15493 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
15494 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
15495 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
15496 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
15497 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
15498 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
15499 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
),
15500 static_cast<T
>(v45_
), static_cast<T
>(v46_
), static_cast<T
>(v47_
),
15501 static_cast<T
>(v48_
), static_cast<T
>(v49_
)};
15502 return ValuesIn(array
);
15505 ValueArray49(const ValueArray49
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
15506 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
15507 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
15508 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
15509 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
15510 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
15511 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
15512 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
15513 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
15514 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
15515 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
15516 v43_(other
.v43_
), v44_(other
.v44_
), v45_(other
.v45_
), v46_(other
.v46_
),
15517 v47_(other
.v47_
), v48_(other
.v48_
), v49_(other
.v49_
) {}
15520 // No implementation - assignment is unsupported.
15521 void operator=(const ValueArray49
& other
);
15574 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
15575 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
15576 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
15577 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
15578 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
15579 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
15580 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
15581 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
15582 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
15583 typename T46
, typename T47
, typename T48
, typename T49
, typename T50
>
15584 class ValueArray50
{
15586 ValueArray50(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
15587 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
15588 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
15589 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
15590 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
15591 T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
, T47 v47
, T48 v48
, T49 v49
,
15592 T50 v50
) : v1_(v1
), v2_(v2
), v3_(v3
), v4_(v4
), v5_(v5
), v6_(v6
), v7_(v7
),
15593 v8_(v8
), v9_(v9
), v10_(v10
), v11_(v11
), v12_(v12
), v13_(v13
), v14_(v14
),
15594 v15_(v15
), v16_(v16
), v17_(v17
), v18_(v18
), v19_(v19
), v20_(v20
),
15595 v21_(v21
), v22_(v22
), v23_(v23
), v24_(v24
), v25_(v25
), v26_(v26
),
15596 v27_(v27
), v28_(v28
), v29_(v29
), v30_(v30
), v31_(v31
), v32_(v32
),
15597 v33_(v33
), v34_(v34
), v35_(v35
), v36_(v36
), v37_(v37
), v38_(v38
),
15598 v39_(v39
), v40_(v40
), v41_(v41
), v42_(v42
), v43_(v43
), v44_(v44
),
15599 v45_(v45
), v46_(v46
), v47_(v47
), v48_(v48
), v49_(v49
), v50_(v50
) {}
15601 template <typename T
>
15602 operator ParamGenerator
<T
>() const {
15603 const T array
[] = {static_cast<T
>(v1_
), static_cast<T
>(v2_
),
15604 static_cast<T
>(v3_
), static_cast<T
>(v4_
), static_cast<T
>(v5_
),
15605 static_cast<T
>(v6_
), static_cast<T
>(v7_
), static_cast<T
>(v8_
),
15606 static_cast<T
>(v9_
), static_cast<T
>(v10_
), static_cast<T
>(v11_
),
15607 static_cast<T
>(v12_
), static_cast<T
>(v13_
), static_cast<T
>(v14_
),
15608 static_cast<T
>(v15_
), static_cast<T
>(v16_
), static_cast<T
>(v17_
),
15609 static_cast<T
>(v18_
), static_cast<T
>(v19_
), static_cast<T
>(v20_
),
15610 static_cast<T
>(v21_
), static_cast<T
>(v22_
), static_cast<T
>(v23_
),
15611 static_cast<T
>(v24_
), static_cast<T
>(v25_
), static_cast<T
>(v26_
),
15612 static_cast<T
>(v27_
), static_cast<T
>(v28_
), static_cast<T
>(v29_
),
15613 static_cast<T
>(v30_
), static_cast<T
>(v31_
), static_cast<T
>(v32_
),
15614 static_cast<T
>(v33_
), static_cast<T
>(v34_
), static_cast<T
>(v35_
),
15615 static_cast<T
>(v36_
), static_cast<T
>(v37_
), static_cast<T
>(v38_
),
15616 static_cast<T
>(v39_
), static_cast<T
>(v40_
), static_cast<T
>(v41_
),
15617 static_cast<T
>(v42_
), static_cast<T
>(v43_
), static_cast<T
>(v44_
),
15618 static_cast<T
>(v45_
), static_cast<T
>(v46_
), static_cast<T
>(v47_
),
15619 static_cast<T
>(v48_
), static_cast<T
>(v49_
), static_cast<T
>(v50_
)};
15620 return ValuesIn(array
);
15623 ValueArray50(const ValueArray50
& other
) : v1_(other
.v1_
), v2_(other
.v2_
),
15624 v3_(other
.v3_
), v4_(other
.v4_
), v5_(other
.v5_
), v6_(other
.v6_
),
15625 v7_(other
.v7_
), v8_(other
.v8_
), v9_(other
.v9_
), v10_(other
.v10_
),
15626 v11_(other
.v11_
), v12_(other
.v12_
), v13_(other
.v13_
), v14_(other
.v14_
),
15627 v15_(other
.v15_
), v16_(other
.v16_
), v17_(other
.v17_
), v18_(other
.v18_
),
15628 v19_(other
.v19_
), v20_(other
.v20_
), v21_(other
.v21_
), v22_(other
.v22_
),
15629 v23_(other
.v23_
), v24_(other
.v24_
), v25_(other
.v25_
), v26_(other
.v26_
),
15630 v27_(other
.v27_
), v28_(other
.v28_
), v29_(other
.v29_
), v30_(other
.v30_
),
15631 v31_(other
.v31_
), v32_(other
.v32_
), v33_(other
.v33_
), v34_(other
.v34_
),
15632 v35_(other
.v35_
), v36_(other
.v36_
), v37_(other
.v37_
), v38_(other
.v38_
),
15633 v39_(other
.v39_
), v40_(other
.v40_
), v41_(other
.v41_
), v42_(other
.v42_
),
15634 v43_(other
.v43_
), v44_(other
.v44_
), v45_(other
.v45_
), v46_(other
.v46_
),
15635 v47_(other
.v47_
), v48_(other
.v48_
), v49_(other
.v49_
), v50_(other
.v50_
) {}
15638 // No implementation - assignment is unsupported.
15639 void operator=(const ValueArray50
& other
);
15693 # if GTEST_HAS_COMBINE
15694 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
15696 // Generates values from the Cartesian product of values produced
15697 // by the argument generators.
15699 template <typename T1
, typename T2
>
15700 class CartesianProductGenerator2
15701 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
> > {
15703 typedef ::testing::tuple
<T1
, T2
> ParamType
;
15705 CartesianProductGenerator2(const ParamGenerator
<T1
>& g1
,
15706 const ParamGenerator
<T2
>& g2
)
15707 : g1_(g1
), g2_(g2
) {}
15708 virtual ~CartesianProductGenerator2() {}
15710 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
15711 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin());
15713 virtual ParamIteratorInterface
<ParamType
>* End() const {
15714 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end());
15718 class Iterator
: public ParamIteratorInterface
<ParamType
> {
15720 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
15721 const ParamGenerator
<T1
>& g1
,
15722 const typename ParamGenerator
<T1
>::iterator
& current1
,
15723 const ParamGenerator
<T2
>& g2
,
15724 const typename ParamGenerator
<T2
>::iterator
& current2
)
15726 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
15727 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
) {
15728 ComputeCurrentValue();
15730 virtual ~Iterator() {}
15732 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
15735 // Advance should not be called on beyond-of-range iterators
15736 // so no component iterators must be beyond end of range, either.
15737 virtual void Advance() {
15740 if (current2_
== end2_
) {
15741 current2_
= begin2_
;
15744 ComputeCurrentValue();
15746 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
15747 return new Iterator(*this);
15749 virtual const ParamType
* Current() const { return current_value_
.get(); }
15750 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
15751 // Having the same base generator guarantees that the other
15752 // iterator is of the same type and we can downcast.
15753 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
15754 << "The program attempted to compare iterators "
15755 << "from different generators." << std::endl
;
15756 const Iterator
* typed_other
=
15757 CheckedDowncastToActualType
<const Iterator
>(&other
);
15758 // We must report iterators equal if they both point beyond their
15759 // respective ranges. That can happen in a variety of fashions,
15760 // so we have to consult AtEnd().
15761 return (AtEnd() && typed_other
->AtEnd()) ||
15763 current1_
== typed_other
->current1_
&&
15764 current2_
== typed_other
->current2_
);
15768 Iterator(const Iterator
& other
)
15769 : base_(other
.base_
),
15770 begin1_(other
.begin1_
),
15771 end1_(other
.end1_
),
15772 current1_(other
.current1_
),
15773 begin2_(other
.begin2_
),
15774 end2_(other
.end2_
),
15775 current2_(other
.current2_
) {
15776 ComputeCurrentValue();
15779 void ComputeCurrentValue() {
15781 current_value_
.reset(new ParamType(*current1_
, *current2_
));
15783 bool AtEnd() const {
15784 // We must report iterator past the end of the range when either of the
15785 // component iterators has reached the end of its range.
15787 current1_
== end1_
||
15788 current2_
== end2_
;
15791 // No implementation - assignment is unsupported.
15792 void operator=(const Iterator
& other
);
15794 const ParamGeneratorInterface
<ParamType
>* const base_
;
15795 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
15796 // current[i]_ is the actual traversing iterator.
15797 const typename ParamGenerator
<T1
>::iterator begin1_
;
15798 const typename ParamGenerator
<T1
>::iterator end1_
;
15799 typename ParamGenerator
<T1
>::iterator current1_
;
15800 const typename ParamGenerator
<T2
>::iterator begin2_
;
15801 const typename ParamGenerator
<T2
>::iterator end2_
;
15802 typename ParamGenerator
<T2
>::iterator current2_
;
15803 linked_ptr
<ParamType
> current_value_
;
15804 }; // class CartesianProductGenerator2::Iterator
15806 // No implementation - assignment is unsupported.
15807 void operator=(const CartesianProductGenerator2
& other
);
15809 const ParamGenerator
<T1
> g1_
;
15810 const ParamGenerator
<T2
> g2_
;
15811 }; // class CartesianProductGenerator2
15814 template <typename T1
, typename T2
, typename T3
>
15815 class CartesianProductGenerator3
15816 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
> > {
15818 typedef ::testing::tuple
<T1
, T2
, T3
> ParamType
;
15820 CartesianProductGenerator3(const ParamGenerator
<T1
>& g1
,
15821 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
)
15822 : g1_(g1
), g2_(g2
), g3_(g3
) {}
15823 virtual ~CartesianProductGenerator3() {}
15825 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
15826 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
15829 virtual ParamIteratorInterface
<ParamType
>* End() const {
15830 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end());
15834 class Iterator
: public ParamIteratorInterface
<ParamType
> {
15836 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
15837 const ParamGenerator
<T1
>& g1
,
15838 const typename ParamGenerator
<T1
>::iterator
& current1
,
15839 const ParamGenerator
<T2
>& g2
,
15840 const typename ParamGenerator
<T2
>::iterator
& current2
,
15841 const ParamGenerator
<T3
>& g3
,
15842 const typename ParamGenerator
<T3
>::iterator
& current3
)
15844 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
15845 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
15846 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
) {
15847 ComputeCurrentValue();
15849 virtual ~Iterator() {}
15851 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
15854 // Advance should not be called on beyond-of-range iterators
15855 // so no component iterators must be beyond end of range, either.
15856 virtual void Advance() {
15859 if (current3_
== end3_
) {
15860 current3_
= begin3_
;
15863 if (current2_
== end2_
) {
15864 current2_
= begin2_
;
15867 ComputeCurrentValue();
15869 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
15870 return new Iterator(*this);
15872 virtual const ParamType
* Current() const { return current_value_
.get(); }
15873 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
15874 // Having the same base generator guarantees that the other
15875 // iterator is of the same type and we can downcast.
15876 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
15877 << "The program attempted to compare iterators "
15878 << "from different generators." << std::endl
;
15879 const Iterator
* typed_other
=
15880 CheckedDowncastToActualType
<const Iterator
>(&other
);
15881 // We must report iterators equal if they both point beyond their
15882 // respective ranges. That can happen in a variety of fashions,
15883 // so we have to consult AtEnd().
15884 return (AtEnd() && typed_other
->AtEnd()) ||
15886 current1_
== typed_other
->current1_
&&
15887 current2_
== typed_other
->current2_
&&
15888 current3_
== typed_other
->current3_
);
15892 Iterator(const Iterator
& other
)
15893 : base_(other
.base_
),
15894 begin1_(other
.begin1_
),
15895 end1_(other
.end1_
),
15896 current1_(other
.current1_
),
15897 begin2_(other
.begin2_
),
15898 end2_(other
.end2_
),
15899 current2_(other
.current2_
),
15900 begin3_(other
.begin3_
),
15901 end3_(other
.end3_
),
15902 current3_(other
.current3_
) {
15903 ComputeCurrentValue();
15906 void ComputeCurrentValue() {
15908 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
));
15910 bool AtEnd() const {
15911 // We must report iterator past the end of the range when either of the
15912 // component iterators has reached the end of its range.
15914 current1_
== end1_
||
15915 current2_
== end2_
||
15916 current3_
== end3_
;
15919 // No implementation - assignment is unsupported.
15920 void operator=(const Iterator
& other
);
15922 const ParamGeneratorInterface
<ParamType
>* const base_
;
15923 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
15924 // current[i]_ is the actual traversing iterator.
15925 const typename ParamGenerator
<T1
>::iterator begin1_
;
15926 const typename ParamGenerator
<T1
>::iterator end1_
;
15927 typename ParamGenerator
<T1
>::iterator current1_
;
15928 const typename ParamGenerator
<T2
>::iterator begin2_
;
15929 const typename ParamGenerator
<T2
>::iterator end2_
;
15930 typename ParamGenerator
<T2
>::iterator current2_
;
15931 const typename ParamGenerator
<T3
>::iterator begin3_
;
15932 const typename ParamGenerator
<T3
>::iterator end3_
;
15933 typename ParamGenerator
<T3
>::iterator current3_
;
15934 linked_ptr
<ParamType
> current_value_
;
15935 }; // class CartesianProductGenerator3::Iterator
15937 // No implementation - assignment is unsupported.
15938 void operator=(const CartesianProductGenerator3
& other
);
15940 const ParamGenerator
<T1
> g1_
;
15941 const ParamGenerator
<T2
> g2_
;
15942 const ParamGenerator
<T3
> g3_
;
15943 }; // class CartesianProductGenerator3
15946 template <typename T1
, typename T2
, typename T3
, typename T4
>
15947 class CartesianProductGenerator4
15948 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
> > {
15950 typedef ::testing::tuple
<T1
, T2
, T3
, T4
> ParamType
;
15952 CartesianProductGenerator4(const ParamGenerator
<T1
>& g1
,
15953 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
15954 const ParamGenerator
<T4
>& g4
)
15955 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
) {}
15956 virtual ~CartesianProductGenerator4() {}
15958 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
15959 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
15960 g3_
.begin(), g4_
, g4_
.begin());
15962 virtual ParamIteratorInterface
<ParamType
>* End() const {
15963 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
15968 class Iterator
: public ParamIteratorInterface
<ParamType
> {
15970 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
15971 const ParamGenerator
<T1
>& g1
,
15972 const typename ParamGenerator
<T1
>::iterator
& current1
,
15973 const ParamGenerator
<T2
>& g2
,
15974 const typename ParamGenerator
<T2
>::iterator
& current2
,
15975 const ParamGenerator
<T3
>& g3
,
15976 const typename ParamGenerator
<T3
>::iterator
& current3
,
15977 const ParamGenerator
<T4
>& g4
,
15978 const typename ParamGenerator
<T4
>::iterator
& current4
)
15980 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
15981 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
15982 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
15983 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
) {
15984 ComputeCurrentValue();
15986 virtual ~Iterator() {}
15988 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
15991 // Advance should not be called on beyond-of-range iterators
15992 // so no component iterators must be beyond end of range, either.
15993 virtual void Advance() {
15996 if (current4_
== end4_
) {
15997 current4_
= begin4_
;
16000 if (current3_
== end3_
) {
16001 current3_
= begin3_
;
16004 if (current2_
== end2_
) {
16005 current2_
= begin2_
;
16008 ComputeCurrentValue();
16010 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
16011 return new Iterator(*this);
16013 virtual const ParamType
* Current() const { return current_value_
.get(); }
16014 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
16015 // Having the same base generator guarantees that the other
16016 // iterator is of the same type and we can downcast.
16017 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
16018 << "The program attempted to compare iterators "
16019 << "from different generators." << std::endl
;
16020 const Iterator
* typed_other
=
16021 CheckedDowncastToActualType
<const Iterator
>(&other
);
16022 // We must report iterators equal if they both point beyond their
16023 // respective ranges. That can happen in a variety of fashions,
16024 // so we have to consult AtEnd().
16025 return (AtEnd() && typed_other
->AtEnd()) ||
16027 current1_
== typed_other
->current1_
&&
16028 current2_
== typed_other
->current2_
&&
16029 current3_
== typed_other
->current3_
&&
16030 current4_
== typed_other
->current4_
);
16034 Iterator(const Iterator
& other
)
16035 : base_(other
.base_
),
16036 begin1_(other
.begin1_
),
16037 end1_(other
.end1_
),
16038 current1_(other
.current1_
),
16039 begin2_(other
.begin2_
),
16040 end2_(other
.end2_
),
16041 current2_(other
.current2_
),
16042 begin3_(other
.begin3_
),
16043 end3_(other
.end3_
),
16044 current3_(other
.current3_
),
16045 begin4_(other
.begin4_
),
16046 end4_(other
.end4_
),
16047 current4_(other
.current4_
) {
16048 ComputeCurrentValue();
16051 void ComputeCurrentValue() {
16053 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
16056 bool AtEnd() const {
16057 // We must report iterator past the end of the range when either of the
16058 // component iterators has reached the end of its range.
16060 current1_
== end1_
||
16061 current2_
== end2_
||
16062 current3_
== end3_
||
16063 current4_
== end4_
;
16066 // No implementation - assignment is unsupported.
16067 void operator=(const Iterator
& other
);
16069 const ParamGeneratorInterface
<ParamType
>* const base_
;
16070 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
16071 // current[i]_ is the actual traversing iterator.
16072 const typename ParamGenerator
<T1
>::iterator begin1_
;
16073 const typename ParamGenerator
<T1
>::iterator end1_
;
16074 typename ParamGenerator
<T1
>::iterator current1_
;
16075 const typename ParamGenerator
<T2
>::iterator begin2_
;
16076 const typename ParamGenerator
<T2
>::iterator end2_
;
16077 typename ParamGenerator
<T2
>::iterator current2_
;
16078 const typename ParamGenerator
<T3
>::iterator begin3_
;
16079 const typename ParamGenerator
<T3
>::iterator end3_
;
16080 typename ParamGenerator
<T3
>::iterator current3_
;
16081 const typename ParamGenerator
<T4
>::iterator begin4_
;
16082 const typename ParamGenerator
<T4
>::iterator end4_
;
16083 typename ParamGenerator
<T4
>::iterator current4_
;
16084 linked_ptr
<ParamType
> current_value_
;
16085 }; // class CartesianProductGenerator4::Iterator
16087 // No implementation - assignment is unsupported.
16088 void operator=(const CartesianProductGenerator4
& other
);
16090 const ParamGenerator
<T1
> g1_
;
16091 const ParamGenerator
<T2
> g2_
;
16092 const ParamGenerator
<T3
> g3_
;
16093 const ParamGenerator
<T4
> g4_
;
16094 }; // class CartesianProductGenerator4
16097 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
16098 class CartesianProductGenerator5
16099 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
> > {
16101 typedef ::testing::tuple
<T1
, T2
, T3
, T4
, T5
> ParamType
;
16103 CartesianProductGenerator5(const ParamGenerator
<T1
>& g1
,
16104 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
16105 const ParamGenerator
<T4
>& g4
, const ParamGenerator
<T5
>& g5
)
16106 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
) {}
16107 virtual ~CartesianProductGenerator5() {}
16109 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
16110 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
16111 g3_
.begin(), g4_
, g4_
.begin(), g5_
, g5_
.begin());
16113 virtual ParamIteratorInterface
<ParamType
>* End() const {
16114 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
16115 g4_
, g4_
.end(), g5_
, g5_
.end());
16119 class Iterator
: public ParamIteratorInterface
<ParamType
> {
16121 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
16122 const ParamGenerator
<T1
>& g1
,
16123 const typename ParamGenerator
<T1
>::iterator
& current1
,
16124 const ParamGenerator
<T2
>& g2
,
16125 const typename ParamGenerator
<T2
>::iterator
& current2
,
16126 const ParamGenerator
<T3
>& g3
,
16127 const typename ParamGenerator
<T3
>::iterator
& current3
,
16128 const ParamGenerator
<T4
>& g4
,
16129 const typename ParamGenerator
<T4
>::iterator
& current4
,
16130 const ParamGenerator
<T5
>& g5
,
16131 const typename ParamGenerator
<T5
>::iterator
& current5
)
16133 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
16134 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
16135 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
16136 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
),
16137 begin5_(g5
.begin()), end5_(g5
.end()), current5_(current5
) {
16138 ComputeCurrentValue();
16140 virtual ~Iterator() {}
16142 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
16145 // Advance should not be called on beyond-of-range iterators
16146 // so no component iterators must be beyond end of range, either.
16147 virtual void Advance() {
16150 if (current5_
== end5_
) {
16151 current5_
= begin5_
;
16154 if (current4_
== end4_
) {
16155 current4_
= begin4_
;
16158 if (current3_
== end3_
) {
16159 current3_
= begin3_
;
16162 if (current2_
== end2_
) {
16163 current2_
= begin2_
;
16166 ComputeCurrentValue();
16168 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
16169 return new Iterator(*this);
16171 virtual const ParamType
* Current() const { return current_value_
.get(); }
16172 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
16173 // Having the same base generator guarantees that the other
16174 // iterator is of the same type and we can downcast.
16175 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
16176 << "The program attempted to compare iterators "
16177 << "from different generators." << std::endl
;
16178 const Iterator
* typed_other
=
16179 CheckedDowncastToActualType
<const Iterator
>(&other
);
16180 // We must report iterators equal if they both point beyond their
16181 // respective ranges. That can happen in a variety of fashions,
16182 // so we have to consult AtEnd().
16183 return (AtEnd() && typed_other
->AtEnd()) ||
16185 current1_
== typed_other
->current1_
&&
16186 current2_
== typed_other
->current2_
&&
16187 current3_
== typed_other
->current3_
&&
16188 current4_
== typed_other
->current4_
&&
16189 current5_
== typed_other
->current5_
);
16193 Iterator(const Iterator
& other
)
16194 : base_(other
.base_
),
16195 begin1_(other
.begin1_
),
16196 end1_(other
.end1_
),
16197 current1_(other
.current1_
),
16198 begin2_(other
.begin2_
),
16199 end2_(other
.end2_
),
16200 current2_(other
.current2_
),
16201 begin3_(other
.begin3_
),
16202 end3_(other
.end3_
),
16203 current3_(other
.current3_
),
16204 begin4_(other
.begin4_
),
16205 end4_(other
.end4_
),
16206 current4_(other
.current4_
),
16207 begin5_(other
.begin5_
),
16208 end5_(other
.end5_
),
16209 current5_(other
.current5_
) {
16210 ComputeCurrentValue();
16213 void ComputeCurrentValue() {
16215 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
16216 *current4_
, *current5_
));
16218 bool AtEnd() const {
16219 // We must report iterator past the end of the range when either of the
16220 // component iterators has reached the end of its range.
16222 current1_
== end1_
||
16223 current2_
== end2_
||
16224 current3_
== end3_
||
16225 current4_
== end4_
||
16226 current5_
== end5_
;
16229 // No implementation - assignment is unsupported.
16230 void operator=(const Iterator
& other
);
16232 const ParamGeneratorInterface
<ParamType
>* const base_
;
16233 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
16234 // current[i]_ is the actual traversing iterator.
16235 const typename ParamGenerator
<T1
>::iterator begin1_
;
16236 const typename ParamGenerator
<T1
>::iterator end1_
;
16237 typename ParamGenerator
<T1
>::iterator current1_
;
16238 const typename ParamGenerator
<T2
>::iterator begin2_
;
16239 const typename ParamGenerator
<T2
>::iterator end2_
;
16240 typename ParamGenerator
<T2
>::iterator current2_
;
16241 const typename ParamGenerator
<T3
>::iterator begin3_
;
16242 const typename ParamGenerator
<T3
>::iterator end3_
;
16243 typename ParamGenerator
<T3
>::iterator current3_
;
16244 const typename ParamGenerator
<T4
>::iterator begin4_
;
16245 const typename ParamGenerator
<T4
>::iterator end4_
;
16246 typename ParamGenerator
<T4
>::iterator current4_
;
16247 const typename ParamGenerator
<T5
>::iterator begin5_
;
16248 const typename ParamGenerator
<T5
>::iterator end5_
;
16249 typename ParamGenerator
<T5
>::iterator current5_
;
16250 linked_ptr
<ParamType
> current_value_
;
16251 }; // class CartesianProductGenerator5::Iterator
16253 // No implementation - assignment is unsupported.
16254 void operator=(const CartesianProductGenerator5
& other
);
16256 const ParamGenerator
<T1
> g1_
;
16257 const ParamGenerator
<T2
> g2_
;
16258 const ParamGenerator
<T3
> g3_
;
16259 const ParamGenerator
<T4
> g4_
;
16260 const ParamGenerator
<T5
> g5_
;
16261 }; // class CartesianProductGenerator5
16264 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
16266 class CartesianProductGenerator6
16267 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
,
16270 typedef ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
> ParamType
;
16272 CartesianProductGenerator6(const ParamGenerator
<T1
>& g1
,
16273 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
16274 const ParamGenerator
<T4
>& g4
, const ParamGenerator
<T5
>& g5
,
16275 const ParamGenerator
<T6
>& g6
)
16276 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
) {}
16277 virtual ~CartesianProductGenerator6() {}
16279 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
16280 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
16281 g3_
.begin(), g4_
, g4_
.begin(), g5_
, g5_
.begin(), g6_
, g6_
.begin());
16283 virtual ParamIteratorInterface
<ParamType
>* End() const {
16284 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
16285 g4_
, g4_
.end(), g5_
, g5_
.end(), g6_
, g6_
.end());
16289 class Iterator
: public ParamIteratorInterface
<ParamType
> {
16291 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
16292 const ParamGenerator
<T1
>& g1
,
16293 const typename ParamGenerator
<T1
>::iterator
& current1
,
16294 const ParamGenerator
<T2
>& g2
,
16295 const typename ParamGenerator
<T2
>::iterator
& current2
,
16296 const ParamGenerator
<T3
>& g3
,
16297 const typename ParamGenerator
<T3
>::iterator
& current3
,
16298 const ParamGenerator
<T4
>& g4
,
16299 const typename ParamGenerator
<T4
>::iterator
& current4
,
16300 const ParamGenerator
<T5
>& g5
,
16301 const typename ParamGenerator
<T5
>::iterator
& current5
,
16302 const ParamGenerator
<T6
>& g6
,
16303 const typename ParamGenerator
<T6
>::iterator
& current6
)
16305 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
16306 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
16307 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
16308 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
),
16309 begin5_(g5
.begin()), end5_(g5
.end()), current5_(current5
),
16310 begin6_(g6
.begin()), end6_(g6
.end()), current6_(current6
) {
16311 ComputeCurrentValue();
16313 virtual ~Iterator() {}
16315 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
16318 // Advance should not be called on beyond-of-range iterators
16319 // so no component iterators must be beyond end of range, either.
16320 virtual void Advance() {
16323 if (current6_
== end6_
) {
16324 current6_
= begin6_
;
16327 if (current5_
== end5_
) {
16328 current5_
= begin5_
;
16331 if (current4_
== end4_
) {
16332 current4_
= begin4_
;
16335 if (current3_
== end3_
) {
16336 current3_
= begin3_
;
16339 if (current2_
== end2_
) {
16340 current2_
= begin2_
;
16343 ComputeCurrentValue();
16345 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
16346 return new Iterator(*this);
16348 virtual const ParamType
* Current() const { return current_value_
.get(); }
16349 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
16350 // Having the same base generator guarantees that the other
16351 // iterator is of the same type and we can downcast.
16352 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
16353 << "The program attempted to compare iterators "
16354 << "from different generators." << std::endl
;
16355 const Iterator
* typed_other
=
16356 CheckedDowncastToActualType
<const Iterator
>(&other
);
16357 // We must report iterators equal if they both point beyond their
16358 // respective ranges. That can happen in a variety of fashions,
16359 // so we have to consult AtEnd().
16360 return (AtEnd() && typed_other
->AtEnd()) ||
16362 current1_
== typed_other
->current1_
&&
16363 current2_
== typed_other
->current2_
&&
16364 current3_
== typed_other
->current3_
&&
16365 current4_
== typed_other
->current4_
&&
16366 current5_
== typed_other
->current5_
&&
16367 current6_
== typed_other
->current6_
);
16371 Iterator(const Iterator
& other
)
16372 : base_(other
.base_
),
16373 begin1_(other
.begin1_
),
16374 end1_(other
.end1_
),
16375 current1_(other
.current1_
),
16376 begin2_(other
.begin2_
),
16377 end2_(other
.end2_
),
16378 current2_(other
.current2_
),
16379 begin3_(other
.begin3_
),
16380 end3_(other
.end3_
),
16381 current3_(other
.current3_
),
16382 begin4_(other
.begin4_
),
16383 end4_(other
.end4_
),
16384 current4_(other
.current4_
),
16385 begin5_(other
.begin5_
),
16386 end5_(other
.end5_
),
16387 current5_(other
.current5_
),
16388 begin6_(other
.begin6_
),
16389 end6_(other
.end6_
),
16390 current6_(other
.current6_
) {
16391 ComputeCurrentValue();
16394 void ComputeCurrentValue() {
16396 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
16397 *current4_
, *current5_
, *current6_
));
16399 bool AtEnd() const {
16400 // We must report iterator past the end of the range when either of the
16401 // component iterators has reached the end of its range.
16403 current1_
== end1_
||
16404 current2_
== end2_
||
16405 current3_
== end3_
||
16406 current4_
== end4_
||
16407 current5_
== end5_
||
16408 current6_
== end6_
;
16411 // No implementation - assignment is unsupported.
16412 void operator=(const Iterator
& other
);
16414 const ParamGeneratorInterface
<ParamType
>* const base_
;
16415 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
16416 // current[i]_ is the actual traversing iterator.
16417 const typename ParamGenerator
<T1
>::iterator begin1_
;
16418 const typename ParamGenerator
<T1
>::iterator end1_
;
16419 typename ParamGenerator
<T1
>::iterator current1_
;
16420 const typename ParamGenerator
<T2
>::iterator begin2_
;
16421 const typename ParamGenerator
<T2
>::iterator end2_
;
16422 typename ParamGenerator
<T2
>::iterator current2_
;
16423 const typename ParamGenerator
<T3
>::iterator begin3_
;
16424 const typename ParamGenerator
<T3
>::iterator end3_
;
16425 typename ParamGenerator
<T3
>::iterator current3_
;
16426 const typename ParamGenerator
<T4
>::iterator begin4_
;
16427 const typename ParamGenerator
<T4
>::iterator end4_
;
16428 typename ParamGenerator
<T4
>::iterator current4_
;
16429 const typename ParamGenerator
<T5
>::iterator begin5_
;
16430 const typename ParamGenerator
<T5
>::iterator end5_
;
16431 typename ParamGenerator
<T5
>::iterator current5_
;
16432 const typename ParamGenerator
<T6
>::iterator begin6_
;
16433 const typename ParamGenerator
<T6
>::iterator end6_
;
16434 typename ParamGenerator
<T6
>::iterator current6_
;
16435 linked_ptr
<ParamType
> current_value_
;
16436 }; // class CartesianProductGenerator6::Iterator
16438 // No implementation - assignment is unsupported.
16439 void operator=(const CartesianProductGenerator6
& other
);
16441 const ParamGenerator
<T1
> g1_
;
16442 const ParamGenerator
<T2
> g2_
;
16443 const ParamGenerator
<T3
> g3_
;
16444 const ParamGenerator
<T4
> g4_
;
16445 const ParamGenerator
<T5
> g5_
;
16446 const ParamGenerator
<T6
> g6_
;
16447 }; // class CartesianProductGenerator6
16450 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
16451 typename T6
, typename T7
>
16452 class CartesianProductGenerator7
16453 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
,
16456 typedef ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> ParamType
;
16458 CartesianProductGenerator7(const ParamGenerator
<T1
>& g1
,
16459 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
16460 const ParamGenerator
<T4
>& g4
, const ParamGenerator
<T5
>& g5
,
16461 const ParamGenerator
<T6
>& g6
, const ParamGenerator
<T7
>& g7
)
16462 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
) {}
16463 virtual ~CartesianProductGenerator7() {}
16465 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
16466 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
16467 g3_
.begin(), g4_
, g4_
.begin(), g5_
, g5_
.begin(), g6_
, g6_
.begin(), g7_
,
16470 virtual ParamIteratorInterface
<ParamType
>* End() const {
16471 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
16472 g4_
, g4_
.end(), g5_
, g5_
.end(), g6_
, g6_
.end(), g7_
, g7_
.end());
16476 class Iterator
: public ParamIteratorInterface
<ParamType
> {
16478 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
16479 const ParamGenerator
<T1
>& g1
,
16480 const typename ParamGenerator
<T1
>::iterator
& current1
,
16481 const ParamGenerator
<T2
>& g2
,
16482 const typename ParamGenerator
<T2
>::iterator
& current2
,
16483 const ParamGenerator
<T3
>& g3
,
16484 const typename ParamGenerator
<T3
>::iterator
& current3
,
16485 const ParamGenerator
<T4
>& g4
,
16486 const typename ParamGenerator
<T4
>::iterator
& current4
,
16487 const ParamGenerator
<T5
>& g5
,
16488 const typename ParamGenerator
<T5
>::iterator
& current5
,
16489 const ParamGenerator
<T6
>& g6
,
16490 const typename ParamGenerator
<T6
>::iterator
& current6
,
16491 const ParamGenerator
<T7
>& g7
,
16492 const typename ParamGenerator
<T7
>::iterator
& current7
)
16494 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
16495 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
16496 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
16497 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
),
16498 begin5_(g5
.begin()), end5_(g5
.end()), current5_(current5
),
16499 begin6_(g6
.begin()), end6_(g6
.end()), current6_(current6
),
16500 begin7_(g7
.begin()), end7_(g7
.end()), current7_(current7
) {
16501 ComputeCurrentValue();
16503 virtual ~Iterator() {}
16505 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
16508 // Advance should not be called on beyond-of-range iterators
16509 // so no component iterators must be beyond end of range, either.
16510 virtual void Advance() {
16513 if (current7_
== end7_
) {
16514 current7_
= begin7_
;
16517 if (current6_
== end6_
) {
16518 current6_
= begin6_
;
16521 if (current5_
== end5_
) {
16522 current5_
= begin5_
;
16525 if (current4_
== end4_
) {
16526 current4_
= begin4_
;
16529 if (current3_
== end3_
) {
16530 current3_
= begin3_
;
16533 if (current2_
== end2_
) {
16534 current2_
= begin2_
;
16537 ComputeCurrentValue();
16539 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
16540 return new Iterator(*this);
16542 virtual const ParamType
* Current() const { return current_value_
.get(); }
16543 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
16544 // Having the same base generator guarantees that the other
16545 // iterator is of the same type and we can downcast.
16546 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
16547 << "The program attempted to compare iterators "
16548 << "from different generators." << std::endl
;
16549 const Iterator
* typed_other
=
16550 CheckedDowncastToActualType
<const Iterator
>(&other
);
16551 // We must report iterators equal if they both point beyond their
16552 // respective ranges. That can happen in a variety of fashions,
16553 // so we have to consult AtEnd().
16554 return (AtEnd() && typed_other
->AtEnd()) ||
16556 current1_
== typed_other
->current1_
&&
16557 current2_
== typed_other
->current2_
&&
16558 current3_
== typed_other
->current3_
&&
16559 current4_
== typed_other
->current4_
&&
16560 current5_
== typed_other
->current5_
&&
16561 current6_
== typed_other
->current6_
&&
16562 current7_
== typed_other
->current7_
);
16566 Iterator(const Iterator
& other
)
16567 : base_(other
.base_
),
16568 begin1_(other
.begin1_
),
16569 end1_(other
.end1_
),
16570 current1_(other
.current1_
),
16571 begin2_(other
.begin2_
),
16572 end2_(other
.end2_
),
16573 current2_(other
.current2_
),
16574 begin3_(other
.begin3_
),
16575 end3_(other
.end3_
),
16576 current3_(other
.current3_
),
16577 begin4_(other
.begin4_
),
16578 end4_(other
.end4_
),
16579 current4_(other
.current4_
),
16580 begin5_(other
.begin5_
),
16581 end5_(other
.end5_
),
16582 current5_(other
.current5_
),
16583 begin6_(other
.begin6_
),
16584 end6_(other
.end6_
),
16585 current6_(other
.current6_
),
16586 begin7_(other
.begin7_
),
16587 end7_(other
.end7_
),
16588 current7_(other
.current7_
) {
16589 ComputeCurrentValue();
16592 void ComputeCurrentValue() {
16594 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
16595 *current4_
, *current5_
, *current6_
, *current7_
));
16597 bool AtEnd() const {
16598 // We must report iterator past the end of the range when either of the
16599 // component iterators has reached the end of its range.
16601 current1_
== end1_
||
16602 current2_
== end2_
||
16603 current3_
== end3_
||
16604 current4_
== end4_
||
16605 current5_
== end5_
||
16606 current6_
== end6_
||
16607 current7_
== end7_
;
16610 // No implementation - assignment is unsupported.
16611 void operator=(const Iterator
& other
);
16613 const ParamGeneratorInterface
<ParamType
>* const base_
;
16614 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
16615 // current[i]_ is the actual traversing iterator.
16616 const typename ParamGenerator
<T1
>::iterator begin1_
;
16617 const typename ParamGenerator
<T1
>::iterator end1_
;
16618 typename ParamGenerator
<T1
>::iterator current1_
;
16619 const typename ParamGenerator
<T2
>::iterator begin2_
;
16620 const typename ParamGenerator
<T2
>::iterator end2_
;
16621 typename ParamGenerator
<T2
>::iterator current2_
;
16622 const typename ParamGenerator
<T3
>::iterator begin3_
;
16623 const typename ParamGenerator
<T3
>::iterator end3_
;
16624 typename ParamGenerator
<T3
>::iterator current3_
;
16625 const typename ParamGenerator
<T4
>::iterator begin4_
;
16626 const typename ParamGenerator
<T4
>::iterator end4_
;
16627 typename ParamGenerator
<T4
>::iterator current4_
;
16628 const typename ParamGenerator
<T5
>::iterator begin5_
;
16629 const typename ParamGenerator
<T5
>::iterator end5_
;
16630 typename ParamGenerator
<T5
>::iterator current5_
;
16631 const typename ParamGenerator
<T6
>::iterator begin6_
;
16632 const typename ParamGenerator
<T6
>::iterator end6_
;
16633 typename ParamGenerator
<T6
>::iterator current6_
;
16634 const typename ParamGenerator
<T7
>::iterator begin7_
;
16635 const typename ParamGenerator
<T7
>::iterator end7_
;
16636 typename ParamGenerator
<T7
>::iterator current7_
;
16637 linked_ptr
<ParamType
> current_value_
;
16638 }; // class CartesianProductGenerator7::Iterator
16640 // No implementation - assignment is unsupported.
16641 void operator=(const CartesianProductGenerator7
& other
);
16643 const ParamGenerator
<T1
> g1_
;
16644 const ParamGenerator
<T2
> g2_
;
16645 const ParamGenerator
<T3
> g3_
;
16646 const ParamGenerator
<T4
> g4_
;
16647 const ParamGenerator
<T5
> g5_
;
16648 const ParamGenerator
<T6
> g6_
;
16649 const ParamGenerator
<T7
> g7_
;
16650 }; // class CartesianProductGenerator7
16653 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
16654 typename T6
, typename T7
, typename T8
>
16655 class CartesianProductGenerator8
16656 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
,
16659 typedef ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
> ParamType
;
16661 CartesianProductGenerator8(const ParamGenerator
<T1
>& g1
,
16662 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
16663 const ParamGenerator
<T4
>& g4
, const ParamGenerator
<T5
>& g5
,
16664 const ParamGenerator
<T6
>& g6
, const ParamGenerator
<T7
>& g7
,
16665 const ParamGenerator
<T8
>& g8
)
16666 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
),
16668 virtual ~CartesianProductGenerator8() {}
16670 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
16671 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
16672 g3_
.begin(), g4_
, g4_
.begin(), g5_
, g5_
.begin(), g6_
, g6_
.begin(), g7_
,
16673 g7_
.begin(), g8_
, g8_
.begin());
16675 virtual ParamIteratorInterface
<ParamType
>* End() const {
16676 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
16677 g4_
, g4_
.end(), g5_
, g5_
.end(), g6_
, g6_
.end(), g7_
, g7_
.end(), g8_
,
16682 class Iterator
: public ParamIteratorInterface
<ParamType
> {
16684 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
16685 const ParamGenerator
<T1
>& g1
,
16686 const typename ParamGenerator
<T1
>::iterator
& current1
,
16687 const ParamGenerator
<T2
>& g2
,
16688 const typename ParamGenerator
<T2
>::iterator
& current2
,
16689 const ParamGenerator
<T3
>& g3
,
16690 const typename ParamGenerator
<T3
>::iterator
& current3
,
16691 const ParamGenerator
<T4
>& g4
,
16692 const typename ParamGenerator
<T4
>::iterator
& current4
,
16693 const ParamGenerator
<T5
>& g5
,
16694 const typename ParamGenerator
<T5
>::iterator
& current5
,
16695 const ParamGenerator
<T6
>& g6
,
16696 const typename ParamGenerator
<T6
>::iterator
& current6
,
16697 const ParamGenerator
<T7
>& g7
,
16698 const typename ParamGenerator
<T7
>::iterator
& current7
,
16699 const ParamGenerator
<T8
>& g8
,
16700 const typename ParamGenerator
<T8
>::iterator
& current8
)
16702 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
16703 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
16704 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
16705 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
),
16706 begin5_(g5
.begin()), end5_(g5
.end()), current5_(current5
),
16707 begin6_(g6
.begin()), end6_(g6
.end()), current6_(current6
),
16708 begin7_(g7
.begin()), end7_(g7
.end()), current7_(current7
),
16709 begin8_(g8
.begin()), end8_(g8
.end()), current8_(current8
) {
16710 ComputeCurrentValue();
16712 virtual ~Iterator() {}
16714 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
16717 // Advance should not be called on beyond-of-range iterators
16718 // so no component iterators must be beyond end of range, either.
16719 virtual void Advance() {
16722 if (current8_
== end8_
) {
16723 current8_
= begin8_
;
16726 if (current7_
== end7_
) {
16727 current7_
= begin7_
;
16730 if (current6_
== end6_
) {
16731 current6_
= begin6_
;
16734 if (current5_
== end5_
) {
16735 current5_
= begin5_
;
16738 if (current4_
== end4_
) {
16739 current4_
= begin4_
;
16742 if (current3_
== end3_
) {
16743 current3_
= begin3_
;
16746 if (current2_
== end2_
) {
16747 current2_
= begin2_
;
16750 ComputeCurrentValue();
16752 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
16753 return new Iterator(*this);
16755 virtual const ParamType
* Current() const { return current_value_
.get(); }
16756 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
16757 // Having the same base generator guarantees that the other
16758 // iterator is of the same type and we can downcast.
16759 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
16760 << "The program attempted to compare iterators "
16761 << "from different generators." << std::endl
;
16762 const Iterator
* typed_other
=
16763 CheckedDowncastToActualType
<const Iterator
>(&other
);
16764 // We must report iterators equal if they both point beyond their
16765 // respective ranges. That can happen in a variety of fashions,
16766 // so we have to consult AtEnd().
16767 return (AtEnd() && typed_other
->AtEnd()) ||
16769 current1_
== typed_other
->current1_
&&
16770 current2_
== typed_other
->current2_
&&
16771 current3_
== typed_other
->current3_
&&
16772 current4_
== typed_other
->current4_
&&
16773 current5_
== typed_other
->current5_
&&
16774 current6_
== typed_other
->current6_
&&
16775 current7_
== typed_other
->current7_
&&
16776 current8_
== typed_other
->current8_
);
16780 Iterator(const Iterator
& other
)
16781 : base_(other
.base_
),
16782 begin1_(other
.begin1_
),
16783 end1_(other
.end1_
),
16784 current1_(other
.current1_
),
16785 begin2_(other
.begin2_
),
16786 end2_(other
.end2_
),
16787 current2_(other
.current2_
),
16788 begin3_(other
.begin3_
),
16789 end3_(other
.end3_
),
16790 current3_(other
.current3_
),
16791 begin4_(other
.begin4_
),
16792 end4_(other
.end4_
),
16793 current4_(other
.current4_
),
16794 begin5_(other
.begin5_
),
16795 end5_(other
.end5_
),
16796 current5_(other
.current5_
),
16797 begin6_(other
.begin6_
),
16798 end6_(other
.end6_
),
16799 current6_(other
.current6_
),
16800 begin7_(other
.begin7_
),
16801 end7_(other
.end7_
),
16802 current7_(other
.current7_
),
16803 begin8_(other
.begin8_
),
16804 end8_(other
.end8_
),
16805 current8_(other
.current8_
) {
16806 ComputeCurrentValue();
16809 void ComputeCurrentValue() {
16811 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
16812 *current4_
, *current5_
, *current6_
, *current7_
, *current8_
));
16814 bool AtEnd() const {
16815 // We must report iterator past the end of the range when either of the
16816 // component iterators has reached the end of its range.
16818 current1_
== end1_
||
16819 current2_
== end2_
||
16820 current3_
== end3_
||
16821 current4_
== end4_
||
16822 current5_
== end5_
||
16823 current6_
== end6_
||
16824 current7_
== end7_
||
16825 current8_
== end8_
;
16828 // No implementation - assignment is unsupported.
16829 void operator=(const Iterator
& other
);
16831 const ParamGeneratorInterface
<ParamType
>* const base_
;
16832 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
16833 // current[i]_ is the actual traversing iterator.
16834 const typename ParamGenerator
<T1
>::iterator begin1_
;
16835 const typename ParamGenerator
<T1
>::iterator end1_
;
16836 typename ParamGenerator
<T1
>::iterator current1_
;
16837 const typename ParamGenerator
<T2
>::iterator begin2_
;
16838 const typename ParamGenerator
<T2
>::iterator end2_
;
16839 typename ParamGenerator
<T2
>::iterator current2_
;
16840 const typename ParamGenerator
<T3
>::iterator begin3_
;
16841 const typename ParamGenerator
<T3
>::iterator end3_
;
16842 typename ParamGenerator
<T3
>::iterator current3_
;
16843 const typename ParamGenerator
<T4
>::iterator begin4_
;
16844 const typename ParamGenerator
<T4
>::iterator end4_
;
16845 typename ParamGenerator
<T4
>::iterator current4_
;
16846 const typename ParamGenerator
<T5
>::iterator begin5_
;
16847 const typename ParamGenerator
<T5
>::iterator end5_
;
16848 typename ParamGenerator
<T5
>::iterator current5_
;
16849 const typename ParamGenerator
<T6
>::iterator begin6_
;
16850 const typename ParamGenerator
<T6
>::iterator end6_
;
16851 typename ParamGenerator
<T6
>::iterator current6_
;
16852 const typename ParamGenerator
<T7
>::iterator begin7_
;
16853 const typename ParamGenerator
<T7
>::iterator end7_
;
16854 typename ParamGenerator
<T7
>::iterator current7_
;
16855 const typename ParamGenerator
<T8
>::iterator begin8_
;
16856 const typename ParamGenerator
<T8
>::iterator end8_
;
16857 typename ParamGenerator
<T8
>::iterator current8_
;
16858 linked_ptr
<ParamType
> current_value_
;
16859 }; // class CartesianProductGenerator8::Iterator
16861 // No implementation - assignment is unsupported.
16862 void operator=(const CartesianProductGenerator8
& other
);
16864 const ParamGenerator
<T1
> g1_
;
16865 const ParamGenerator
<T2
> g2_
;
16866 const ParamGenerator
<T3
> g3_
;
16867 const ParamGenerator
<T4
> g4_
;
16868 const ParamGenerator
<T5
> g5_
;
16869 const ParamGenerator
<T6
> g6_
;
16870 const ParamGenerator
<T7
> g7_
;
16871 const ParamGenerator
<T8
> g8_
;
16872 }; // class CartesianProductGenerator8
16875 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
16876 typename T6
, typename T7
, typename T8
, typename T9
>
16877 class CartesianProductGenerator9
16878 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
,
16881 typedef ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
> ParamType
;
16883 CartesianProductGenerator9(const ParamGenerator
<T1
>& g1
,
16884 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
16885 const ParamGenerator
<T4
>& g4
, const ParamGenerator
<T5
>& g5
,
16886 const ParamGenerator
<T6
>& g6
, const ParamGenerator
<T7
>& g7
,
16887 const ParamGenerator
<T8
>& g8
, const ParamGenerator
<T9
>& g9
)
16888 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
), g8_(g8
),
16890 virtual ~CartesianProductGenerator9() {}
16892 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
16893 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
16894 g3_
.begin(), g4_
, g4_
.begin(), g5_
, g5_
.begin(), g6_
, g6_
.begin(), g7_
,
16895 g7_
.begin(), g8_
, g8_
.begin(), g9_
, g9_
.begin());
16897 virtual ParamIteratorInterface
<ParamType
>* End() const {
16898 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
16899 g4_
, g4_
.end(), g5_
, g5_
.end(), g6_
, g6_
.end(), g7_
, g7_
.end(), g8_
,
16900 g8_
.end(), g9_
, g9_
.end());
16904 class Iterator
: public ParamIteratorInterface
<ParamType
> {
16906 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
16907 const ParamGenerator
<T1
>& g1
,
16908 const typename ParamGenerator
<T1
>::iterator
& current1
,
16909 const ParamGenerator
<T2
>& g2
,
16910 const typename ParamGenerator
<T2
>::iterator
& current2
,
16911 const ParamGenerator
<T3
>& g3
,
16912 const typename ParamGenerator
<T3
>::iterator
& current3
,
16913 const ParamGenerator
<T4
>& g4
,
16914 const typename ParamGenerator
<T4
>::iterator
& current4
,
16915 const ParamGenerator
<T5
>& g5
,
16916 const typename ParamGenerator
<T5
>::iterator
& current5
,
16917 const ParamGenerator
<T6
>& g6
,
16918 const typename ParamGenerator
<T6
>::iterator
& current6
,
16919 const ParamGenerator
<T7
>& g7
,
16920 const typename ParamGenerator
<T7
>::iterator
& current7
,
16921 const ParamGenerator
<T8
>& g8
,
16922 const typename ParamGenerator
<T8
>::iterator
& current8
,
16923 const ParamGenerator
<T9
>& g9
,
16924 const typename ParamGenerator
<T9
>::iterator
& current9
)
16926 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
16927 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
16928 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
16929 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
),
16930 begin5_(g5
.begin()), end5_(g5
.end()), current5_(current5
),
16931 begin6_(g6
.begin()), end6_(g6
.end()), current6_(current6
),
16932 begin7_(g7
.begin()), end7_(g7
.end()), current7_(current7
),
16933 begin8_(g8
.begin()), end8_(g8
.end()), current8_(current8
),
16934 begin9_(g9
.begin()), end9_(g9
.end()), current9_(current9
) {
16935 ComputeCurrentValue();
16937 virtual ~Iterator() {}
16939 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
16942 // Advance should not be called on beyond-of-range iterators
16943 // so no component iterators must be beyond end of range, either.
16944 virtual void Advance() {
16947 if (current9_
== end9_
) {
16948 current9_
= begin9_
;
16951 if (current8_
== end8_
) {
16952 current8_
= begin8_
;
16955 if (current7_
== end7_
) {
16956 current7_
= begin7_
;
16959 if (current6_
== end6_
) {
16960 current6_
= begin6_
;
16963 if (current5_
== end5_
) {
16964 current5_
= begin5_
;
16967 if (current4_
== end4_
) {
16968 current4_
= begin4_
;
16971 if (current3_
== end3_
) {
16972 current3_
= begin3_
;
16975 if (current2_
== end2_
) {
16976 current2_
= begin2_
;
16979 ComputeCurrentValue();
16981 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
16982 return new Iterator(*this);
16984 virtual const ParamType
* Current() const { return current_value_
.get(); }
16985 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
16986 // Having the same base generator guarantees that the other
16987 // iterator is of the same type and we can downcast.
16988 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
16989 << "The program attempted to compare iterators "
16990 << "from different generators." << std::endl
;
16991 const Iterator
* typed_other
=
16992 CheckedDowncastToActualType
<const Iterator
>(&other
);
16993 // We must report iterators equal if they both point beyond their
16994 // respective ranges. That can happen in a variety of fashions,
16995 // so we have to consult AtEnd().
16996 return (AtEnd() && typed_other
->AtEnd()) ||
16998 current1_
== typed_other
->current1_
&&
16999 current2_
== typed_other
->current2_
&&
17000 current3_
== typed_other
->current3_
&&
17001 current4_
== typed_other
->current4_
&&
17002 current5_
== typed_other
->current5_
&&
17003 current6_
== typed_other
->current6_
&&
17004 current7_
== typed_other
->current7_
&&
17005 current8_
== typed_other
->current8_
&&
17006 current9_
== typed_other
->current9_
);
17010 Iterator(const Iterator
& other
)
17011 : base_(other
.base_
),
17012 begin1_(other
.begin1_
),
17013 end1_(other
.end1_
),
17014 current1_(other
.current1_
),
17015 begin2_(other
.begin2_
),
17016 end2_(other
.end2_
),
17017 current2_(other
.current2_
),
17018 begin3_(other
.begin3_
),
17019 end3_(other
.end3_
),
17020 current3_(other
.current3_
),
17021 begin4_(other
.begin4_
),
17022 end4_(other
.end4_
),
17023 current4_(other
.current4_
),
17024 begin5_(other
.begin5_
),
17025 end5_(other
.end5_
),
17026 current5_(other
.current5_
),
17027 begin6_(other
.begin6_
),
17028 end6_(other
.end6_
),
17029 current6_(other
.current6_
),
17030 begin7_(other
.begin7_
),
17031 end7_(other
.end7_
),
17032 current7_(other
.current7_
),
17033 begin8_(other
.begin8_
),
17034 end8_(other
.end8_
),
17035 current8_(other
.current8_
),
17036 begin9_(other
.begin9_
),
17037 end9_(other
.end9_
),
17038 current9_(other
.current9_
) {
17039 ComputeCurrentValue();
17042 void ComputeCurrentValue() {
17044 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
17045 *current4_
, *current5_
, *current6_
, *current7_
, *current8_
,
17048 bool AtEnd() const {
17049 // We must report iterator past the end of the range when either of the
17050 // component iterators has reached the end of its range.
17052 current1_
== end1_
||
17053 current2_
== end2_
||
17054 current3_
== end3_
||
17055 current4_
== end4_
||
17056 current5_
== end5_
||
17057 current6_
== end6_
||
17058 current7_
== end7_
||
17059 current8_
== end8_
||
17060 current9_
== end9_
;
17063 // No implementation - assignment is unsupported.
17064 void operator=(const Iterator
& other
);
17066 const ParamGeneratorInterface
<ParamType
>* const base_
;
17067 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
17068 // current[i]_ is the actual traversing iterator.
17069 const typename ParamGenerator
<T1
>::iterator begin1_
;
17070 const typename ParamGenerator
<T1
>::iterator end1_
;
17071 typename ParamGenerator
<T1
>::iterator current1_
;
17072 const typename ParamGenerator
<T2
>::iterator begin2_
;
17073 const typename ParamGenerator
<T2
>::iterator end2_
;
17074 typename ParamGenerator
<T2
>::iterator current2_
;
17075 const typename ParamGenerator
<T3
>::iterator begin3_
;
17076 const typename ParamGenerator
<T3
>::iterator end3_
;
17077 typename ParamGenerator
<T3
>::iterator current3_
;
17078 const typename ParamGenerator
<T4
>::iterator begin4_
;
17079 const typename ParamGenerator
<T4
>::iterator end4_
;
17080 typename ParamGenerator
<T4
>::iterator current4_
;
17081 const typename ParamGenerator
<T5
>::iterator begin5_
;
17082 const typename ParamGenerator
<T5
>::iterator end5_
;
17083 typename ParamGenerator
<T5
>::iterator current5_
;
17084 const typename ParamGenerator
<T6
>::iterator begin6_
;
17085 const typename ParamGenerator
<T6
>::iterator end6_
;
17086 typename ParamGenerator
<T6
>::iterator current6_
;
17087 const typename ParamGenerator
<T7
>::iterator begin7_
;
17088 const typename ParamGenerator
<T7
>::iterator end7_
;
17089 typename ParamGenerator
<T7
>::iterator current7_
;
17090 const typename ParamGenerator
<T8
>::iterator begin8_
;
17091 const typename ParamGenerator
<T8
>::iterator end8_
;
17092 typename ParamGenerator
<T8
>::iterator current8_
;
17093 const typename ParamGenerator
<T9
>::iterator begin9_
;
17094 const typename ParamGenerator
<T9
>::iterator end9_
;
17095 typename ParamGenerator
<T9
>::iterator current9_
;
17096 linked_ptr
<ParamType
> current_value_
;
17097 }; // class CartesianProductGenerator9::Iterator
17099 // No implementation - assignment is unsupported.
17100 void operator=(const CartesianProductGenerator9
& other
);
17102 const ParamGenerator
<T1
> g1_
;
17103 const ParamGenerator
<T2
> g2_
;
17104 const ParamGenerator
<T3
> g3_
;
17105 const ParamGenerator
<T4
> g4_
;
17106 const ParamGenerator
<T5
> g5_
;
17107 const ParamGenerator
<T6
> g6_
;
17108 const ParamGenerator
<T7
> g7_
;
17109 const ParamGenerator
<T8
> g8_
;
17110 const ParamGenerator
<T9
> g9_
;
17111 }; // class CartesianProductGenerator9
17114 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17115 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
17116 class CartesianProductGenerator10
17117 : public ParamGeneratorInterface
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
,
17118 T7
, T8
, T9
, T10
> > {
17120 typedef ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
> ParamType
;
17122 CartesianProductGenerator10(const ParamGenerator
<T1
>& g1
,
17123 const ParamGenerator
<T2
>& g2
, const ParamGenerator
<T3
>& g3
,
17124 const ParamGenerator
<T4
>& g4
, const ParamGenerator
<T5
>& g5
,
17125 const ParamGenerator
<T6
>& g6
, const ParamGenerator
<T7
>& g7
,
17126 const ParamGenerator
<T8
>& g8
, const ParamGenerator
<T9
>& g9
,
17127 const ParamGenerator
<T10
>& g10
)
17128 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
), g8_(g8
),
17129 g9_(g9
), g10_(g10
) {}
17130 virtual ~CartesianProductGenerator10() {}
17132 virtual ParamIteratorInterface
<ParamType
>* Begin() const {
17133 return new Iterator(this, g1_
, g1_
.begin(), g2_
, g2_
.begin(), g3_
,
17134 g3_
.begin(), g4_
, g4_
.begin(), g5_
, g5_
.begin(), g6_
, g6_
.begin(), g7_
,
17135 g7_
.begin(), g8_
, g8_
.begin(), g9_
, g9_
.begin(), g10_
, g10_
.begin());
17137 virtual ParamIteratorInterface
<ParamType
>* End() const {
17138 return new Iterator(this, g1_
, g1_
.end(), g2_
, g2_
.end(), g3_
, g3_
.end(),
17139 g4_
, g4_
.end(), g5_
, g5_
.end(), g6_
, g6_
.end(), g7_
, g7_
.end(), g8_
,
17140 g8_
.end(), g9_
, g9_
.end(), g10_
, g10_
.end());
17144 class Iterator
: public ParamIteratorInterface
<ParamType
> {
17146 Iterator(const ParamGeneratorInterface
<ParamType
>* base
,
17147 const ParamGenerator
<T1
>& g1
,
17148 const typename ParamGenerator
<T1
>::iterator
& current1
,
17149 const ParamGenerator
<T2
>& g2
,
17150 const typename ParamGenerator
<T2
>::iterator
& current2
,
17151 const ParamGenerator
<T3
>& g3
,
17152 const typename ParamGenerator
<T3
>::iterator
& current3
,
17153 const ParamGenerator
<T4
>& g4
,
17154 const typename ParamGenerator
<T4
>::iterator
& current4
,
17155 const ParamGenerator
<T5
>& g5
,
17156 const typename ParamGenerator
<T5
>::iterator
& current5
,
17157 const ParamGenerator
<T6
>& g6
,
17158 const typename ParamGenerator
<T6
>::iterator
& current6
,
17159 const ParamGenerator
<T7
>& g7
,
17160 const typename ParamGenerator
<T7
>::iterator
& current7
,
17161 const ParamGenerator
<T8
>& g8
,
17162 const typename ParamGenerator
<T8
>::iterator
& current8
,
17163 const ParamGenerator
<T9
>& g9
,
17164 const typename ParamGenerator
<T9
>::iterator
& current9
,
17165 const ParamGenerator
<T10
>& g10
,
17166 const typename ParamGenerator
<T10
>::iterator
& current10
)
17168 begin1_(g1
.begin()), end1_(g1
.end()), current1_(current1
),
17169 begin2_(g2
.begin()), end2_(g2
.end()), current2_(current2
),
17170 begin3_(g3
.begin()), end3_(g3
.end()), current3_(current3
),
17171 begin4_(g4
.begin()), end4_(g4
.end()), current4_(current4
),
17172 begin5_(g5
.begin()), end5_(g5
.end()), current5_(current5
),
17173 begin6_(g6
.begin()), end6_(g6
.end()), current6_(current6
),
17174 begin7_(g7
.begin()), end7_(g7
.end()), current7_(current7
),
17175 begin8_(g8
.begin()), end8_(g8
.end()), current8_(current8
),
17176 begin9_(g9
.begin()), end9_(g9
.end()), current9_(current9
),
17177 begin10_(g10
.begin()), end10_(g10
.end()), current10_(current10
) {
17178 ComputeCurrentValue();
17180 virtual ~Iterator() {}
17182 virtual const ParamGeneratorInterface
<ParamType
>* BaseGenerator() const {
17185 // Advance should not be called on beyond-of-range iterators
17186 // so no component iterators must be beyond end of range, either.
17187 virtual void Advance() {
17190 if (current10_
== end10_
) {
17191 current10_
= begin10_
;
17194 if (current9_
== end9_
) {
17195 current9_
= begin9_
;
17198 if (current8_
== end8_
) {
17199 current8_
= begin8_
;
17202 if (current7_
== end7_
) {
17203 current7_
= begin7_
;
17206 if (current6_
== end6_
) {
17207 current6_
= begin6_
;
17210 if (current5_
== end5_
) {
17211 current5_
= begin5_
;
17214 if (current4_
== end4_
) {
17215 current4_
= begin4_
;
17218 if (current3_
== end3_
) {
17219 current3_
= begin3_
;
17222 if (current2_
== end2_
) {
17223 current2_
= begin2_
;
17226 ComputeCurrentValue();
17228 virtual ParamIteratorInterface
<ParamType
>* Clone() const {
17229 return new Iterator(*this);
17231 virtual const ParamType
* Current() const { return current_value_
.get(); }
17232 virtual bool Equals(const ParamIteratorInterface
<ParamType
>& other
) const {
17233 // Having the same base generator guarantees that the other
17234 // iterator is of the same type and we can downcast.
17235 GTEST_CHECK_(BaseGenerator() == other
.BaseGenerator())
17236 << "The program attempted to compare iterators "
17237 << "from different generators." << std::endl
;
17238 const Iterator
* typed_other
=
17239 CheckedDowncastToActualType
<const Iterator
>(&other
);
17240 // We must report iterators equal if they both point beyond their
17241 // respective ranges. That can happen in a variety of fashions,
17242 // so we have to consult AtEnd().
17243 return (AtEnd() && typed_other
->AtEnd()) ||
17245 current1_
== typed_other
->current1_
&&
17246 current2_
== typed_other
->current2_
&&
17247 current3_
== typed_other
->current3_
&&
17248 current4_
== typed_other
->current4_
&&
17249 current5_
== typed_other
->current5_
&&
17250 current6_
== typed_other
->current6_
&&
17251 current7_
== typed_other
->current7_
&&
17252 current8_
== typed_other
->current8_
&&
17253 current9_
== typed_other
->current9_
&&
17254 current10_
== typed_other
->current10_
);
17258 Iterator(const Iterator
& other
)
17259 : base_(other
.base_
),
17260 begin1_(other
.begin1_
),
17261 end1_(other
.end1_
),
17262 current1_(other
.current1_
),
17263 begin2_(other
.begin2_
),
17264 end2_(other
.end2_
),
17265 current2_(other
.current2_
),
17266 begin3_(other
.begin3_
),
17267 end3_(other
.end3_
),
17268 current3_(other
.current3_
),
17269 begin4_(other
.begin4_
),
17270 end4_(other
.end4_
),
17271 current4_(other
.current4_
),
17272 begin5_(other
.begin5_
),
17273 end5_(other
.end5_
),
17274 current5_(other
.current5_
),
17275 begin6_(other
.begin6_
),
17276 end6_(other
.end6_
),
17277 current6_(other
.current6_
),
17278 begin7_(other
.begin7_
),
17279 end7_(other
.end7_
),
17280 current7_(other
.current7_
),
17281 begin8_(other
.begin8_
),
17282 end8_(other
.end8_
),
17283 current8_(other
.current8_
),
17284 begin9_(other
.begin9_
),
17285 end9_(other
.end9_
),
17286 current9_(other
.current9_
),
17287 begin10_(other
.begin10_
),
17288 end10_(other
.end10_
),
17289 current10_(other
.current10_
) {
17290 ComputeCurrentValue();
17293 void ComputeCurrentValue() {
17295 current_value_
.reset(new ParamType(*current1_
, *current2_
, *current3_
,
17296 *current4_
, *current5_
, *current6_
, *current7_
, *current8_
,
17297 *current9_
, *current10_
));
17299 bool AtEnd() const {
17300 // We must report iterator past the end of the range when either of the
17301 // component iterators has reached the end of its range.
17303 current1_
== end1_
||
17304 current2_
== end2_
||
17305 current3_
== end3_
||
17306 current4_
== end4_
||
17307 current5_
== end5_
||
17308 current6_
== end6_
||
17309 current7_
== end7_
||
17310 current8_
== end8_
||
17311 current9_
== end9_
||
17312 current10_
== end10_
;
17315 // No implementation - assignment is unsupported.
17316 void operator=(const Iterator
& other
);
17318 const ParamGeneratorInterface
<ParamType
>* const base_
;
17319 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
17320 // current[i]_ is the actual traversing iterator.
17321 const typename ParamGenerator
<T1
>::iterator begin1_
;
17322 const typename ParamGenerator
<T1
>::iterator end1_
;
17323 typename ParamGenerator
<T1
>::iterator current1_
;
17324 const typename ParamGenerator
<T2
>::iterator begin2_
;
17325 const typename ParamGenerator
<T2
>::iterator end2_
;
17326 typename ParamGenerator
<T2
>::iterator current2_
;
17327 const typename ParamGenerator
<T3
>::iterator begin3_
;
17328 const typename ParamGenerator
<T3
>::iterator end3_
;
17329 typename ParamGenerator
<T3
>::iterator current3_
;
17330 const typename ParamGenerator
<T4
>::iterator begin4_
;
17331 const typename ParamGenerator
<T4
>::iterator end4_
;
17332 typename ParamGenerator
<T4
>::iterator current4_
;
17333 const typename ParamGenerator
<T5
>::iterator begin5_
;
17334 const typename ParamGenerator
<T5
>::iterator end5_
;
17335 typename ParamGenerator
<T5
>::iterator current5_
;
17336 const typename ParamGenerator
<T6
>::iterator begin6_
;
17337 const typename ParamGenerator
<T6
>::iterator end6_
;
17338 typename ParamGenerator
<T6
>::iterator current6_
;
17339 const typename ParamGenerator
<T7
>::iterator begin7_
;
17340 const typename ParamGenerator
<T7
>::iterator end7_
;
17341 typename ParamGenerator
<T7
>::iterator current7_
;
17342 const typename ParamGenerator
<T8
>::iterator begin8_
;
17343 const typename ParamGenerator
<T8
>::iterator end8_
;
17344 typename ParamGenerator
<T8
>::iterator current8_
;
17345 const typename ParamGenerator
<T9
>::iterator begin9_
;
17346 const typename ParamGenerator
<T9
>::iterator end9_
;
17347 typename ParamGenerator
<T9
>::iterator current9_
;
17348 const typename ParamGenerator
<T10
>::iterator begin10_
;
17349 const typename ParamGenerator
<T10
>::iterator end10_
;
17350 typename ParamGenerator
<T10
>::iterator current10_
;
17351 linked_ptr
<ParamType
> current_value_
;
17352 }; // class CartesianProductGenerator10::Iterator
17354 // No implementation - assignment is unsupported.
17355 void operator=(const CartesianProductGenerator10
& other
);
17357 const ParamGenerator
<T1
> g1_
;
17358 const ParamGenerator
<T2
> g2_
;
17359 const ParamGenerator
<T3
> g3_
;
17360 const ParamGenerator
<T4
> g4_
;
17361 const ParamGenerator
<T5
> g5_
;
17362 const ParamGenerator
<T6
> g6_
;
17363 const ParamGenerator
<T7
> g7_
;
17364 const ParamGenerator
<T8
> g8_
;
17365 const ParamGenerator
<T9
> g9_
;
17366 const ParamGenerator
<T10
> g10_
;
17367 }; // class CartesianProductGenerator10
17370 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17372 // Helper classes providing Combine() with polymorphic features. They allow
17373 // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
17374 // convertible to U.
17376 template <class Generator1
, class Generator2
>
17377 class CartesianProductHolder2
{
17379 CartesianProductHolder2(const Generator1
& g1
, const Generator2
& g2
)
17380 : g1_(g1
), g2_(g2
) {}
17381 template <typename T1
, typename T2
>
17382 operator ParamGenerator
< ::testing::tuple
<T1
, T2
> >() const {
17383 return ParamGenerator
< ::testing::tuple
<T1
, T2
> >(
17384 new CartesianProductGenerator2
<T1
, T2
>(
17385 static_cast<ParamGenerator
<T1
> >(g1_
),
17386 static_cast<ParamGenerator
<T2
> >(g2_
)));
17390 // No implementation - assignment is unsupported.
17391 void operator=(const CartesianProductHolder2
& other
);
17393 const Generator1 g1_
;
17394 const Generator2 g2_
;
17395 }; // class CartesianProductHolder2
17397 template <class Generator1
, class Generator2
, class Generator3
>
17398 class CartesianProductHolder3
{
17400 CartesianProductHolder3(const Generator1
& g1
, const Generator2
& g2
,
17401 const Generator3
& g3
)
17402 : g1_(g1
), g2_(g2
), g3_(g3
) {}
17403 template <typename T1
, typename T2
, typename T3
>
17404 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
> >() const {
17405 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
> >(
17406 new CartesianProductGenerator3
<T1
, T2
, T3
>(
17407 static_cast<ParamGenerator
<T1
> >(g1_
),
17408 static_cast<ParamGenerator
<T2
> >(g2_
),
17409 static_cast<ParamGenerator
<T3
> >(g3_
)));
17413 // No implementation - assignment is unsupported.
17414 void operator=(const CartesianProductHolder3
& other
);
17416 const Generator1 g1_
;
17417 const Generator2 g2_
;
17418 const Generator3 g3_
;
17419 }; // class CartesianProductHolder3
17421 template <class Generator1
, class Generator2
, class Generator3
,
17423 class CartesianProductHolder4
{
17425 CartesianProductHolder4(const Generator1
& g1
, const Generator2
& g2
,
17426 const Generator3
& g3
, const Generator4
& g4
)
17427 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
) {}
17428 template <typename T1
, typename T2
, typename T3
, typename T4
>
17429 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
> >() const {
17430 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
> >(
17431 new CartesianProductGenerator4
<T1
, T2
, T3
, T4
>(
17432 static_cast<ParamGenerator
<T1
> >(g1_
),
17433 static_cast<ParamGenerator
<T2
> >(g2_
),
17434 static_cast<ParamGenerator
<T3
> >(g3_
),
17435 static_cast<ParamGenerator
<T4
> >(g4_
)));
17439 // No implementation - assignment is unsupported.
17440 void operator=(const CartesianProductHolder4
& other
);
17442 const Generator1 g1_
;
17443 const Generator2 g2_
;
17444 const Generator3 g3_
;
17445 const Generator4 g4_
;
17446 }; // class CartesianProductHolder4
17448 template <class Generator1
, class Generator2
, class Generator3
,
17449 class Generator4
, class Generator5
>
17450 class CartesianProductHolder5
{
17452 CartesianProductHolder5(const Generator1
& g1
, const Generator2
& g2
,
17453 const Generator3
& g3
, const Generator4
& g4
, const Generator5
& g5
)
17454 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
) {}
17455 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
17456 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
> >() const {
17457 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
> >(
17458 new CartesianProductGenerator5
<T1
, T2
, T3
, T4
, T5
>(
17459 static_cast<ParamGenerator
<T1
> >(g1_
),
17460 static_cast<ParamGenerator
<T2
> >(g2_
),
17461 static_cast<ParamGenerator
<T3
> >(g3_
),
17462 static_cast<ParamGenerator
<T4
> >(g4_
),
17463 static_cast<ParamGenerator
<T5
> >(g5_
)));
17467 // No implementation - assignment is unsupported.
17468 void operator=(const CartesianProductHolder5
& other
);
17470 const Generator1 g1_
;
17471 const Generator2 g2_
;
17472 const Generator3 g3_
;
17473 const Generator4 g4_
;
17474 const Generator5 g5_
;
17475 }; // class CartesianProductHolder5
17477 template <class Generator1
, class Generator2
, class Generator3
,
17478 class Generator4
, class Generator5
, class Generator6
>
17479 class CartesianProductHolder6
{
17481 CartesianProductHolder6(const Generator1
& g1
, const Generator2
& g2
,
17482 const Generator3
& g3
, const Generator4
& g4
, const Generator5
& g5
,
17483 const Generator6
& g6
)
17484 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
) {}
17485 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17487 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
> >() const {
17488 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
> >(
17489 new CartesianProductGenerator6
<T1
, T2
, T3
, T4
, T5
, T6
>(
17490 static_cast<ParamGenerator
<T1
> >(g1_
),
17491 static_cast<ParamGenerator
<T2
> >(g2_
),
17492 static_cast<ParamGenerator
<T3
> >(g3_
),
17493 static_cast<ParamGenerator
<T4
> >(g4_
),
17494 static_cast<ParamGenerator
<T5
> >(g5_
),
17495 static_cast<ParamGenerator
<T6
> >(g6_
)));
17499 // No implementation - assignment is unsupported.
17500 void operator=(const CartesianProductHolder6
& other
);
17502 const Generator1 g1_
;
17503 const Generator2 g2_
;
17504 const Generator3 g3_
;
17505 const Generator4 g4_
;
17506 const Generator5 g5_
;
17507 const Generator6 g6_
;
17508 }; // class CartesianProductHolder6
17510 template <class Generator1
, class Generator2
, class Generator3
,
17511 class Generator4
, class Generator5
, class Generator6
, class Generator7
>
17512 class CartesianProductHolder7
{
17514 CartesianProductHolder7(const Generator1
& g1
, const Generator2
& g2
,
17515 const Generator3
& g3
, const Generator4
& g4
, const Generator5
& g5
,
17516 const Generator6
& g6
, const Generator7
& g7
)
17517 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
) {}
17518 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17519 typename T6
, typename T7
>
17520 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
,
17522 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> >(
17523 new CartesianProductGenerator7
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(
17524 static_cast<ParamGenerator
<T1
> >(g1_
),
17525 static_cast<ParamGenerator
<T2
> >(g2_
),
17526 static_cast<ParamGenerator
<T3
> >(g3_
),
17527 static_cast<ParamGenerator
<T4
> >(g4_
),
17528 static_cast<ParamGenerator
<T5
> >(g5_
),
17529 static_cast<ParamGenerator
<T6
> >(g6_
),
17530 static_cast<ParamGenerator
<T7
> >(g7_
)));
17534 // No implementation - assignment is unsupported.
17535 void operator=(const CartesianProductHolder7
& other
);
17537 const Generator1 g1_
;
17538 const Generator2 g2_
;
17539 const Generator3 g3_
;
17540 const Generator4 g4_
;
17541 const Generator5 g5_
;
17542 const Generator6 g6_
;
17543 const Generator7 g7_
;
17544 }; // class CartesianProductHolder7
17546 template <class Generator1
, class Generator2
, class Generator3
,
17547 class Generator4
, class Generator5
, class Generator6
, class Generator7
,
17549 class CartesianProductHolder8
{
17551 CartesianProductHolder8(const Generator1
& g1
, const Generator2
& g2
,
17552 const Generator3
& g3
, const Generator4
& g4
, const Generator5
& g5
,
17553 const Generator6
& g6
, const Generator7
& g7
, const Generator8
& g8
)
17554 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
),
17556 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17557 typename T6
, typename T7
, typename T8
>
17558 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
,
17560 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
> >(
17561 new CartesianProductGenerator8
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
>(
17562 static_cast<ParamGenerator
<T1
> >(g1_
),
17563 static_cast<ParamGenerator
<T2
> >(g2_
),
17564 static_cast<ParamGenerator
<T3
> >(g3_
),
17565 static_cast<ParamGenerator
<T4
> >(g4_
),
17566 static_cast<ParamGenerator
<T5
> >(g5_
),
17567 static_cast<ParamGenerator
<T6
> >(g6_
),
17568 static_cast<ParamGenerator
<T7
> >(g7_
),
17569 static_cast<ParamGenerator
<T8
> >(g8_
)));
17573 // No implementation - assignment is unsupported.
17574 void operator=(const CartesianProductHolder8
& other
);
17576 const Generator1 g1_
;
17577 const Generator2 g2_
;
17578 const Generator3 g3_
;
17579 const Generator4 g4_
;
17580 const Generator5 g5_
;
17581 const Generator6 g6_
;
17582 const Generator7 g7_
;
17583 const Generator8 g8_
;
17584 }; // class CartesianProductHolder8
17586 template <class Generator1
, class Generator2
, class Generator3
,
17587 class Generator4
, class Generator5
, class Generator6
, class Generator7
,
17588 class Generator8
, class Generator9
>
17589 class CartesianProductHolder9
{
17591 CartesianProductHolder9(const Generator1
& g1
, const Generator2
& g2
,
17592 const Generator3
& g3
, const Generator4
& g4
, const Generator5
& g5
,
17593 const Generator6
& g6
, const Generator7
& g7
, const Generator8
& g8
,
17594 const Generator9
& g9
)
17595 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
), g8_(g8
),
17597 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17598 typename T6
, typename T7
, typename T8
, typename T9
>
17599 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
,
17601 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
,
17603 new CartesianProductGenerator9
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
>(
17604 static_cast<ParamGenerator
<T1
> >(g1_
),
17605 static_cast<ParamGenerator
<T2
> >(g2_
),
17606 static_cast<ParamGenerator
<T3
> >(g3_
),
17607 static_cast<ParamGenerator
<T4
> >(g4_
),
17608 static_cast<ParamGenerator
<T5
> >(g5_
),
17609 static_cast<ParamGenerator
<T6
> >(g6_
),
17610 static_cast<ParamGenerator
<T7
> >(g7_
),
17611 static_cast<ParamGenerator
<T8
> >(g8_
),
17612 static_cast<ParamGenerator
<T9
> >(g9_
)));
17616 // No implementation - assignment is unsupported.
17617 void operator=(const CartesianProductHolder9
& other
);
17619 const Generator1 g1_
;
17620 const Generator2 g2_
;
17621 const Generator3 g3_
;
17622 const Generator4 g4_
;
17623 const Generator5 g5_
;
17624 const Generator6 g6_
;
17625 const Generator7 g7_
;
17626 const Generator8 g8_
;
17627 const Generator9 g9_
;
17628 }; // class CartesianProductHolder9
17630 template <class Generator1
, class Generator2
, class Generator3
,
17631 class Generator4
, class Generator5
, class Generator6
, class Generator7
,
17632 class Generator8
, class Generator9
, class Generator10
>
17633 class CartesianProductHolder10
{
17635 CartesianProductHolder10(const Generator1
& g1
, const Generator2
& g2
,
17636 const Generator3
& g3
, const Generator4
& g4
, const Generator5
& g5
,
17637 const Generator6
& g6
, const Generator7
& g7
, const Generator8
& g8
,
17638 const Generator9
& g9
, const Generator10
& g10
)
17639 : g1_(g1
), g2_(g2
), g3_(g3
), g4_(g4
), g5_(g5
), g6_(g6
), g7_(g7
), g8_(g8
),
17640 g9_(g9
), g10_(g10
) {}
17641 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17642 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
17643 operator ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
,
17645 return ParamGenerator
< ::testing::tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
,
17647 new CartesianProductGenerator10
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
,
17649 static_cast<ParamGenerator
<T1
> >(g1_
),
17650 static_cast<ParamGenerator
<T2
> >(g2_
),
17651 static_cast<ParamGenerator
<T3
> >(g3_
),
17652 static_cast<ParamGenerator
<T4
> >(g4_
),
17653 static_cast<ParamGenerator
<T5
> >(g5_
),
17654 static_cast<ParamGenerator
<T6
> >(g6_
),
17655 static_cast<ParamGenerator
<T7
> >(g7_
),
17656 static_cast<ParamGenerator
<T8
> >(g8_
),
17657 static_cast<ParamGenerator
<T9
> >(g9_
),
17658 static_cast<ParamGenerator
<T10
> >(g10_
)));
17662 // No implementation - assignment is unsupported.
17663 void operator=(const CartesianProductHolder10
& other
);
17665 const Generator1 g1_
;
17666 const Generator2 g2_
;
17667 const Generator3 g3_
;
17668 const Generator4 g4_
;
17669 const Generator5 g5_
;
17670 const Generator6 g6_
;
17671 const Generator7 g7_
;
17672 const Generator8 g8_
;
17673 const Generator9 g9_
;
17674 const Generator10 g10_
;
17675 }; // class CartesianProductHolder10
17677 # endif // GTEST_HAS_COMBINE
17679 } // namespace internal
17680 } // namespace testing
17682 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
17684 namespace testing
{
17686 // Functions producing parameter generators.
17688 // Google Test uses these generators to produce parameters for value-
17689 // parameterized tests. When a parameterized test case is instantiated
17690 // with a particular generator, Google Test creates and runs tests
17691 // for each element in the sequence produced by the generator.
17693 // In the following sample, tests from test case FooTest are instantiated
17694 // each three times with parameter values 3, 5, and 8:
17696 // class FooTest : public TestWithParam<int> { ... };
17698 // TEST_P(FooTest, TestThis) {
17700 // TEST_P(FooTest, TestThat) {
17702 // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
17705 // Range() returns generators providing sequences of values in a range.
17708 // Range(start, end)
17709 // - returns a generator producing a sequence of values {start, start+1,
17710 // start+2, ..., }.
17711 // Range(start, end, step)
17712 // - returns a generator producing a sequence of values {start, start+step,
17713 // start+step+step, ..., }.
17715 // * The generated sequences never include end. For example, Range(1, 5)
17716 // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
17717 // returns a generator producing {1, 3, 5, 7}.
17718 // * start and end must have the same type. That type may be any integral or
17719 // floating-point type or a user defined type satisfying these conditions:
17720 // * It must be assignable (have operator=() defined).
17721 // * It must have operator+() (operator+(int-compatible type) for
17722 // two-operand version).
17723 // * It must have operator<() defined.
17724 // Elements in the resulting sequences will also have that type.
17725 // * Condition start < end must be satisfied in order for resulting sequences
17726 // to contain any elements.
17728 template <typename T
, typename IncrementT
>
17729 internal::ParamGenerator
<T
> Range(T start
, T end
, IncrementT step
) {
17730 return internal::ParamGenerator
<T
>(
17731 new internal::RangeGenerator
<T
, IncrementT
>(start
, end
, step
));
17734 template <typename T
>
17735 internal::ParamGenerator
<T
> Range(T start
, T end
) {
17736 return Range(start
, end
, 1);
17739 // ValuesIn() function allows generation of tests with parameters coming from
17743 // ValuesIn(const T (&array)[N])
17744 // - returns a generator producing sequences with elements from
17745 // a C-style array.
17746 // ValuesIn(const Container& container)
17747 // - returns a generator producing sequences with elements from
17748 // an STL-style container.
17749 // ValuesIn(Iterator begin, Iterator end)
17750 // - returns a generator producing sequences with elements from
17751 // a range [begin, end) defined by a pair of STL-style iterators. These
17752 // iterators can also be plain C pointers.
17754 // Please note that ValuesIn copies the values from the containers
17755 // passed in and keeps them to generate tests in RUN_ALL_TESTS().
17759 // This instantiates tests from test case StringTest
17760 // each with C-string values of "foo", "bar", and "baz":
17762 // const char* strings[] = {"foo", "bar", "baz"};
17763 // INSTANTIATE_TEST_CASE_P(StringSequence, StringTest, ValuesIn(strings));
17765 // This instantiates tests from test case StlStringTest
17766 // each with STL strings with values "a" and "b":
17768 // ::std::vector< ::std::string> GetParameterStrings() {
17769 // ::std::vector< ::std::string> v;
17770 // v.push_back("a");
17771 // v.push_back("b");
17775 // INSTANTIATE_TEST_CASE_P(CharSequence,
17777 // ValuesIn(GetParameterStrings()));
17780 // This will also instantiate tests from CharTest
17781 // each with parameter values 'a' and 'b':
17783 // ::std::list<char> GetParameterChars() {
17784 // ::std::list<char> list;
17785 // list.push_back('a');
17786 // list.push_back('b');
17789 // ::std::list<char> l = GetParameterChars();
17790 // INSTANTIATE_TEST_CASE_P(CharSequence2,
17792 // ValuesIn(l.begin(), l.end()));
17794 template <typename ForwardIterator
>
17795 internal::ParamGenerator
<
17796 typename ::testing::internal::IteratorTraits
<ForwardIterator
>::value_type
>
17797 ValuesIn(ForwardIterator begin
, ForwardIterator end
) {
17798 typedef typename ::testing::internal::IteratorTraits
<ForwardIterator
>
17799 ::value_type ParamType
;
17800 return internal::ParamGenerator
<ParamType
>(
17801 new internal::ValuesInIteratorRangeGenerator
<ParamType
>(begin
, end
));
17804 template <typename T
, size_t N
>
17805 internal::ParamGenerator
<T
> ValuesIn(const T (&array
)[N
]) {
17806 return ValuesIn(array
, array
+ N
);
17809 template <class Container
>
17810 internal::ParamGenerator
<typename
Container::value_type
> ValuesIn(
17811 const Container
& container
) {
17812 return ValuesIn(container
.begin(), container
.end());
17815 // Values() allows generating tests from explicitly specified list of
17819 // Values(T v1, T v2, ..., T vN)
17820 // - returns a generator producing sequences with elements v1, v2, ..., vN.
17822 // For example, this instantiates tests from test case BarTest each
17823 // with values "one", "two", and "three":
17825 // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
17827 // This instantiates tests from test case BazTest each with values 1, 2, 3.5.
17828 // The exact type of values will depend on the type of parameter in BazTest.
17830 // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
17832 // Currently, Values() supports from 1 to 50 parameters.
17834 template <typename T1
>
17835 internal::ValueArray1
<T1
> Values(T1 v1
) {
17836 return internal::ValueArray1
<T1
>(v1
);
17839 template <typename T1
, typename T2
>
17840 internal::ValueArray2
<T1
, T2
> Values(T1 v1
, T2 v2
) {
17841 return internal::ValueArray2
<T1
, T2
>(v1
, v2
);
17844 template <typename T1
, typename T2
, typename T3
>
17845 internal::ValueArray3
<T1
, T2
, T3
> Values(T1 v1
, T2 v2
, T3 v3
) {
17846 return internal::ValueArray3
<T1
, T2
, T3
>(v1
, v2
, v3
);
17849 template <typename T1
, typename T2
, typename T3
, typename T4
>
17850 internal::ValueArray4
<T1
, T2
, T3
, T4
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
) {
17851 return internal::ValueArray4
<T1
, T2
, T3
, T4
>(v1
, v2
, v3
, v4
);
17854 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
>
17855 internal::ValueArray5
<T1
, T2
, T3
, T4
, T5
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
,
17857 return internal::ValueArray5
<T1
, T2
, T3
, T4
, T5
>(v1
, v2
, v3
, v4
, v5
);
17860 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17862 internal::ValueArray6
<T1
, T2
, T3
, T4
, T5
, T6
> Values(T1 v1
, T2 v2
, T3 v3
,
17863 T4 v4
, T5 v5
, T6 v6
) {
17864 return internal::ValueArray6
<T1
, T2
, T3
, T4
, T5
, T6
>(v1
, v2
, v3
, v4
, v5
, v6
);
17867 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17868 typename T6
, typename T7
>
17869 internal::ValueArray7
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> Values(T1 v1
, T2 v2
, T3 v3
,
17870 T4 v4
, T5 v5
, T6 v6
, T7 v7
) {
17871 return internal::ValueArray7
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(v1
, v2
, v3
, v4
, v5
,
17875 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17876 typename T6
, typename T7
, typename T8
>
17877 internal::ValueArray8
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
> Values(T1 v1
, T2 v2
,
17878 T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
) {
17879 return internal::ValueArray8
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
>(v1
, v2
, v3
, v4
,
17883 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17884 typename T6
, typename T7
, typename T8
, typename T9
>
17885 internal::ValueArray9
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
> Values(T1 v1
, T2 v2
,
17886 T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
) {
17887 return internal::ValueArray9
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
>(v1
, v2
, v3
,
17888 v4
, v5
, v6
, v7
, v8
, v9
);
17891 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17892 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
>
17893 internal::ValueArray10
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
> Values(T1 v1
,
17894 T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
) {
17895 return internal::ValueArray10
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
>(v1
,
17896 v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
);
17899 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17900 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17902 internal::ValueArray11
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
,
17903 T11
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
17904 T10 v10
, T11 v11
) {
17905 return internal::ValueArray11
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
,
17906 T11
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
);
17909 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17910 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17911 typename T11
, typename T12
>
17912 internal::ValueArray12
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17913 T12
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
17914 T10 v10
, T11 v11
, T12 v12
) {
17915 return internal::ValueArray12
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17916 T12
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
);
17919 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17920 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17921 typename T11
, typename T12
, typename T13
>
17922 internal::ValueArray13
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
,
17923 T13
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
17924 T10 v10
, T11 v11
, T12 v12
, T13 v13
) {
17925 return internal::ValueArray13
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17926 T12
, T13
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
);
17929 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17930 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17931 typename T11
, typename T12
, typename T13
, typename T14
>
17932 internal::ValueArray14
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
17933 T14
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
17934 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
) {
17935 return internal::ValueArray14
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17936 T12
, T13
, T14
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
,
17940 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17941 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17942 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
>
17943 internal::ValueArray15
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
17944 T14
, T15
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
,
17945 T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
) {
17946 return internal::ValueArray15
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17947 T12
, T13
, T14
, T15
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
,
17951 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17952 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17953 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
17955 internal::ValueArray16
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
17956 T14
, T15
, T16
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
17957 T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
17959 return internal::ValueArray16
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17960 T12
, T13
, T14
, T15
, T16
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
,
17961 v12
, v13
, v14
, v15
, v16
);
17964 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17965 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17966 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
17967 typename T16
, typename T17
>
17968 internal::ValueArray17
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
17969 T14
, T15
, T16
, T17
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
17970 T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
17971 T16 v16
, T17 v17
) {
17972 return internal::ValueArray17
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17973 T12
, T13
, T14
, T15
, T16
, T17
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
,
17974 v11
, v12
, v13
, v14
, v15
, v16
, v17
);
17977 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17978 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17979 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
17980 typename T16
, typename T17
, typename T18
>
17981 internal::ValueArray18
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
17982 T14
, T15
, T16
, T17
, T18
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
,
17983 T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
17984 T16 v16
, T17 v17
, T18 v18
) {
17985 return internal::ValueArray18
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17986 T12
, T13
, T14
, T15
, T16
, T17
, T18
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
,
17987 v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
);
17990 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
17991 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
17992 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
17993 typename T16
, typename T17
, typename T18
, typename T19
>
17994 internal::ValueArray19
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
17995 T14
, T15
, T16
, T17
, T18
, T19
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
,
17996 T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
,
17997 T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
) {
17998 return internal::ValueArray19
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
17999 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
,
18000 v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
);
18003 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18004 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18005 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18006 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
>
18007 internal::ValueArray20
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18008 T14
, T15
, T16
, T17
, T18
, T19
, T20
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
,
18009 T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
,
18010 T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
) {
18011 return internal::ValueArray20
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18012 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
,
18013 v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
);
18016 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18017 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18018 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18019 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18021 internal::ValueArray21
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18022 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
,
18023 T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
,
18024 T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
) {
18025 return internal::ValueArray21
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18026 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
>(v1
, v2
, v3
, v4
, v5
, v6
,
18027 v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
);
18030 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18031 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18032 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18033 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18034 typename T21
, typename T22
>
18035 internal::ValueArray22
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18036 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
> Values(T1 v1
, T2 v2
, T3 v3
,
18037 T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
,
18038 T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
,
18039 T21 v21
, T22 v22
) {
18040 return internal::ValueArray22
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18041 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
>(v1
, v2
, v3
, v4
,
18042 v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
,
18046 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18047 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18048 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18049 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18050 typename T21
, typename T22
, typename T23
>
18051 internal::ValueArray23
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18052 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
> Values(T1 v1
, T2 v2
,
18053 T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
,
18054 T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
,
18055 T21 v21
, T22 v22
, T23 v23
) {
18056 return internal::ValueArray23
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18057 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
>(v1
, v2
, v3
,
18058 v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
,
18059 v20
, v21
, v22
, v23
);
18062 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18063 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18064 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18065 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18066 typename T21
, typename T22
, typename T23
, typename T24
>
18067 internal::ValueArray24
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18068 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
> Values(T1 v1
, T2 v2
,
18069 T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
,
18070 T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
,
18071 T21 v21
, T22 v22
, T23 v23
, T24 v24
) {
18072 return internal::ValueArray24
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18073 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
>(v1
, v2
,
18074 v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
,
18075 v19
, v20
, v21
, v22
, v23
, v24
);
18078 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18079 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18080 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18081 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18082 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
>
18083 internal::ValueArray25
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18084 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
> Values(T1 v1
,
18085 T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
,
18086 T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
,
18087 T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
) {
18088 return internal::ValueArray25
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18089 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
>(v1
,
18090 v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
,
18091 v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
);
18094 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18095 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18096 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18097 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18098 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18100 internal::ValueArray26
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18101 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18102 T26
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18103 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18104 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18106 return internal::ValueArray26
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18107 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18108 T26
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
,
18109 v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
);
18112 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18113 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18114 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18115 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18116 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18117 typename T26
, typename T27
>
18118 internal::ValueArray27
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18119 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
,
18120 T27
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18121 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18122 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18123 T26 v26
, T27 v27
) {
18124 return internal::ValueArray27
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18125 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18126 T26
, T27
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
,
18127 v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
);
18130 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18131 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18132 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18133 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18134 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18135 typename T26
, typename T27
, typename T28
>
18136 internal::ValueArray28
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18137 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
,
18138 T28
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18139 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18140 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18141 T26 v26
, T27 v27
, T28 v28
) {
18142 return internal::ValueArray28
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18143 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18144 T26
, T27
, T28
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
,
18145 v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
,
18149 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18150 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18151 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18152 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18153 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18154 typename T26
, typename T27
, typename T28
, typename T29
>
18155 internal::ValueArray29
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18156 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18157 T29
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18158 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18159 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18160 T26 v26
, T27 v27
, T28 v28
, T29 v29
) {
18161 return internal::ValueArray29
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18162 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18163 T26
, T27
, T28
, T29
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
,
18164 v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
,
18168 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18169 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18170 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18171 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18172 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18173 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
>
18174 internal::ValueArray30
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18175 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18176 T29
, T30
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
,
18177 T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
,
18178 T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
,
18179 T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
) {
18180 return internal::ValueArray30
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18181 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18182 T26
, T27
, T28
, T29
, T30
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
,
18183 v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
,
18184 v26
, v27
, v28
, v29
, v30
);
18187 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18188 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18189 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18190 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18191 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18192 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18194 internal::ValueArray31
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18195 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18196 T29
, T30
, T31
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
18197 T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
18198 T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
,
18199 T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
) {
18200 return internal::ValueArray31
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18201 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18202 T26
, T27
, T28
, T29
, T30
, T31
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
,
18203 v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
,
18204 v25
, v26
, v27
, v28
, v29
, v30
, v31
);
18207 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18208 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18209 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18210 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18211 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18212 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18213 typename T31
, typename T32
>
18214 internal::ValueArray32
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18215 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18216 T29
, T30
, T31
, T32
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
18217 T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
18218 T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
,
18219 T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
,
18221 return internal::ValueArray32
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18222 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18223 T26
, T27
, T28
, T29
, T30
, T31
, T32
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
,
18224 v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
,
18225 v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
);
18228 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18229 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18230 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18231 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18232 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18233 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18234 typename T31
, typename T32
, typename T33
>
18235 internal::ValueArray33
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18236 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18237 T29
, T30
, T31
, T32
, T33
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
,
18238 T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
18239 T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
,
18240 T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
,
18241 T32 v32
, T33 v33
) {
18242 return internal::ValueArray33
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18243 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18244 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
,
18245 v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
,
18246 v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
);
18249 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18250 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18251 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18252 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18253 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18254 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18255 typename T31
, typename T32
, typename T33
, typename T34
>
18256 internal::ValueArray34
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18257 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18258 T29
, T30
, T31
, T32
, T33
, T34
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
,
18259 T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
,
18260 T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
,
18261 T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
,
18262 T31 v31
, T32 v32
, T33 v33
, T34 v34
) {
18263 return internal::ValueArray34
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18264 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18265 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
,
18266 v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
,
18267 v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
);
18270 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18271 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18272 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18273 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18274 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18275 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18276 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
>
18277 internal::ValueArray35
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18278 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18279 T29
, T30
, T31
, T32
, T33
, T34
, T35
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
,
18280 T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
,
18281 T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
,
18282 T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
,
18283 T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
) {
18284 return internal::ValueArray35
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18285 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18286 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
>(v1
, v2
, v3
, v4
, v5
, v6
,
18287 v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
,
18288 v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
);
18291 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18292 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18293 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18294 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18295 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18296 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18297 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18299 internal::ValueArray36
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18300 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18301 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
,
18302 T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
,
18303 T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
,
18304 T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
,
18305 T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
) {
18306 return internal::ValueArray36
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18307 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18308 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
>(v1
, v2
, v3
, v4
,
18309 v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
,
18310 v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
,
18314 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18315 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18316 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18317 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18318 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18319 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18320 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18321 typename T36
, typename T37
>
18322 internal::ValueArray37
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18323 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18324 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
> Values(T1 v1
, T2 v2
, T3 v3
,
18325 T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
,
18326 T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
,
18327 T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
,
18328 T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
,
18330 return internal::ValueArray37
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18331 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18332 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
>(v1
, v2
, v3
,
18333 v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
,
18334 v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
,
18335 v34
, v35
, v36
, v37
);
18338 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18339 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18340 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18341 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18342 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18343 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18344 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18345 typename T36
, typename T37
, typename T38
>
18346 internal::ValueArray38
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18347 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18348 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
> Values(T1 v1
, T2 v2
,
18349 T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
,
18350 T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
,
18351 T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
,
18352 T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
,
18353 T37 v37
, T38 v38
) {
18354 return internal::ValueArray38
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18355 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18356 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
>(v1
, v2
,
18357 v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
,
18358 v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
,
18359 v33
, v34
, v35
, v36
, v37
, v38
);
18362 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18363 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18364 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18365 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18366 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18367 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18368 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18369 typename T36
, typename T37
, typename T38
, typename T39
>
18370 internal::ValueArray39
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18371 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18372 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
> Values(T1 v1
, T2 v2
,
18373 T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
,
18374 T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
,
18375 T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
,
18376 T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
,
18377 T37 v37
, T38 v38
, T39 v39
) {
18378 return internal::ValueArray39
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18379 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18380 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
>(v1
,
18381 v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
,
18382 v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
,
18383 v32
, v33
, v34
, v35
, v36
, v37
, v38
, v39
);
18386 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18387 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18388 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18389 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18390 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18391 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18392 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18393 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
>
18394 internal::ValueArray40
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18395 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18396 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
> Values(T1 v1
,
18397 T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
,
18398 T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
,
18399 T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
,
18400 T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
,
18401 T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
) {
18402 return internal::ValueArray40
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18403 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18404 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18405 T40
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
,
18406 v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
,
18407 v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
, v38
, v39
, v40
);
18410 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18411 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18412 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18413 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18414 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18415 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18416 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18417 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18419 internal::ValueArray41
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18420 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18421 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
,
18422 T41
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18423 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18424 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18425 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
18426 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
) {
18427 return internal::ValueArray41
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18428 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18429 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18430 T40
, T41
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
,
18431 v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
,
18432 v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
, v38
, v39
, v40
, v41
);
18435 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18436 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18437 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18438 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18439 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18440 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18441 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18442 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18443 typename T41
, typename T42
>
18444 internal::ValueArray42
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18445 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18446 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
,
18447 T42
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18448 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18449 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18450 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
18451 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
18453 return internal::ValueArray42
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18454 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18455 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18456 T40
, T41
, T42
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
,
18457 v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
,
18458 v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
, v38
, v39
, v40
, v41
,
18462 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18463 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18464 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18465 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18466 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18467 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18468 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18469 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18470 typename T41
, typename T42
, typename T43
>
18471 internal::ValueArray43
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18472 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18473 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
,
18474 T43
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18475 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18476 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18477 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
18478 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
18479 T42 v42
, T43 v43
) {
18480 return internal::ValueArray43
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18481 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18482 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18483 T40
, T41
, T42
, T43
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
,
18484 v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
, v26
,
18485 v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
, v38
, v39
, v40
,
18489 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18490 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18491 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18492 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18493 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18494 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18495 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18496 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18497 typename T41
, typename T42
, typename T43
, typename T44
>
18498 internal::ValueArray44
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18499 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18500 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18501 T44
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
,
18502 T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
, T17 v17
,
18503 T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
, T25 v25
,
18504 T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
, T33 v33
,
18505 T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
, T41 v41
,
18506 T42 v42
, T43 v43
, T44 v44
) {
18507 return internal::ValueArray44
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18508 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18509 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18510 T40
, T41
, T42
, T43
, T44
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
, v11
,
18511 v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
, v25
,
18512 v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
, v38
, v39
,
18513 v40
, v41
, v42
, v43
, v44
);
18516 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18517 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18518 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18519 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18520 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18521 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18522 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18523 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18524 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
>
18525 internal::ValueArray45
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18526 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18527 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18528 T44
, T45
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
, T8 v8
,
18529 T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
, T16 v16
,
18530 T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
, T24 v24
,
18531 T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
, T32 v32
,
18532 T33 v33
, T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
, T40 v40
,
18533 T41 v41
, T42 v42
, T43 v43
, T44 v44
, T45 v45
) {
18534 return internal::ValueArray45
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18535 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18536 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18537 T40
, T41
, T42
, T43
, T44
, T45
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
, v10
,
18538 v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
, v24
,
18539 v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
, v38
,
18540 v39
, v40
, v41
, v42
, v43
, v44
, v45
);
18543 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18544 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18545 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18546 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18547 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18548 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18549 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18550 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18551 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
18553 internal::ValueArray46
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18554 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18555 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18556 T44
, T45
, T46
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
18557 T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
18558 T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
,
18559 T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
,
18560 T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
,
18561 T40 v40
, T41 v41
, T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
) {
18562 return internal::ValueArray46
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18563 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18564 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18565 T40
, T41
, T42
, T43
, T44
, T45
, T46
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
, v9
,
18566 v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
,
18567 v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
,
18568 v38
, v39
, v40
, v41
, v42
, v43
, v44
, v45
, v46
);
18571 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18572 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18573 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18574 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18575 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18576 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18577 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18578 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18579 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
18580 typename T46
, typename T47
>
18581 internal::ValueArray47
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18582 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18583 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18584 T44
, T45
, T46
, T47
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
, T7 v7
,
18585 T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
18586 T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
,
18587 T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
,
18588 T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
,
18589 T40 v40
, T41 v41
, T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
, T47 v47
) {
18590 return internal::ValueArray47
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18591 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18592 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18593 T40
, T41
, T42
, T43
, T44
, T45
, T46
, T47
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
, v8
,
18594 v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
, v23
,
18595 v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
, v37
,
18596 v38
, v39
, v40
, v41
, v42
, v43
, v44
, v45
, v46
, v47
);
18599 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18600 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18601 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18602 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18603 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18604 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18605 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18606 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18607 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
18608 typename T46
, typename T47
, typename T48
>
18609 internal::ValueArray48
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18610 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18611 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18612 T44
, T45
, T46
, T47
, T48
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
, T6 v6
,
18613 T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
, T15 v15
,
18614 T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
, T23 v23
,
18615 T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
, T31 v31
,
18616 T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
, T39 v39
,
18617 T40 v40
, T41 v41
, T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
, T47 v47
,
18619 return internal::ValueArray48
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18620 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18621 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18622 T40
, T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
>(v1
, v2
, v3
, v4
, v5
, v6
, v7
,
18623 v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
, v22
,
18624 v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
, v36
,
18625 v37
, v38
, v39
, v40
, v41
, v42
, v43
, v44
, v45
, v46
, v47
, v48
);
18628 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18629 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18630 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18631 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18632 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18633 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18634 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18635 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18636 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
18637 typename T46
, typename T47
, typename T48
, typename T49
>
18638 internal::ValueArray49
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18639 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18640 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18641 T44
, T45
, T46
, T47
, T48
, T49
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
, T5 v5
,
18642 T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
, T14 v14
,
18643 T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
, T22 v22
,
18644 T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
, T30 v30
,
18645 T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
, T37 v37
, T38 v38
,
18646 T39 v39
, T40 v40
, T41 v41
, T42 v42
, T43 v43
, T44 v44
, T45 v45
, T46 v46
,
18647 T47 v47
, T48 v48
, T49 v49
) {
18648 return internal::ValueArray49
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18649 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18650 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18651 T40
, T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
>(v1
, v2
, v3
, v4
, v5
, v6
,
18652 v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
, v20
, v21
,
18653 v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
, v34
, v35
,
18654 v36
, v37
, v38
, v39
, v40
, v41
, v42
, v43
, v44
, v45
, v46
, v47
, v48
, v49
);
18657 template <typename T1
, typename T2
, typename T3
, typename T4
, typename T5
,
18658 typename T6
, typename T7
, typename T8
, typename T9
, typename T10
,
18659 typename T11
, typename T12
, typename T13
, typename T14
, typename T15
,
18660 typename T16
, typename T17
, typename T18
, typename T19
, typename T20
,
18661 typename T21
, typename T22
, typename T23
, typename T24
, typename T25
,
18662 typename T26
, typename T27
, typename T28
, typename T29
, typename T30
,
18663 typename T31
, typename T32
, typename T33
, typename T34
, typename T35
,
18664 typename T36
, typename T37
, typename T38
, typename T39
, typename T40
,
18665 typename T41
, typename T42
, typename T43
, typename T44
, typename T45
,
18666 typename T46
, typename T47
, typename T48
, typename T49
, typename T50
>
18667 internal::ValueArray50
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
,
18668 T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
, T26
, T27
, T28
,
18669 T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
, T40
, T41
, T42
, T43
,
18670 T44
, T45
, T46
, T47
, T48
, T49
, T50
> Values(T1 v1
, T2 v2
, T3 v3
, T4 v4
,
18671 T5 v5
, T6 v6
, T7 v7
, T8 v8
, T9 v9
, T10 v10
, T11 v11
, T12 v12
, T13 v13
,
18672 T14 v14
, T15 v15
, T16 v16
, T17 v17
, T18 v18
, T19 v19
, T20 v20
, T21 v21
,
18673 T22 v22
, T23 v23
, T24 v24
, T25 v25
, T26 v26
, T27 v27
, T28 v28
, T29 v29
,
18674 T30 v30
, T31 v31
, T32 v32
, T33 v33
, T34 v34
, T35 v35
, T36 v36
, T37 v37
,
18675 T38 v38
, T39 v39
, T40 v40
, T41 v41
, T42 v42
, T43 v43
, T44 v44
, T45 v45
,
18676 T46 v46
, T47 v47
, T48 v48
, T49 v49
, T50 v50
) {
18677 return internal::ValueArray50
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
,
18678 T12
, T13
, T14
, T15
, T16
, T17
, T18
, T19
, T20
, T21
, T22
, T23
, T24
, T25
,
18679 T26
, T27
, T28
, T29
, T30
, T31
, T32
, T33
, T34
, T35
, T36
, T37
, T38
, T39
,
18680 T40
, T41
, T42
, T43
, T44
, T45
, T46
, T47
, T48
, T49
, T50
>(v1
, v2
, v3
, v4
,
18681 v5
, v6
, v7
, v8
, v9
, v10
, v11
, v12
, v13
, v14
, v15
, v16
, v17
, v18
, v19
,
18682 v20
, v21
, v22
, v23
, v24
, v25
, v26
, v27
, v28
, v29
, v30
, v31
, v32
, v33
,
18683 v34
, v35
, v36
, v37
, v38
, v39
, v40
, v41
, v42
, v43
, v44
, v45
, v46
, v47
,
18687 // Bool() allows generating tests with parameters in a set of (false, true).
18691 // - returns a generator producing sequences with elements {false, true}.
18693 // It is useful when testing code that depends on Boolean flags. Combinations
18694 // of multiple flags can be tested when several Bool()'s are combined using
18695 // Combine() function.
18697 // In the following example all tests in the test case FlagDependentTest
18698 // will be instantiated twice with parameters false and true.
18700 // class FlagDependentTest : public testing::TestWithParam<bool> {
18701 // virtual void SetUp() {
18702 // external_flag = GetParam();
18705 // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
18707 inline internal::ParamGenerator
<bool> Bool() {
18708 return Values(false, true);
18711 # if GTEST_HAS_COMBINE
18712 // Combine() allows the user to combine two or more sequences to produce
18713 // values of a Cartesian product of those sequences' elements.
18716 // Combine(gen1, gen2, ..., genN)
18717 // - returns a generator producing sequences with elements coming from
18718 // the Cartesian product of elements from the sequences generated by
18719 // gen1, gen2, ..., genN. The sequence elements will have a type of
18720 // tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
18721 // of elements from sequences produces by gen1, gen2, ..., genN.
18723 // Combine can have up to 10 arguments. This number is currently limited
18724 // by the maximum number of elements in the tuple implementation used by Google
18729 // This will instantiate tests in test case AnimalTest each one with
18730 // the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
18731 // tuple("dog", BLACK), and tuple("dog", WHITE):
18733 // enum Color { BLACK, GRAY, WHITE };
18734 // class AnimalTest
18735 // : public testing::TestWithParam<tuple<const char*, Color> > {...};
18737 // TEST_P(AnimalTest, AnimalLooksNice) {...}
18739 // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
18740 // Combine(Values("cat", "dog"),
18741 // Values(BLACK, WHITE)));
18743 // This will instantiate tests in FlagDependentTest with all variations of two
18746 // class FlagDependentTest
18747 // : public testing::TestWithParam<tuple<bool, bool> > {
18748 // virtual void SetUp() {
18749 // // Assigns external_flag_1 and external_flag_2 values from the tuple.
18750 // tie(external_flag_1, external_flag_2) = GetParam();
18754 // TEST_P(FlagDependentTest, TestFeature1) {
18755 // // Test your code using external_flag_1 and external_flag_2 here.
18757 // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
18758 // Combine(Bool(), Bool()));
18760 template <typename Generator1
, typename Generator2
>
18761 internal::CartesianProductHolder2
<Generator1
, Generator2
> Combine(
18762 const Generator1
& g1
, const Generator2
& g2
) {
18763 return internal::CartesianProductHolder2
<Generator1
, Generator2
>(
18767 template <typename Generator1
, typename Generator2
, typename Generator3
>
18768 internal::CartesianProductHolder3
<Generator1
, Generator2
, Generator3
> Combine(
18769 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
) {
18770 return internal::CartesianProductHolder3
<Generator1
, Generator2
, Generator3
>(
18774 template <typename Generator1
, typename Generator2
, typename Generator3
,
18775 typename Generator4
>
18776 internal::CartesianProductHolder4
<Generator1
, Generator2
, Generator3
,
18777 Generator4
> Combine(
18778 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18779 const Generator4
& g4
) {
18780 return internal::CartesianProductHolder4
<Generator1
, Generator2
, Generator3
,
18785 template <typename Generator1
, typename Generator2
, typename Generator3
,
18786 typename Generator4
, typename Generator5
>
18787 internal::CartesianProductHolder5
<Generator1
, Generator2
, Generator3
,
18788 Generator4
, Generator5
> Combine(
18789 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18790 const Generator4
& g4
, const Generator5
& g5
) {
18791 return internal::CartesianProductHolder5
<Generator1
, Generator2
, Generator3
,
18792 Generator4
, Generator5
>(
18793 g1
, g2
, g3
, g4
, g5
);
18796 template <typename Generator1
, typename Generator2
, typename Generator3
,
18797 typename Generator4
, typename Generator5
, typename Generator6
>
18798 internal::CartesianProductHolder6
<Generator1
, Generator2
, Generator3
,
18799 Generator4
, Generator5
, Generator6
> Combine(
18800 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18801 const Generator4
& g4
, const Generator5
& g5
, const Generator6
& g6
) {
18802 return internal::CartesianProductHolder6
<Generator1
, Generator2
, Generator3
,
18803 Generator4
, Generator5
, Generator6
>(
18804 g1
, g2
, g3
, g4
, g5
, g6
);
18807 template <typename Generator1
, typename Generator2
, typename Generator3
,
18808 typename Generator4
, typename Generator5
, typename Generator6
,
18809 typename Generator7
>
18810 internal::CartesianProductHolder7
<Generator1
, Generator2
, Generator3
,
18811 Generator4
, Generator5
, Generator6
, Generator7
> Combine(
18812 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18813 const Generator4
& g4
, const Generator5
& g5
, const Generator6
& g6
,
18814 const Generator7
& g7
) {
18815 return internal::CartesianProductHolder7
<Generator1
, Generator2
, Generator3
,
18816 Generator4
, Generator5
, Generator6
, Generator7
>(
18817 g1
, g2
, g3
, g4
, g5
, g6
, g7
);
18820 template <typename Generator1
, typename Generator2
, typename Generator3
,
18821 typename Generator4
, typename Generator5
, typename Generator6
,
18822 typename Generator7
, typename Generator8
>
18823 internal::CartesianProductHolder8
<Generator1
, Generator2
, Generator3
,
18824 Generator4
, Generator5
, Generator6
, Generator7
, Generator8
> Combine(
18825 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18826 const Generator4
& g4
, const Generator5
& g5
, const Generator6
& g6
,
18827 const Generator7
& g7
, const Generator8
& g8
) {
18828 return internal::CartesianProductHolder8
<Generator1
, Generator2
, Generator3
,
18829 Generator4
, Generator5
, Generator6
, Generator7
, Generator8
>(
18830 g1
, g2
, g3
, g4
, g5
, g6
, g7
, g8
);
18833 template <typename Generator1
, typename Generator2
, typename Generator3
,
18834 typename Generator4
, typename Generator5
, typename Generator6
,
18835 typename Generator7
, typename Generator8
, typename Generator9
>
18836 internal::CartesianProductHolder9
<Generator1
, Generator2
, Generator3
,
18837 Generator4
, Generator5
, Generator6
, Generator7
, Generator8
,
18838 Generator9
> Combine(
18839 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18840 const Generator4
& g4
, const Generator5
& g5
, const Generator6
& g6
,
18841 const Generator7
& g7
, const Generator8
& g8
, const Generator9
& g9
) {
18842 return internal::CartesianProductHolder9
<Generator1
, Generator2
, Generator3
,
18843 Generator4
, Generator5
, Generator6
, Generator7
, Generator8
, Generator9
>(
18844 g1
, g2
, g3
, g4
, g5
, g6
, g7
, g8
, g9
);
18847 template <typename Generator1
, typename Generator2
, typename Generator3
,
18848 typename Generator4
, typename Generator5
, typename Generator6
,
18849 typename Generator7
, typename Generator8
, typename Generator9
,
18850 typename Generator10
>
18851 internal::CartesianProductHolder10
<Generator1
, Generator2
, Generator3
,
18852 Generator4
, Generator5
, Generator6
, Generator7
, Generator8
, Generator9
,
18853 Generator10
> Combine(
18854 const Generator1
& g1
, const Generator2
& g2
, const Generator3
& g3
,
18855 const Generator4
& g4
, const Generator5
& g5
, const Generator6
& g6
,
18856 const Generator7
& g7
, const Generator8
& g8
, const Generator9
& g9
,
18857 const Generator10
& g10
) {
18858 return internal::CartesianProductHolder10
<Generator1
, Generator2
, Generator3
,
18859 Generator4
, Generator5
, Generator6
, Generator7
, Generator8
, Generator9
,
18861 g1
, g2
, g3
, g4
, g5
, g6
, g7
, g8
, g9
, g10
);
18863 # endif // GTEST_HAS_COMBINE
18865 # define TEST_P(test_case_name, test_name) \
18866 class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
18867 : public test_case_name { \
18869 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
18870 virtual void TestBody(); \
18872 static int AddToRegistry() { \
18873 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
18874 GetTestCasePatternHolder<test_case_name>(\
18876 ::testing::internal::CodeLocation(\
18877 __FILE__, __LINE__))->AddTestPattern(\
18878 GTEST_STRINGIFY_(test_case_name), \
18879 GTEST_STRINGIFY_(test_name), \
18880 new ::testing::internal::TestMetaFactory< \
18881 GTEST_TEST_CLASS_NAME_(\
18882 test_case_name, test_name)>()); \
18885 static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
18886 GTEST_DISALLOW_COPY_AND_ASSIGN_(\
18887 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
18889 int GTEST_TEST_CLASS_NAME_(test_case_name, \
18890 test_name)::gtest_registering_dummy_ = \
18891 GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
18892 void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
18894 // The optional last argument to INSTANTIATE_TEST_CASE_P allows the user
18895 // to specify a function or functor that generates custom test name suffixes
18896 // based on the test parameters. The function should accept one argument of
18897 // type testing::TestParamInfo<class ParamType>, and return std::string.
18899 // testing::PrintToStringParamName is a builtin test suffix generator that
18900 // returns the value of testing::PrintToString(GetParam()).
18902 // Note: test names must be non-empty, unique, and may only contain ASCII
18903 // alphanumeric characters or underscore. Because PrintToString adds quotes
18904 // to std::string and C strings, it won't work for these types.
18906 # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \
18907 static ::testing::internal::ParamGenerator<test_case_name::ParamType> \
18908 gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
18909 static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \
18910 const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \
18911 return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \
18912 (__VA_ARGS__)(info); \
18914 static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \
18915 ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
18916 GetTestCasePatternHolder<test_case_name>(\
18918 ::testing::internal::CodeLocation(\
18919 __FILE__, __LINE__))->AddTestCaseInstantiation(\
18921 >est_##prefix##test_case_name##_EvalGenerator_, \
18922 >est_##prefix##test_case_name##_EvalGenerateName_, \
18923 __FILE__, __LINE__)
18925 } // namespace testing
18927 #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
18928 // Copyright 2006, Google Inc.
18929 // All rights reserved.
18931 // Redistribution and use in source and binary forms, with or without
18932 // modification, are permitted provided that the following conditions are
18935 // * Redistributions of source code must retain the above copyright
18936 // notice, this list of conditions and the following disclaimer.
18937 // * Redistributions in binary form must reproduce the above
18938 // copyright notice, this list of conditions and the following disclaimer
18939 // in the documentation and/or other materials provided with the
18941 // * Neither the name of Google Inc. nor the names of its
18942 // contributors may be used to endorse or promote products derived from
18943 // this software without specific prior written permission.
18945 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18946 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18947 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18948 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18949 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
18950 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
18951 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
18952 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
18953 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
18954 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
18955 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
18958 // Google C++ Testing and Mocking Framework definitions useful in production code.
18959 // GOOGLETEST_CM0003 DO NOT DELETE
18961 #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
18962 #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
18964 // When you need to test the private or protected members of a class,
18965 // use the FRIEND_TEST macro to declare your tests as friends of the
18966 // class. For example:
18970 // void PrivateMethod();
18971 // FRIEND_TEST(MyClassTest, PrivateMethodWorks);
18974 // class MyClassTest : public testing::Test {
18978 // TEST_F(MyClassTest, PrivateMethodWorks) {
18979 // // Can call MyClass::PrivateMethod() here.
18982 // Note: The test class must be in the same namespace as the class being tested.
18983 // For example, putting MyClassTest in an anonymous namespace will not work.
18985 #define FRIEND_TEST(test_case_name, test_name)\
18986 friend class test_case_name##_##test_name##_Test
18988 #endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
18989 // Copyright 2008, Google Inc.
18990 // All rights reserved.
18992 // Redistribution and use in source and binary forms, with or without
18993 // modification, are permitted provided that the following conditions are
18996 // * Redistributions of source code must retain the above copyright
18997 // notice, this list of conditions and the following disclaimer.
18998 // * Redistributions in binary form must reproduce the above
18999 // copyright notice, this list of conditions and the following disclaimer
19000 // in the documentation and/or other materials provided with the
19002 // * Neither the name of Google Inc. nor the names of its
19003 // contributors may be used to endorse or promote products derived from
19004 // this software without specific prior written permission.
19006 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19007 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19008 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19009 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19010 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19011 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19012 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19013 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
19014 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19015 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
19016 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19018 // GOOGLETEST_CM0001 DO NOT DELETE
19020 #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
19021 #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
19026 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
19027 /* class A needs to have dll-interface to be used by clients of class B */)
19029 namespace testing
{
19031 // A copyable object representing the result of a test part (i.e. an
19032 // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
19034 // Don't inherit from TestPartResult as its destructor is not virtual.
19035 class GTEST_API_ TestPartResult
{
19037 // The possible outcomes of a test part (i.e. an assertion or an
19038 // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
19040 kSuccess
, // Succeeded.
19041 kNonFatalFailure
, // Failed but the test can continue.
19042 kFatalFailure
// Failed and the test should be terminated.
19045 // C'tor. TestPartResult does NOT have a default constructor.
19046 // Always use this constructor (with parameters) to create a
19047 // TestPartResult object.
19048 TestPartResult(Type a_type
,
19049 const char* a_file_name
,
19051 const char* a_message
)
19053 file_name_(a_file_name
== NULL
? "" : a_file_name
),
19054 line_number_(a_line_number
),
19055 summary_(ExtractSummary(a_message
)),
19056 message_(a_message
) {
19059 // Gets the outcome of the test part.
19060 Type
type() const { return type_
; }
19062 // Gets the name of the source file where the test part took place, or
19063 // NULL if it's unknown.
19064 const char* file_name() const {
19065 return file_name_
.empty() ? NULL
: file_name_
.c_str();
19068 // Gets the line in the source file where the test part took place,
19069 // or -1 if it's unknown.
19070 int line_number() const { return line_number_
; }
19072 // Gets the summary of the failure message.
19073 const char* summary() const { return summary_
.c_str(); }
19075 // Gets the message associated with the test part.
19076 const char* message() const { return message_
.c_str(); }
19078 // Returns true iff the test part passed.
19079 bool passed() const { return type_
== kSuccess
; }
19081 // Returns true iff the test part failed.
19082 bool failed() const { return type_
!= kSuccess
; }
19084 // Returns true iff the test part non-fatally failed.
19085 bool nonfatally_failed() const { return type_
== kNonFatalFailure
; }
19087 // Returns true iff the test part fatally failed.
19088 bool fatally_failed() const { return type_
== kFatalFailure
; }
19093 // Gets the summary of the failure message by omitting the stack
19095 static std::string
ExtractSummary(const char* message
);
19097 // The name of the source file where the test part took place, or
19098 // "" if the source file is unknown.
19099 std::string file_name_
;
19100 // The line in the source file where the test part took place, or -1
19101 // if the line number is unknown.
19103 std::string summary_
; // The test failure summary.
19104 std::string message_
; // The test failure message.
19107 // Prints a TestPartResult object.
19108 std::ostream
& operator<<(std::ostream
& os
, const TestPartResult
& result
);
19110 // An array of TestPartResult objects.
19112 // Don't inherit from TestPartResultArray as its destructor is not
19114 class GTEST_API_ TestPartResultArray
{
19116 TestPartResultArray() {}
19118 // Appends the given TestPartResult to the array.
19119 void Append(const TestPartResult
& result
);
19121 // Returns the TestPartResult at the given index (0-based).
19122 const TestPartResult
& GetTestPartResult(int index
) const;
19124 // Returns the number of TestPartResult objects in the array.
19128 std::vector
<TestPartResult
> array_
;
19130 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray
);
19133 // This interface knows how to report a test part result.
19134 class GTEST_API_ TestPartResultReporterInterface
{
19136 virtual ~TestPartResultReporterInterface() {}
19138 virtual void ReportTestPartResult(const TestPartResult
& result
) = 0;
19141 namespace internal
{
19143 // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
19144 // statement generates new fatal failures. To do so it registers itself as the
19145 // current test part result reporter. Besides checking if fatal failures were
19146 // reported, it only delegates the reporting to the former result reporter.
19147 // The original result reporter is restored in the destructor.
19148 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19149 class GTEST_API_ HasNewFatalFailureHelper
19150 : public TestPartResultReporterInterface
{
19152 HasNewFatalFailureHelper();
19153 virtual ~HasNewFatalFailureHelper();
19154 virtual void ReportTestPartResult(const TestPartResult
& result
);
19155 bool has_new_fatal_failure() const { return has_new_fatal_failure_
; }
19157 bool has_new_fatal_failure_
;
19158 TestPartResultReporterInterface
* original_reporter_
;
19160 GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper
);
19163 } // namespace internal
19165 } // namespace testing
19167 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
19169 #endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
19170 // Copyright 2008 Google Inc.
19171 // All Rights Reserved.
19173 // Redistribution and use in source and binary forms, with or without
19174 // modification, are permitted provided that the following conditions are
19177 // * Redistributions of source code must retain the above copyright
19178 // notice, this list of conditions and the following disclaimer.
19179 // * Redistributions in binary form must reproduce the above
19180 // copyright notice, this list of conditions and the following disclaimer
19181 // in the documentation and/or other materials provided with the
19183 // * Neither the name of Google Inc. nor the names of its
19184 // contributors may be used to endorse or promote products derived from
19185 // this software without specific prior written permission.
19187 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19188 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19189 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19190 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19191 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19192 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19193 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19194 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
19195 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19196 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
19197 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19200 // GOOGLETEST_CM0001 DO NOT DELETE
19202 #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
19203 #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
19205 // This header implements typed tests and type-parameterized tests.
19207 // Typed (aka type-driven) tests repeat the same test for types in a
19208 // list. You must know which types you want to test with when writing
19209 // typed tests. Here's how you do it:
19213 // First, define a fixture class template. It should be parameterized
19214 // by a type. Remember to derive it from testing::Test.
19215 template <typename T
>
19216 class FooTest
: public testing::Test
{
19219 typedef std::list
<T
> List
;
19224 // Next, associate a list of types with the test case, which will be
19225 // repeated for each type in the list. The typedef is necessary for
19226 // the macro to parse correctly.
19227 typedef testing::Types
<char, int, unsigned int> MyTypes
;
19228 TYPED_TEST_CASE(FooTest
, MyTypes
);
19230 // If the type list contains only one type, you can write that type
19231 // directly without Types<...>:
19232 // TYPED_TEST_CASE(FooTest, int);
19234 // Then, use TYPED_TEST() instead of TEST_F() to define as many typed
19235 // tests for this test case as you want.
19236 TYPED_TEST(FooTest
, DoesBlah
) {
19237 // Inside a test, refer to TypeParam to get the type parameter.
19238 // Since we are inside a derived class template, C++ requires use to
19239 // visit the members of FooTest via 'this'.
19240 TypeParam n
= this->value_
;
19242 // To visit static members of the fixture, add the TestFixture::
19244 n
+= TestFixture::shared_
;
19246 // To refer to typedefs in the fixture, add the "typename
19247 // TestFixture::" prefix.
19248 typename
TestFixture::List values
;
19249 values
.push_back(n
);
19253 TYPED_TEST(FooTest
, HasPropertyA
) { ... }
19255 // TYPED_TEST_CASE takes an optional third argument which allows to specify a
19256 // class that generates custom test name suffixes based on the type. This should
19257 // be a class which has a static template function GetName(int index) returning
19258 // a string for each type. The provided integer index equals the index of the
19259 // type in the provided type list. In many cases the index can be ignored.
19262 // class MyTypeNames {
19264 // template <typename T>
19265 // static std::string GetName(int) {
19266 // if (std::is_same<T, char>()) return "char";
19267 // if (std::is_same<T, int>()) return "int";
19268 // if (std::is_same<T, unsigned int>()) return "unsignedInt";
19271 // TYPED_TEST_CASE(FooTest, MyTypes, MyTypeNames);
19275 // Type-parameterized tests are abstract test patterns parameterized
19276 // by a type. Compared with typed tests, type-parameterized tests
19277 // allow you to define the test pattern without knowing what the type
19278 // parameters are. The defined pattern can be instantiated with
19279 // different types any number of times, in any number of translation
19282 // If you are designing an interface or concept, you can define a
19283 // suite of type-parameterized tests to verify properties that any
19284 // valid implementation of the interface/concept should have. Then,
19285 // each implementation can easily instantiate the test suite to verify
19286 // that it conforms to the requirements, without having to write
19287 // similar tests repeatedly. Here's an example:
19291 // First, define a fixture class template. It should be parameterized
19292 // by a type. Remember to derive it from testing::Test.
19293 template <typename T
>
19294 class FooTest
: public testing::Test
{
19298 // Next, declare that you will define a type-parameterized test case
19299 // (the _P suffix is for "parameterized" or "pattern", whichever you
19301 TYPED_TEST_CASE_P(FooTest
);
19303 // Then, use TYPED_TEST_P() to define as many type-parameterized tests
19304 // for this type-parameterized test case as you want.
19305 TYPED_TEST_P(FooTest
, DoesBlah
) {
19306 // Inside a test, refer to TypeParam to get the type parameter.
19311 TYPED_TEST_P(FooTest
, HasPropertyA
) { ... }
19313 // Now the tricky part: you need to register all test patterns before
19314 // you can instantiate them. The first argument of the macro is the
19315 // test case name; the rest are the names of the tests in this test
19317 REGISTER_TYPED_TEST_CASE_P(FooTest
,
19318 DoesBlah
, HasPropertyA
);
19320 // Finally, you are free to instantiate the pattern with the types you
19321 // want. If you put the above code in a header file, you can #include
19322 // it in multiple C++ source files and instantiate it multiple times.
19324 // To distinguish different instances of the pattern, the first
19325 // argument to the INSTANTIATE_* macro is a prefix that will be added
19326 // to the actual test case name. Remember to pick unique prefixes for
19327 // different instances.
19328 typedef testing::Types
<char, int, unsigned int> MyTypes
;
19329 INSTANTIATE_TYPED_TEST_CASE_P(My
, FooTest
, MyTypes
);
19331 // If the type list contains only one type, you can write that type
19332 // directly without Types<...>:
19333 // INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
19335 // Similar to the optional argument of TYPED_TEST_CASE above,
19336 // INSTANTIATE_TEST_CASE_P takes an optional fourth argument which allows to
19337 // generate custom names.
19338 // INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes, MyTypeNames);
19343 // Implements typed tests.
19345 #if GTEST_HAS_TYPED_TEST
19347 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
19349 // Expands to the name of the typedef for the type parameters of the
19350 // given test case.
19351 # define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
19353 // Expands to the name of the typedef for the NameGenerator, responsible for
19354 // creating the suffixes of the name.
19355 #define GTEST_NAME_GENERATOR_(TestCaseName) \
19356 gtest_type_params_##TestCaseName##_NameGenerator
19358 // The 'Types' template argument below must have spaces around it
19359 // since some compilers may choke on '>>' when passing a template
19360 // instance (e.g. Types<int>)
19361 # define TYPED_TEST_CASE(CaseName, Types, ...) \
19362 typedef ::testing::internal::TypeList< Types >::type GTEST_TYPE_PARAMS_( \
19364 typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \
19365 GTEST_NAME_GENERATOR_(CaseName)
19367 # define TYPED_TEST(CaseName, TestName) \
19368 template <typename gtest_TypeParam_> \
19369 class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
19370 : public CaseName<gtest_TypeParam_> { \
19372 typedef CaseName<gtest_TypeParam_> TestFixture; \
19373 typedef gtest_TypeParam_ TypeParam; \
19374 virtual void TestBody(); \
19376 static bool gtest_##CaseName##_##TestName##_registered_ \
19377 GTEST_ATTRIBUTE_UNUSED_ = \
19378 ::testing::internal::TypeParameterizedTest< \
19380 ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \
19382 GTEST_TYPE_PARAMS_( \
19383 CaseName)>::Register("", \
19384 ::testing::internal::CodeLocation( \
19385 __FILE__, __LINE__), \
19386 #CaseName, #TestName, 0, \
19387 ::testing::internal::GenerateNames< \
19388 GTEST_NAME_GENERATOR_(CaseName), \
19389 GTEST_TYPE_PARAMS_(CaseName)>()); \
19390 template <typename gtest_TypeParam_> \
19391 void GTEST_TEST_CLASS_NAME_(CaseName, \
19392 TestName)<gtest_TypeParam_>::TestBody()
19394 #endif // GTEST_HAS_TYPED_TEST
19396 // Implements type-parameterized tests.
19398 #if GTEST_HAS_TYPED_TEST_P
19400 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
19402 // Expands to the namespace name that the type-parameterized tests for
19403 // the given type-parameterized test case are defined in. The exact
19404 // name of the namespace is subject to change without notice.
19405 # define GTEST_CASE_NAMESPACE_(TestCaseName) \
19406 gtest_case_##TestCaseName##_
19408 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
19410 // Expands to the name of the variable used to remember the names of
19411 // the defined tests in the given test case.
19412 # define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
19413 gtest_typed_test_case_p_state_##TestCaseName##_
19415 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
19417 // Expands to the name of the variable used to remember the names of
19418 // the registered tests in the given test case.
19419 # define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
19420 gtest_registered_test_names_##TestCaseName##_
19422 // The variables defined in the type-parameterized test macros are
19423 // static as typically these macros are used in a .h file that can be
19424 // #included in multiple translation units linked together.
19425 # define TYPED_TEST_CASE_P(CaseName) \
19426 static ::testing::internal::TypedTestCasePState \
19427 GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
19429 # define TYPED_TEST_P(CaseName, TestName) \
19430 namespace GTEST_CASE_NAMESPACE_(CaseName) { \
19431 template <typename gtest_TypeParam_> \
19432 class TestName : public CaseName<gtest_TypeParam_> { \
19434 typedef CaseName<gtest_TypeParam_> TestFixture; \
19435 typedef gtest_TypeParam_ TypeParam; \
19436 virtual void TestBody(); \
19438 static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
19439 GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
19440 __FILE__, __LINE__, #CaseName, #TestName); \
19442 template <typename gtest_TypeParam_> \
19443 void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
19445 # define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
19446 namespace GTEST_CASE_NAMESPACE_(CaseName) { \
19447 typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
19449 static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) \
19450 GTEST_ATTRIBUTE_UNUSED_ = \
19451 GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames( \
19452 __FILE__, __LINE__, #__VA_ARGS__)
19454 // The 'Types' template argument below must have spaces around it
19455 // since some compilers may choke on '>>' when passing a template
19456 // instance (e.g. Types<int>)
19457 # define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types, ...) \
19458 static bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
19459 ::testing::internal::TypeParameterizedTestCase< \
19460 CaseName, GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
19461 ::testing::internal::TypeList< Types >::type>:: \
19462 Register(#Prefix, \
19463 ::testing::internal::CodeLocation(__FILE__, __LINE__), \
19464 >EST_TYPED_TEST_CASE_P_STATE_(CaseName), #CaseName, \
19465 GTEST_REGISTERED_TEST_NAMES_(CaseName), \
19466 ::testing::internal::GenerateNames< \
19467 ::testing::internal::NameGeneratorSelector< \
19468 __VA_ARGS__>::type, \
19469 ::testing::internal::TypeList< Types >::type>())
19471 #endif // GTEST_HAS_TYPED_TEST_P
19473 #endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
19475 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
19476 /* class A needs to have dll-interface to be used by clients of class B */)
19478 // Depending on the platform, different string classes are available.
19479 // On Linux, in addition to ::std::string, Google also makes use of
19480 // class ::string, which has the same interface as ::std::string, but
19481 // has a different implementation.
19483 // You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
19484 // ::string is available AND is a distinct type to ::std::string, or
19485 // define it to 0 to indicate otherwise.
19487 // If ::std::string and ::string are the same class on your platform
19488 // due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.
19490 // If you do not define GTEST_HAS_GLOBAL_STRING, it is defined
19493 namespace testing
{
19495 // Silence C4100 (unreferenced formal parameter) and 4805
19496 // unsafe mix of type 'const int' and type 'const bool'
19498 # pragma warning(push)
19499 # pragma warning(disable:4805)
19500 # pragma warning(disable:4100)
19504 // Declares the flags.
19506 // This flag temporary enables the disabled tests.
19507 GTEST_DECLARE_bool_(also_run_disabled_tests
);
19509 // This flag brings the debugger on an assertion failure.
19510 GTEST_DECLARE_bool_(break_on_failure
);
19512 // This flag controls whether Google Test catches all test-thrown exceptions
19513 // and logs them as failures.
19514 GTEST_DECLARE_bool_(catch_exceptions
);
19516 // This flag enables using colors in terminal output. Available values are
19517 // "yes" to enable colors, "no" (disable colors), or "auto" (the default)
19518 // to let Google Test decide.
19519 GTEST_DECLARE_string_(color
);
19521 // This flag sets up the filter to select by name using a glob pattern
19522 // the tests to run. If the filter is not given all tests are executed.
19523 GTEST_DECLARE_string_(filter
);
19525 // This flag controls whether Google Test installs a signal handler that dumps
19526 // debugging information when fatal signals are raised.
19527 GTEST_DECLARE_bool_(install_failure_signal_handler
);
19529 // This flag causes the Google Test to list tests. None of the tests listed
19530 // are actually run if the flag is provided.
19531 GTEST_DECLARE_bool_(list_tests
);
19533 // This flag controls whether Google Test emits a detailed XML report to a file
19534 // in addition to its normal textual output.
19535 GTEST_DECLARE_string_(output
);
19537 // This flags control whether Google Test prints the elapsed time for each
19539 GTEST_DECLARE_bool_(print_time
);
19541 // This flags control whether Google Test prints UTF8 characters as text.
19542 GTEST_DECLARE_bool_(print_utf8
);
19544 // This flag specifies the random number seed.
19545 GTEST_DECLARE_int32_(random_seed
);
19547 // This flag sets how many times the tests are repeated. The default value
19548 // is 1. If the value is -1 the tests are repeating forever.
19549 GTEST_DECLARE_int32_(repeat
);
19551 // This flag controls whether Google Test includes Google Test internal
19552 // stack frames in failure stack traces.
19553 GTEST_DECLARE_bool_(show_internal_stack_frames
);
19555 // When this flag is specified, tests' order is randomized on every iteration.
19556 GTEST_DECLARE_bool_(shuffle
);
19558 // This flag specifies the maximum number of stack frames to be
19559 // printed in a failure message.
19560 GTEST_DECLARE_int32_(stack_trace_depth
);
19562 // When this flag is specified, a failed assertion will throw an
19563 // exception if exceptions are enabled, or exit the program with a
19564 // non-zero code otherwise. For use with an external test framework.
19565 GTEST_DECLARE_bool_(throw_on_failure
);
19567 // When this flag is set with a "host:port" string, on supported
19568 // platforms test results are streamed to the specified port on
19569 // the specified host machine.
19570 GTEST_DECLARE_string_(stream_result_to
);
19572 #if GTEST_USE_OWN_FLAGFILE_FLAG_
19573 GTEST_DECLARE_string_(flagfile
);
19574 #endif // GTEST_USE_OWN_FLAGFILE_FLAG_
19576 // The upper limit for valid stack trace depths.
19577 const int kMaxStackTraceDepth
= 100;
19579 namespace internal
{
19581 class AssertHelper
;
19582 class DefaultGlobalTestPartResultReporter
;
19583 class ExecDeathTest
;
19584 class NoExecDeathTest
;
19585 class FinalSuccessChecker
;
19586 class GTestFlagSaver
;
19587 class StreamingListenerTest
;
19588 class TestResultAccessor
;
19589 class TestEventListenersAccessor
;
19590 class TestEventRepeater
;
19591 class UnitTestRecordPropertyTestHelper
;
19592 class WindowsDeathTest
;
19593 class FuchsiaDeathTest
;
19594 class UnitTestImpl
* GetUnitTestImpl();
19595 void ReportFailureInUnknownLocation(TestPartResult::Type result_type
,
19596 const std::string
& message
);
19598 } // namespace internal
19600 // The friend relationship of some of these classes is cyclic.
19601 // If we don't forward declare them the compiler might confuse the classes
19602 // in friendship clauses with same named classes on the scope.
19608 // A class for indicating whether an assertion was successful. When
19609 // the assertion wasn't successful, the AssertionResult object
19610 // remembers a non-empty message that describes how it failed.
19612 // To create an instance of this class, use one of the factory functions
19613 // (AssertionSuccess() and AssertionFailure()).
19615 // This class is useful for two purposes:
19616 // 1. Defining predicate functions to be used with Boolean test assertions
19617 // EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
19618 // 2. Defining predicate-format functions to be
19619 // used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
19621 // For example, if you define IsEven predicate:
19623 // testing::AssertionResult IsEven(int n) {
19624 // if ((n % 2) == 0)
19625 // return testing::AssertionSuccess();
19627 // return testing::AssertionFailure() << n << " is odd";
19630 // Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
19631 // will print the message
19633 // Value of: IsEven(Fib(5))
19634 // Actual: false (5 is odd)
19637 // instead of a more opaque
19639 // Value of: IsEven(Fib(5))
19643 // in case IsEven is a simple Boolean predicate.
19645 // If you expect your predicate to be reused and want to support informative
19646 // messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
19647 // about half as often as positive ones in our tests), supply messages for
19648 // both success and failure cases:
19650 // testing::AssertionResult IsEven(int n) {
19651 // if ((n % 2) == 0)
19652 // return testing::AssertionSuccess() << n << " is even";
19654 // return testing::AssertionFailure() << n << " is odd";
19657 // Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
19659 // Value of: IsEven(Fib(6))
19660 // Actual: true (8 is even)
19663 // NB: Predicates that support negative Boolean assertions have reduced
19664 // performance in positive ones so be careful not to use them in tests
19665 // that have lots (tens of thousands) of positive Boolean assertions.
19667 // To use this class with EXPECT_PRED_FORMAT assertions such as:
19669 // // Verifies that Foo() returns an even number.
19670 // EXPECT_PRED_FORMAT1(IsEven, Foo());
19672 // you need to define:
19674 // testing::AssertionResult IsEven(const char* expr, int n) {
19675 // if ((n % 2) == 0)
19676 // return testing::AssertionSuccess();
19678 // return testing::AssertionFailure()
19679 // << "Expected: " << expr << " is even\n Actual: it's " << n;
19682 // If Foo() returns 5, you will see the following message:
19684 // Expected: Foo() is even
19687 class GTEST_API_ AssertionResult
{
19689 // Copy constructor.
19690 // Used in EXPECT_TRUE/FALSE(assertion_result).
19691 AssertionResult(const AssertionResult
& other
);
19693 #if defined(_MSC_VER) && _MSC_VER < 1910
19694 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)
19697 // Used in the EXPECT_TRUE/FALSE(bool_expression).
19699 // T must be contextually convertible to bool.
19701 // The second parameter prevents this overload from being considered if
19702 // the argument is implicitly convertible to AssertionResult. In that case
19703 // we want AssertionResult's copy constructor to be used.
19704 template <typename T
>
19705 explicit AssertionResult(
19707 typename
internal::EnableIf
<
19708 !internal::ImplicitlyConvertible
<T
, AssertionResult
>::value
>::type
*
19709 /*enabler*/ = NULL
)
19710 : success_(success
) {}
19712 #if defined(_MSC_VER) && _MSC_VER < 1910
19713 GTEST_DISABLE_MSC_WARNINGS_POP_()
19716 // Assignment operator.
19717 AssertionResult
& operator=(AssertionResult other
) {
19722 // Returns true iff the assertion succeeded.
19723 operator bool() const { return success_
; } // NOLINT
19725 // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
19726 AssertionResult
operator!() const;
19728 // Returns the text streamed into this AssertionResult. Test assertions
19729 // use it when they fail (i.e., the predicate's outcome doesn't match the
19730 // assertion's expectation). When nothing has been streamed into the
19731 // object, returns an empty string.
19732 const char* message() const {
19733 return message_
.get() != NULL
? message_
->c_str() : "";
19735 // FIXME: Remove this after making sure no clients use it.
19736 // Deprecated; please use message() instead.
19737 const char* failure_message() const { return message(); }
19739 // Streams a custom failure message into this object.
19740 template <typename T
> AssertionResult
& operator<<(const T
& value
) {
19741 AppendMessage(Message() << value
);
19745 // Allows streaming basic output manipulators such as endl or flush into
19747 AssertionResult
& operator<<(
19748 ::std::ostream
& (*basic_manipulator
)(::std::ostream
& stream
)) {
19749 AppendMessage(Message() << basic_manipulator
);
19754 // Appends the contents of message to message_.
19755 void AppendMessage(const Message
& a_message
) {
19756 if (message_
.get() == NULL
)
19757 message_
.reset(new ::std::string
);
19758 message_
->append(a_message
.GetString().c_str());
19761 // Swap the contents of this AssertionResult with other.
19762 void swap(AssertionResult
& other
);
19764 // Stores result of the assertion predicate.
19766 // Stores the message describing the condition in case the expectation
19767 // construct is not satisfied with the predicate's outcome.
19768 // Referenced via a pointer to avoid taking too much stack frame space
19769 // with test assertions.
19770 internal::scoped_ptr
< ::std::string
> message_
;
19773 // Makes a successful assertion result.
19774 GTEST_API_ AssertionResult
AssertionSuccess();
19776 // Makes a failed assertion result.
19777 GTEST_API_ AssertionResult
AssertionFailure();
19779 // Makes a failed assertion result with the given failure message.
19780 // Deprecated; use AssertionFailure() << msg.
19781 GTEST_API_ AssertionResult
AssertionFailure(const Message
& msg
);
19783 } // namespace testing
19785 // Includes the auto-generated header that implements a family of generic
19786 // predicate assertion macros. This include comes late because it relies on
19787 // APIs declared above.
19788 // Copyright 2006, Google Inc.
19789 // All rights reserved.
19791 // Redistribution and use in source and binary forms, with or without
19792 // modification, are permitted provided that the following conditions are
19795 // * Redistributions of source code must retain the above copyright
19796 // notice, this list of conditions and the following disclaimer.
19797 // * Redistributions in binary form must reproduce the above
19798 // copyright notice, this list of conditions and the following disclaimer
19799 // in the documentation and/or other materials provided with the
19801 // * Neither the name of Google Inc. nor the names of its
19802 // contributors may be used to endorse or promote products derived from
19803 // this software without specific prior written permission.
19805 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19806 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19807 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19808 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19809 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19810 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19811 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19812 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
19813 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19814 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
19815 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19817 // This file is AUTOMATICALLY GENERATED on 01/02/2018 by command
19818 // 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
19820 // Implements a family of generic predicate assertion macros.
19822 // GOOGLETEST_CM0001 DO NOT DELETE
19824 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19825 #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19828 namespace testing
{
19830 // This header implements a family of generic predicate assertion
19833 // ASSERT_PRED_FORMAT1(pred_format, v1)
19834 // ASSERT_PRED_FORMAT2(pred_format, v1, v2)
19837 // where pred_format is a function or functor that takes n (in the
19838 // case of ASSERT_PRED_FORMATn) values and their source expression
19839 // text, and returns a testing::AssertionResult. See the definition
19840 // of ASSERT_EQ in gtest.h for an example.
19842 // If you don't care about formatting, you can use the more
19843 // restrictive version:
19845 // ASSERT_PRED1(pred, v1)
19846 // ASSERT_PRED2(pred, v1, v2)
19849 // where pred is an n-ary function or functor that returns bool,
19850 // and the values v1, v2, ..., must support the << operator for
19851 // streaming to std::ostream.
19853 // We also define the EXPECT_* variations.
19855 // For now we only support predicates whose arity is at most 5.
19857 // GTEST_ASSERT_ is the basic statement to which all of the assertions
19858 // in this file reduce. Don't use this in your code.
19860 #define GTEST_ASSERT_(expression, on_failure) \
19861 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
19862 if (const ::testing::AssertionResult gtest_ar = (expression)) \
19865 on_failure(gtest_ar.failure_message())
19868 // Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
19869 // this in your code.
19870 template <typename Pred
,
19872 AssertionResult
AssertPred1Helper(const char* pred_text
,
19876 if (pred(v1
)) return AssertionSuccess();
19878 return AssertionFailure() << pred_text
<< "("
19879 << e1
<< ") evaluates to false, where"
19880 << "\n" << e1
<< " evaluates to " << v1
;
19883 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
19884 // Don't use this in your code.
19885 #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
19886 GTEST_ASSERT_(pred_format(#v1, v1), \
19889 // Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
19890 // this in your code.
19891 #define GTEST_PRED1_(pred, v1, on_failure)\
19892 GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
19897 // Unary predicate assertion macros.
19898 #define EXPECT_PRED_FORMAT1(pred_format, v1) \
19899 GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
19900 #define EXPECT_PRED1(pred, v1) \
19901 GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
19902 #define ASSERT_PRED_FORMAT1(pred_format, v1) \
19903 GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
19904 #define ASSERT_PRED1(pred, v1) \
19905 GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
19909 // Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
19910 // this in your code.
19911 template <typename Pred
,
19914 AssertionResult
AssertPred2Helper(const char* pred_text
,
19920 if (pred(v1
, v2
)) return AssertionSuccess();
19922 return AssertionFailure() << pred_text
<< "("
19924 << e2
<< ") evaluates to false, where"
19925 << "\n" << e1
<< " evaluates to " << v1
19926 << "\n" << e2
<< " evaluates to " << v2
;
19929 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
19930 // Don't use this in your code.
19931 #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
19932 GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
19935 // Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
19936 // this in your code.
19937 #define GTEST_PRED2_(pred, v1, v2, on_failure)\
19938 GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
19945 // Binary predicate assertion macros.
19946 #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
19947 GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
19948 #define EXPECT_PRED2(pred, v1, v2) \
19949 GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
19950 #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
19951 GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
19952 #define ASSERT_PRED2(pred, v1, v2) \
19953 GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
19957 // Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
19958 // this in your code.
19959 template <typename Pred
,
19963 AssertionResult
AssertPred3Helper(const char* pred_text
,
19971 if (pred(v1
, v2
, v3
)) return AssertionSuccess();
19973 return AssertionFailure() << pred_text
<< "("
19976 << e3
<< ") evaluates to false, where"
19977 << "\n" << e1
<< " evaluates to " << v1
19978 << "\n" << e2
<< " evaluates to " << v2
19979 << "\n" << e3
<< " evaluates to " << v3
;
19982 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
19983 // Don't use this in your code.
19984 #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
19985 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
19988 // Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
19989 // this in your code.
19990 #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
19991 GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
20000 // Ternary predicate assertion macros.
20001 #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
20002 GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
20003 #define EXPECT_PRED3(pred, v1, v2, v3) \
20004 GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
20005 #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
20006 GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
20007 #define ASSERT_PRED3(pred, v1, v2, v3) \
20008 GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
20012 // Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
20013 // this in your code.
20014 template <typename Pred
,
20019 AssertionResult
AssertPred4Helper(const char* pred_text
,
20029 if (pred(v1
, v2
, v3
, v4
)) return AssertionSuccess();
20031 return AssertionFailure() << pred_text
<< "("
20035 << e4
<< ") evaluates to false, where"
20036 << "\n" << e1
<< " evaluates to " << v1
20037 << "\n" << e2
<< " evaluates to " << v2
20038 << "\n" << e3
<< " evaluates to " << v3
20039 << "\n" << e4
<< " evaluates to " << v4
;
20042 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
20043 // Don't use this in your code.
20044 #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
20045 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
20048 // Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
20049 // this in your code.
20050 #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
20051 GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
20062 // 4-ary predicate assertion macros.
20063 #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
20064 GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
20065 #define EXPECT_PRED4(pred, v1, v2, v3, v4) \
20066 GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
20067 #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
20068 GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
20069 #define ASSERT_PRED4(pred, v1, v2, v3, v4) \
20070 GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
20074 // Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
20075 // this in your code.
20076 template <typename Pred
,
20082 AssertionResult
AssertPred5Helper(const char* pred_text
,
20094 if (pred(v1
, v2
, v3
, v4
, v5
)) return AssertionSuccess();
20096 return AssertionFailure() << pred_text
<< "("
20101 << e5
<< ") evaluates to false, where"
20102 << "\n" << e1
<< " evaluates to " << v1
20103 << "\n" << e2
<< " evaluates to " << v2
20104 << "\n" << e3
<< " evaluates to " << v3
20105 << "\n" << e4
<< " evaluates to " << v4
20106 << "\n" << e5
<< " evaluates to " << v5
;
20109 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
20110 // Don't use this in your code.
20111 #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
20112 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
20115 // Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
20116 // this in your code.
20117 #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
20118 GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
20131 // 5-ary predicate assertion macros.
20132 #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
20133 GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
20134 #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
20135 GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
20136 #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
20137 GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
20138 #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
20139 GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
20143 } // namespace testing
20145 #endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
20147 namespace testing
{
20149 // The abstract class that all tests inherit from.
20151 // In Google Test, a unit test program contains one or many TestCases, and
20152 // each TestCase contains one or many Tests.
20154 // When you define a test using the TEST macro, you don't need to
20155 // explicitly derive from Test - the TEST macro automatically does
20158 // The only time you derive from Test is when defining a test fixture
20159 // to be used in a TEST_F. For example:
20161 // class FooTest : public testing::Test {
20163 // void SetUp() override { ... }
20164 // void TearDown() override { ... }
20168 // TEST_F(FooTest, Bar) { ... }
20169 // TEST_F(FooTest, Baz) { ... }
20171 // Test is not copyable.
20172 class GTEST_API_ Test
{
20174 friend class TestInfo
;
20176 // Defines types for pointers to functions that set up and tear down
20178 typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc
;
20179 typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc
;
20181 // The d'tor is virtual as we intend to inherit from Test.
20184 // Sets up the stuff shared by all tests in this test case.
20186 // Google Test will call Foo::SetUpTestCase() before running the first
20187 // test in test case Foo. Hence a sub-class can define its own
20188 // SetUpTestCase() method to shadow the one defined in the super
20190 static void SetUpTestCase() {}
20192 // Tears down the stuff shared by all tests in this test case.
20194 // Google Test will call Foo::TearDownTestCase() after running the last
20195 // test in test case Foo. Hence a sub-class can define its own
20196 // TearDownTestCase() method to shadow the one defined in the super
20198 static void TearDownTestCase() {}
20200 // Returns true iff the current test has a fatal failure.
20201 static bool HasFatalFailure();
20203 // Returns true iff the current test has a non-fatal failure.
20204 static bool HasNonfatalFailure();
20206 // Returns true iff the current test has a (either fatal or
20207 // non-fatal) failure.
20208 static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
20210 // Logs a property for the current test, test case, or for the entire
20211 // invocation of the test program when used outside of the context of a
20212 // test case. Only the last value for a given key is remembered. These
20213 // are public static so they can be called from utility functions that are
20214 // not members of the test fixture. Calls to RecordProperty made during
20215 // lifespan of the test (from the moment its constructor starts to the
20216 // moment its destructor finishes) will be output in XML as attributes of
20217 // the <testcase> element. Properties recorded from fixture's
20218 // SetUpTestCase or TearDownTestCase are logged as attributes of the
20219 // corresponding <testsuite> element. Calls to RecordProperty made in the
20220 // global context (before or after invocation of RUN_ALL_TESTS and from
20221 // SetUp/TearDown method of Environment objects registered with Google
20222 // Test) will be output as attributes of the <testsuites> element.
20223 static void RecordProperty(const std::string
& key
, const std::string
& value
);
20224 static void RecordProperty(const std::string
& key
, int value
);
20227 // Creates a Test object.
20230 // Sets up the test fixture.
20231 virtual void SetUp();
20233 // Tears down the test fixture.
20234 virtual void TearDown();
20237 // Returns true iff the current test has the same fixture class as
20238 // the first test in the current test case.
20239 static bool HasSameFixtureClass();
20241 // Runs the test after the test fixture has been set up.
20243 // A sub-class must implement this to define the test logic.
20245 // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
20246 // Instead, use the TEST or TEST_F macro.
20247 virtual void TestBody() = 0;
20249 // Sets up, executes, and tears down the test.
20252 // Deletes self. We deliberately pick an unusual name for this
20253 // internal method to avoid clashing with names used in user TESTs.
20254 void DeleteSelf_() { delete this; }
20256 const internal::scoped_ptr
< GTEST_FLAG_SAVER_
> gtest_flag_saver_
;
20258 // Often a user misspells SetUp() as Setup() and spends a long time
20259 // wondering why it is never called by Google Test. The declaration of
20260 // the following method is solely for catching such an error at
20263 // - The return type is deliberately chosen to be not void, so it
20264 // will be a conflict if void Setup() is declared in the user's
20267 // - This method is private, so it will be another compiler error
20268 // if the method is called from the user's test fixture.
20270 // DO NOT OVERRIDE THIS FUNCTION.
20272 // If you see an error about overriding the following function or
20273 // about it being private, you have mis-spelled SetUp() as Setup().
20274 struct Setup_should_be_spelled_SetUp
{};
20275 virtual Setup_should_be_spelled_SetUp
* Setup() { return NULL
; }
20277 // We disallow copying Tests.
20278 GTEST_DISALLOW_COPY_AND_ASSIGN_(Test
);
20281 typedef internal::TimeInMillis TimeInMillis
;
20283 // A copyable object representing a user specified test property which can be
20284 // output as a key/value string pair.
20286 // Don't inherit from TestProperty as its destructor is not virtual.
20287 class TestProperty
{
20289 // C'tor. TestProperty does NOT have a default constructor.
20290 // Always use this constructor (with parameters) to create a
20291 // TestProperty object.
20292 TestProperty(const std::string
& a_key
, const std::string
& a_value
) :
20293 key_(a_key
), value_(a_value
) {
20296 // Gets the user supplied key.
20297 const char* key() const {
20298 return key_
.c_str();
20301 // Gets the user supplied value.
20302 const char* value() const {
20303 return value_
.c_str();
20306 // Sets a new value, overriding the one supplied in the constructor.
20307 void SetValue(const std::string
& new_value
) {
20308 value_
= new_value
;
20312 // The key supplied by the user.
20314 // The value supplied by the user.
20315 std::string value_
;
20318 // The result of a single Test. This includes a list of
20319 // TestPartResults, a list of TestProperties, a count of how many
20320 // death tests there are in the Test, and how much time it took to run
20323 // TestResult is not copyable.
20324 class GTEST_API_ TestResult
{
20326 // Creates an empty TestResult.
20329 // D'tor. Do not inherit from TestResult.
20332 // Gets the number of all test parts. This is the sum of the number
20333 // of successful test parts and the number of failed test parts.
20334 int total_part_count() const;
20336 // Returns the number of the test properties.
20337 int test_property_count() const;
20339 // Returns true iff the test passed (i.e. no test part failed).
20340 bool Passed() const { return !Failed(); }
20342 // Returns true iff the test failed.
20343 bool Failed() const;
20345 // Returns true iff the test fatally failed.
20346 bool HasFatalFailure() const;
20348 // Returns true iff the test has a non-fatal failure.
20349 bool HasNonfatalFailure() const;
20351 // Returns the elapsed time, in milliseconds.
20352 TimeInMillis
elapsed_time() const { return elapsed_time_
; }
20354 // Returns the i-th test part result among all the results. i can range from 0
20355 // to total_part_count() - 1. If i is not in that range, aborts the program.
20356 const TestPartResult
& GetTestPartResult(int i
) const;
20358 // Returns the i-th test property. i can range from 0 to
20359 // test_property_count() - 1. If i is not in that range, aborts the
20361 const TestProperty
& GetTestProperty(int i
) const;
20364 friend class TestInfo
;
20365 friend class TestCase
;
20366 friend class UnitTest
;
20367 friend class internal::DefaultGlobalTestPartResultReporter
;
20368 friend class internal::ExecDeathTest
;
20369 friend class internal::TestResultAccessor
;
20370 friend class internal::UnitTestImpl
;
20371 friend class internal::WindowsDeathTest
;
20372 friend class internal::FuchsiaDeathTest
;
20374 // Gets the vector of TestPartResults.
20375 const std::vector
<TestPartResult
>& test_part_results() const {
20376 return test_part_results_
;
20379 // Gets the vector of TestProperties.
20380 const std::vector
<TestProperty
>& test_properties() const {
20381 return test_properties_
;
20384 // Sets the elapsed time.
20385 void set_elapsed_time(TimeInMillis elapsed
) { elapsed_time_
= elapsed
; }
20387 // Adds a test property to the list. The property is validated and may add
20388 // a non-fatal failure if invalid (e.g., if it conflicts with reserved
20389 // key names). If a property is already recorded for the same key, the
20390 // value will be updated, rather than storing multiple values for the same
20391 // key. xml_element specifies the element for which the property is being
20392 // recorded and is used for validation.
20393 void RecordProperty(const std::string
& xml_element
,
20394 const TestProperty
& test_property
);
20396 // Adds a failure if the key is a reserved attribute of Google Test
20397 // testcase tags. Returns true if the property is valid.
20398 // FIXME: Validate attribute names are legal and human readable.
20399 static bool ValidateTestProperty(const std::string
& xml_element
,
20400 const TestProperty
& test_property
);
20402 // Adds a test part result to the list.
20403 void AddTestPartResult(const TestPartResult
& test_part_result
);
20405 // Returns the death test count.
20406 int death_test_count() const { return death_test_count_
; }
20408 // Increments the death test count, returning the new count.
20409 int increment_death_test_count() { return ++death_test_count_
; }
20411 // Clears the test part results.
20412 void ClearTestPartResults();
20414 // Clears the object.
20417 // Protects mutable state of the property vector and of owned
20418 // properties, whose values may be updated.
20419 internal::Mutex test_properites_mutex_
;
20421 // The vector of TestPartResults
20422 std::vector
<TestPartResult
> test_part_results_
;
20423 // The vector of TestProperties
20424 std::vector
<TestProperty
> test_properties_
;
20425 // Running count of death tests.
20426 int death_test_count_
;
20427 // The elapsed time, in milliseconds.
20428 TimeInMillis elapsed_time_
;
20430 // We disallow copying TestResult.
20431 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult
);
20432 }; // class TestResult
20434 // A TestInfo object stores the following information about a test:
20438 // Whether the test should be run
20439 // A function pointer that creates the test object when invoked
20442 // The constructor of TestInfo registers itself with the UnitTest
20443 // singleton such that the RUN_ALL_TESTS() macro knows which tests to
20445 class GTEST_API_ TestInfo
{
20447 // Destructs a TestInfo object. This function is not virtual, so
20448 // don't inherit from TestInfo.
20451 // Returns the test case name.
20452 const char* test_case_name() const { return test_case_name_
.c_str(); }
20454 // Returns the test name.
20455 const char* name() const { return name_
.c_str(); }
20457 // Returns the name of the parameter type, or NULL if this is not a typed
20458 // or a type-parameterized test.
20459 const char* type_param() const {
20460 if (type_param_
.get() != NULL
)
20461 return type_param_
->c_str();
20465 // Returns the text representation of the value parameter, or NULL if this
20466 // is not a value-parameterized test.
20467 const char* value_param() const {
20468 if (value_param_
.get() != NULL
)
20469 return value_param_
->c_str();
20473 // Returns the file name where this test is defined.
20474 const char* file() const { return location_
.file
.c_str(); }
20476 // Returns the line where this test is defined.
20477 int line() const { return location_
.line
; }
20479 // Return true if this test should not be run because it's in another shard.
20480 bool is_in_another_shard() const { return is_in_another_shard_
; }
20482 // Returns true if this test should run, that is if the test is not
20483 // disabled (or it is disabled but the also_run_disabled_tests flag has
20484 // been specified) and its full name matches the user-specified filter.
20486 // Google Test allows the user to filter the tests by their full names.
20487 // The full name of a test Bar in test case Foo is defined as
20488 // "Foo.Bar". Only the tests that match the filter will run.
20490 // A filter is a colon-separated list of glob (not regex) patterns,
20491 // optionally followed by a '-' and a colon-separated list of
20492 // negative patterns (tests to exclude). A test is run if it
20493 // matches one of the positive patterns and does not match any of
20494 // the negative patterns.
20496 // For example, *A*:Foo.* is a filter that matches any string that
20497 // contains the character 'A' or starts with "Foo.".
20498 bool should_run() const { return should_run_
; }
20500 // Returns true iff this test will appear in the XML report.
20501 bool is_reportable() const {
20502 // The XML report includes tests matching the filter, excluding those
20503 // run in other shards.
20504 return matches_filter_
&& !is_in_another_shard_
;
20507 // Returns the result of the test.
20508 const TestResult
* result() const { return &result_
; }
20511 #if GTEST_HAS_DEATH_TEST
20512 friend class internal::DefaultDeathTestFactory
;
20513 #endif // GTEST_HAS_DEATH_TEST
20515 friend class TestCase
;
20516 friend class internal::UnitTestImpl
;
20517 friend class internal::StreamingListenerTest
;
20518 friend TestInfo
* internal::MakeAndRegisterTestInfo(
20519 const char* test_case_name
,
20521 const char* type_param
,
20522 const char* value_param
,
20523 internal::CodeLocation code_location
,
20524 internal::TypeId fixture_class_id
,
20525 Test::SetUpTestCaseFunc set_up_tc
,
20526 Test::TearDownTestCaseFunc tear_down_tc
,
20527 internal::TestFactoryBase
* factory
);
20529 // Constructs a TestInfo object. The newly constructed instance assumes
20530 // ownership of the factory object.
20531 TestInfo(const std::string
& test_case_name
,
20532 const std::string
& name
,
20533 const char* a_type_param
, // NULL if not a type-parameterized test
20534 const char* a_value_param
, // NULL if not a value-parameterized test
20535 internal::CodeLocation a_code_location
,
20536 internal::TypeId fixture_class_id
,
20537 internal::TestFactoryBase
* factory
);
20539 // Increments the number of death tests encountered in this test so
20541 int increment_death_test_count() {
20542 return result_
.increment_death_test_count();
20545 // Creates the test object, runs it, records its result, and then
20549 static void ClearTestResult(TestInfo
* test_info
) {
20550 test_info
->result_
.Clear();
20553 // These fields are immutable properties of the test.
20554 const std::string test_case_name_
; // Test case name
20555 const std::string name_
; // Test name
20556 // Name of the parameter type, or NULL if this is not a typed or a
20557 // type-parameterized test.
20558 const internal::scoped_ptr
<const ::std::string
> type_param_
;
20559 // Text representation of the value parameter, or NULL if this is not a
20560 // value-parameterized test.
20561 const internal::scoped_ptr
<const ::std::string
> value_param_
;
20562 internal::CodeLocation location_
;
20563 const internal::TypeId fixture_class_id_
; // ID of the test fixture class
20564 bool should_run_
; // True iff this test should run
20565 bool is_disabled_
; // True iff this test is disabled
20566 bool matches_filter_
; // True if this test matches the
20567 // user-specified filter.
20568 bool is_in_another_shard_
; // Will be run in another shard.
20569 internal::TestFactoryBase
* const factory_
; // The factory that creates
20572 // This field is mutable and needs to be reset before running the
20573 // test for the second time.
20574 TestResult result_
;
20576 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo
);
20579 // A test case, which consists of a vector of TestInfos.
20581 // TestCase is not copyable.
20582 class GTEST_API_ TestCase
{
20584 // Creates a TestCase with the given name.
20586 // TestCase does NOT have a default constructor. Always use this
20587 // constructor to create a TestCase object.
20591 // name: name of the test case
20592 // a_type_param: the name of the test's type parameter, or NULL if
20593 // this is not a type-parameterized test.
20594 // set_up_tc: pointer to the function that sets up the test case
20595 // tear_down_tc: pointer to the function that tears down the test case
20596 TestCase(const char* name
, const char* a_type_param
,
20597 Test::SetUpTestCaseFunc set_up_tc
,
20598 Test::TearDownTestCaseFunc tear_down_tc
);
20600 // Destructor of TestCase.
20601 virtual ~TestCase();
20603 // Gets the name of the TestCase.
20604 const char* name() const { return name_
.c_str(); }
20606 // Returns the name of the parameter type, or NULL if this is not a
20607 // type-parameterized test case.
20608 const char* type_param() const {
20609 if (type_param_
.get() != NULL
)
20610 return type_param_
->c_str();
20614 // Returns true if any test in this test case should run.
20615 bool should_run() const { return should_run_
; }
20617 // Gets the number of successful tests in this test case.
20618 int successful_test_count() const;
20620 // Gets the number of failed tests in this test case.
20621 int failed_test_count() const;
20623 // Gets the number of disabled tests that will be reported in the XML report.
20624 int reportable_disabled_test_count() const;
20626 // Gets the number of disabled tests in this test case.
20627 int disabled_test_count() const;
20629 // Gets the number of tests to be printed in the XML report.
20630 int reportable_test_count() const;
20632 // Get the number of tests in this test case that should run.
20633 int test_to_run_count() const;
20635 // Gets the number of all tests in this test case.
20636 int total_test_count() const;
20638 // Returns true iff the test case passed.
20639 bool Passed() const { return !Failed(); }
20641 // Returns true iff the test case failed.
20642 bool Failed() const { return failed_test_count() > 0; }
20644 // Returns the elapsed time, in milliseconds.
20645 TimeInMillis
elapsed_time() const { return elapsed_time_
; }
20647 // Returns the i-th test among all the tests. i can range from 0 to
20648 // total_test_count() - 1. If i is not in that range, returns NULL.
20649 const TestInfo
* GetTestInfo(int i
) const;
20651 // Returns the TestResult that holds test properties recorded during
20652 // execution of SetUpTestCase and TearDownTestCase.
20653 const TestResult
& ad_hoc_test_result() const { return ad_hoc_test_result_
; }
20657 friend class internal::UnitTestImpl
;
20659 // Gets the (mutable) vector of TestInfos in this TestCase.
20660 std::vector
<TestInfo
*>& test_info_list() { return test_info_list_
; }
20662 // Gets the (immutable) vector of TestInfos in this TestCase.
20663 const std::vector
<TestInfo
*>& test_info_list() const {
20664 return test_info_list_
;
20667 // Returns the i-th test among all the tests. i can range from 0 to
20668 // total_test_count() - 1. If i is not in that range, returns NULL.
20669 TestInfo
* GetMutableTestInfo(int i
);
20671 // Sets the should_run member.
20672 void set_should_run(bool should
) { should_run_
= should
; }
20674 // Adds a TestInfo to this test case. Will delete the TestInfo upon
20675 // destruction of the TestCase object.
20676 void AddTestInfo(TestInfo
* test_info
);
20678 // Clears the results of all tests in this test case.
20679 void ClearResult();
20681 // Clears the results of all tests in the given test case.
20682 static void ClearTestCaseResult(TestCase
* test_case
) {
20683 test_case
->ClearResult();
20686 // Runs every test in this TestCase.
20689 // Runs SetUpTestCase() for this TestCase. This wrapper is needed
20690 // for catching exceptions thrown from SetUpTestCase().
20691 void RunSetUpTestCase() { (*set_up_tc_
)(); }
20693 // Runs TearDownTestCase() for this TestCase. This wrapper is
20694 // needed for catching exceptions thrown from TearDownTestCase().
20695 void RunTearDownTestCase() { (*tear_down_tc_
)(); }
20697 // Returns true iff test passed.
20698 static bool TestPassed(const TestInfo
* test_info
) {
20699 return test_info
->should_run() && test_info
->result()->Passed();
20702 // Returns true iff test failed.
20703 static bool TestFailed(const TestInfo
* test_info
) {
20704 return test_info
->should_run() && test_info
->result()->Failed();
20707 // Returns true iff the test is disabled and will be reported in the XML
20709 static bool TestReportableDisabled(const TestInfo
* test_info
) {
20710 return test_info
->is_reportable() && test_info
->is_disabled_
;
20713 // Returns true iff test is disabled.
20714 static bool TestDisabled(const TestInfo
* test_info
) {
20715 return test_info
->is_disabled_
;
20718 // Returns true iff this test will appear in the XML report.
20719 static bool TestReportable(const TestInfo
* test_info
) {
20720 return test_info
->is_reportable();
20723 // Returns true if the given test should run.
20724 static bool ShouldRunTest(const TestInfo
* test_info
) {
20725 return test_info
->should_run();
20728 // Shuffles the tests in this test case.
20729 void ShuffleTests(internal::Random
* random
);
20731 // Restores the test order to before the first shuffle.
20732 void UnshuffleTests();
20734 // Name of the test case.
20736 // Name of the parameter type, or NULL if this is not a typed or a
20737 // type-parameterized test.
20738 const internal::scoped_ptr
<const ::std::string
> type_param_
;
20739 // The vector of TestInfos in their original order. It owns the
20740 // elements in the vector.
20741 std::vector
<TestInfo
*> test_info_list_
;
20742 // Provides a level of indirection for the test list to allow easy
20743 // shuffling and restoring the test order. The i-th element in this
20744 // vector is the index of the i-th test in the shuffled test list.
20745 std::vector
<int> test_indices_
;
20746 // Pointer to the function that sets up the test case.
20747 Test::SetUpTestCaseFunc set_up_tc_
;
20748 // Pointer to the function that tears down the test case.
20749 Test::TearDownTestCaseFunc tear_down_tc_
;
20750 // True iff any test in this test case should run.
20752 // Elapsed time, in milliseconds.
20753 TimeInMillis elapsed_time_
;
20754 // Holds test properties recorded during execution of SetUpTestCase and
20755 // TearDownTestCase.
20756 TestResult ad_hoc_test_result_
;
20758 // We disallow copying TestCases.
20759 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase
);
20762 // An Environment object is capable of setting up and tearing down an
20763 // environment. You should subclass this to define your own
20766 // An Environment object does the set-up and tear-down in virtual
20767 // methods SetUp() and TearDown() instead of the constructor and the
20770 // 1. You cannot safely throw from a destructor. This is a problem
20771 // as in some cases Google Test is used where exceptions are enabled, and
20772 // we may want to implement ASSERT_* using exceptions where they are
20774 // 2. You cannot use ASSERT_* directly in a constructor or
20776 class Environment
{
20778 // The d'tor is virtual as we need to subclass Environment.
20779 virtual ~Environment() {}
20781 // Override this to define how to set up the environment.
20782 virtual void SetUp() {}
20784 // Override this to define how to tear down the environment.
20785 virtual void TearDown() {}
20787 // If you see an error about overriding the following function or
20788 // about it being private, you have mis-spelled SetUp() as Setup().
20789 struct Setup_should_be_spelled_SetUp
{};
20790 virtual Setup_should_be_spelled_SetUp
* Setup() { return NULL
; }
20793 #if GTEST_HAS_EXCEPTIONS
20795 // Exception which can be thrown from TestEventListener::OnTestPartResult.
20796 class GTEST_API_ AssertionException
20797 : public internal::GoogleTestFailureException
{
20799 explicit AssertionException(const TestPartResult
& result
)
20800 : GoogleTestFailureException(result
) {}
20803 #endif // GTEST_HAS_EXCEPTIONS
20805 // The interface for tracing execution of tests. The methods are organized in
20806 // the order the corresponding events are fired.
20807 class TestEventListener
{
20809 virtual ~TestEventListener() {}
20811 // Fired before any test activity starts.
20812 virtual void OnTestProgramStart(const UnitTest
& unit_test
) = 0;
20814 // Fired before each iteration of tests starts. There may be more than
20815 // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
20816 // index, starting from 0.
20817 virtual void OnTestIterationStart(const UnitTest
& unit_test
,
20818 int iteration
) = 0;
20820 // Fired before environment set-up for each iteration of tests starts.
20821 virtual void OnEnvironmentsSetUpStart(const UnitTest
& unit_test
) = 0;
20823 // Fired after environment set-up for each iteration of tests ends.
20824 virtual void OnEnvironmentsSetUpEnd(const UnitTest
& unit_test
) = 0;
20826 // Fired before the test case starts.
20827 virtual void OnTestCaseStart(const TestCase
& test_case
) = 0;
20829 // Fired before the test starts.
20830 virtual void OnTestStart(const TestInfo
& test_info
) = 0;
20832 // Fired after a failed assertion or a SUCCEED() invocation.
20833 // If you want to throw an exception from this function to skip to the next
20834 // TEST, it must be AssertionException defined above, or inherited from it.
20835 virtual void OnTestPartResult(const TestPartResult
& test_part_result
) = 0;
20837 // Fired after the test ends.
20838 virtual void OnTestEnd(const TestInfo
& test_info
) = 0;
20840 // Fired after the test case ends.
20841 virtual void OnTestCaseEnd(const TestCase
& test_case
) = 0;
20843 // Fired before environment tear-down for each iteration of tests starts.
20844 virtual void OnEnvironmentsTearDownStart(const UnitTest
& unit_test
) = 0;
20846 // Fired after environment tear-down for each iteration of tests ends.
20847 virtual void OnEnvironmentsTearDownEnd(const UnitTest
& unit_test
) = 0;
20849 // Fired after each iteration of tests finishes.
20850 virtual void OnTestIterationEnd(const UnitTest
& unit_test
,
20851 int iteration
) = 0;
20853 // Fired after all test activities have ended.
20854 virtual void OnTestProgramEnd(const UnitTest
& unit_test
) = 0;
20857 // The convenience class for users who need to override just one or two
20858 // methods and are not concerned that a possible change to a signature of
20859 // the methods they override will not be caught during the build. For
20860 // comments about each method please see the definition of TestEventListener
20862 class EmptyTestEventListener
: public TestEventListener
{
20864 virtual void OnTestProgramStart(const UnitTest
& /*unit_test*/) {}
20865 virtual void OnTestIterationStart(const UnitTest
& /*unit_test*/,
20866 int /*iteration*/) {}
20867 virtual void OnEnvironmentsSetUpStart(const UnitTest
& /*unit_test*/) {}
20868 virtual void OnEnvironmentsSetUpEnd(const UnitTest
& /*unit_test*/) {}
20869 virtual void OnTestCaseStart(const TestCase
& /*test_case*/) {}
20870 virtual void OnTestStart(const TestInfo
& /*test_info*/) {}
20871 virtual void OnTestPartResult(const TestPartResult
& /*test_part_result*/) {}
20872 virtual void OnTestEnd(const TestInfo
& /*test_info*/) {}
20873 virtual void OnTestCaseEnd(const TestCase
& /*test_case*/) {}
20874 virtual void OnEnvironmentsTearDownStart(const UnitTest
& /*unit_test*/) {}
20875 virtual void OnEnvironmentsTearDownEnd(const UnitTest
& /*unit_test*/) {}
20876 virtual void OnTestIterationEnd(const UnitTest
& /*unit_test*/,
20877 int /*iteration*/) {}
20878 virtual void OnTestProgramEnd(const UnitTest
& /*unit_test*/) {}
20881 // TestEventListeners lets users add listeners to track events in Google Test.
20882 class GTEST_API_ TestEventListeners
{
20884 TestEventListeners();
20885 ~TestEventListeners();
20887 // Appends an event listener to the end of the list. Google Test assumes
20888 // the ownership of the listener (i.e. it will delete the listener when
20889 // the test program finishes).
20890 void Append(TestEventListener
* listener
);
20892 // Removes the given event listener from the list and returns it. It then
20893 // becomes the caller's responsibility to delete the listener. Returns
20894 // NULL if the listener is not found in the list.
20895 TestEventListener
* Release(TestEventListener
* listener
);
20897 // Returns the standard listener responsible for the default console
20898 // output. Can be removed from the listeners list to shut down default
20899 // console output. Note that removing this object from the listener list
20900 // with Release transfers its ownership to the caller and makes this
20901 // function return NULL the next time.
20902 TestEventListener
* default_result_printer() const {
20903 return default_result_printer_
;
20906 // Returns the standard listener responsible for the default XML output
20907 // controlled by the --gtest_output=xml flag. Can be removed from the
20908 // listeners list by users who want to shut down the default XML output
20909 // controlled by this flag and substitute it with custom one. Note that
20910 // removing this object from the listener list with Release transfers its
20911 // ownership to the caller and makes this function return NULL the next
20913 TestEventListener
* default_xml_generator() const {
20914 return default_xml_generator_
;
20918 friend class TestCase
;
20919 friend class TestInfo
;
20920 friend class internal::DefaultGlobalTestPartResultReporter
;
20921 friend class internal::NoExecDeathTest
;
20922 friend class internal::TestEventListenersAccessor
;
20923 friend class internal::UnitTestImpl
;
20925 // Returns repeater that broadcasts the TestEventListener events to all
20927 TestEventListener
* repeater();
20929 // Sets the default_result_printer attribute to the provided listener.
20930 // The listener is also added to the listener list and previous
20931 // default_result_printer is removed from it and deleted. The listener can
20932 // also be NULL in which case it will not be added to the list. Does
20933 // nothing if the previous and the current listener objects are the same.
20934 void SetDefaultResultPrinter(TestEventListener
* listener
);
20936 // Sets the default_xml_generator attribute to the provided listener. The
20937 // listener is also added to the listener list and previous
20938 // default_xml_generator is removed from it and deleted. The listener can
20939 // also be NULL in which case it will not be added to the list. Does
20940 // nothing if the previous and the current listener objects are the same.
20941 void SetDefaultXmlGenerator(TestEventListener
* listener
);
20943 // Controls whether events will be forwarded by the repeater to the
20944 // listeners in the list.
20945 bool EventForwardingEnabled() const;
20946 void SuppressEventForwarding();
20948 // The actual list of listeners.
20949 internal::TestEventRepeater
* repeater_
;
20950 // Listener responsible for the standard result output.
20951 TestEventListener
* default_result_printer_
;
20952 // Listener responsible for the creation of the XML output file.
20953 TestEventListener
* default_xml_generator_
;
20955 // We disallow copying TestEventListeners.
20956 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners
);
20959 // A UnitTest consists of a vector of TestCases.
20961 // This is a singleton class. The only instance of UnitTest is
20962 // created when UnitTest::GetInstance() is first called. This
20963 // instance is never deleted.
20965 // UnitTest is not copyable.
20967 // This class is thread-safe as long as the methods are called
20968 // according to their specification.
20969 class GTEST_API_ UnitTest
{
20971 // Gets the singleton UnitTest object. The first time this method
20972 // is called, a UnitTest object is constructed and returned.
20973 // Consecutive calls will return the same object.
20974 static UnitTest
* GetInstance();
20976 // Runs all tests in this UnitTest object and prints the result.
20977 // Returns 0 if successful, or 1 otherwise.
20979 // This method can only be called from the main thread.
20981 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
20982 int Run() GTEST_MUST_USE_RESULT_
;
20984 // Returns the working directory when the first TEST() or TEST_F()
20985 // was executed. The UnitTest object owns the string.
20986 const char* original_working_dir() const;
20988 // Returns the TestCase object for the test that's currently running,
20989 // or NULL if no test is running.
20990 const TestCase
* current_test_case() const
20991 GTEST_LOCK_EXCLUDED_(mutex_
);
20993 // Returns the TestInfo object for the test that's currently running,
20994 // or NULL if no test is running.
20995 const TestInfo
* current_test_info() const
20996 GTEST_LOCK_EXCLUDED_(mutex_
);
20998 // Returns the random seed used at the start of the current test run.
20999 int random_seed() const;
21001 // Returns the ParameterizedTestCaseRegistry object used to keep track of
21002 // value-parameterized tests and instantiate and register them.
21004 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21005 internal::ParameterizedTestCaseRegistry
& parameterized_test_registry()
21006 GTEST_LOCK_EXCLUDED_(mutex_
);
21008 // Gets the number of successful test cases.
21009 int successful_test_case_count() const;
21011 // Gets the number of failed test cases.
21012 int failed_test_case_count() const;
21014 // Gets the number of all test cases.
21015 int total_test_case_count() const;
21017 // Gets the number of all test cases that contain at least one test
21018 // that should run.
21019 int test_case_to_run_count() const;
21021 // Gets the number of successful tests.
21022 int successful_test_count() const;
21024 // Gets the number of failed tests.
21025 int failed_test_count() const;
21027 // Gets the number of disabled tests that will be reported in the XML report.
21028 int reportable_disabled_test_count() const;
21030 // Gets the number of disabled tests.
21031 int disabled_test_count() const;
21033 // Gets the number of tests to be printed in the XML report.
21034 int reportable_test_count() const;
21036 // Gets the number of all tests.
21037 int total_test_count() const;
21039 // Gets the number of tests that should run.
21040 int test_to_run_count() const;
21042 // Gets the time of the test program start, in ms from the start of the
21044 TimeInMillis
start_timestamp() const;
21046 // Gets the elapsed time, in milliseconds.
21047 TimeInMillis
elapsed_time() const;
21049 // Returns true iff the unit test passed (i.e. all test cases passed).
21050 bool Passed() const;
21052 // Returns true iff the unit test failed (i.e. some test case failed
21053 // or something outside of all tests failed).
21054 bool Failed() const;
21056 // Gets the i-th test case among all the test cases. i can range from 0 to
21057 // total_test_case_count() - 1. If i is not in that range, returns NULL.
21058 const TestCase
* GetTestCase(int i
) const;
21060 // Returns the TestResult containing information on test failures and
21061 // properties logged outside of individual test cases.
21062 const TestResult
& ad_hoc_test_result() const;
21064 // Returns the list of event listeners that can be used to track events
21065 // inside Google Test.
21066 TestEventListeners
& listeners();
21069 // Registers and returns a global test environment. When a test
21070 // program is run, all global test environments will be set-up in
21071 // the order they were registered. After all tests in the program
21072 // have finished, all global test environments will be torn-down in
21073 // the *reverse* order they were registered.
21075 // The UnitTest object takes ownership of the given environment.
21077 // This method can only be called from the main thread.
21078 Environment
* AddEnvironment(Environment
* env
);
21080 // Adds a TestPartResult to the current TestResult object. All
21081 // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
21082 // eventually call this to report their results. The user code
21083 // should use the assertion macros instead of calling this directly.
21084 void AddTestPartResult(TestPartResult::Type result_type
,
21085 const char* file_name
,
21087 const std::string
& message
,
21088 const std::string
& os_stack_trace
)
21089 GTEST_LOCK_EXCLUDED_(mutex_
);
21091 // Adds a TestProperty to the current TestResult object when invoked from
21092 // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
21093 // from SetUpTestCase or TearDownTestCase, or to the global property set
21094 // when invoked elsewhere. If the result already contains a property with
21095 // the same key, the value will be updated.
21096 void RecordProperty(const std::string
& key
, const std::string
& value
);
21098 // Gets the i-th test case among all the test cases. i can range from 0 to
21099 // total_test_case_count() - 1. If i is not in that range, returns NULL.
21100 TestCase
* GetMutableTestCase(int i
);
21102 // Accessors for the implementation object.
21103 internal::UnitTestImpl
* impl() { return impl_
; }
21104 const internal::UnitTestImpl
* impl() const { return impl_
; }
21106 // These classes and functions are friends as they need to access private
21107 // members of UnitTest.
21108 friend class ScopedTrace
;
21110 friend class internal::AssertHelper
;
21111 friend class internal::StreamingListenerTest
;
21112 friend class internal::UnitTestRecordPropertyTestHelper
;
21113 friend Environment
* AddGlobalTestEnvironment(Environment
* env
);
21114 friend internal::UnitTestImpl
* internal::GetUnitTestImpl();
21115 friend void internal::ReportFailureInUnknownLocation(
21116 TestPartResult::Type result_type
,
21117 const std::string
& message
);
21119 // Creates an empty UnitTest.
21123 virtual ~UnitTest();
21125 // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
21126 // Google Test trace stack.
21127 void PushGTestTrace(const internal::TraceInfo
& trace
)
21128 GTEST_LOCK_EXCLUDED_(mutex_
);
21130 // Pops a trace from the per-thread Google Test trace stack.
21131 void PopGTestTrace()
21132 GTEST_LOCK_EXCLUDED_(mutex_
);
21134 // Protects mutable state in *impl_. This is mutable as some const
21135 // methods need to lock it too.
21136 mutable internal::Mutex mutex_
;
21138 // Opaque implementation object. This field is never changed once
21139 // the object is constructed. We don't mark it as const here, as
21140 // doing so will cause a warning in the constructor of UnitTest.
21141 // Mutable state in *impl_ is protected by mutex_.
21142 internal::UnitTestImpl
* impl_
;
21144 // We disallow copying UnitTest.
21145 GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest
);
21148 // A convenient wrapper for adding an environment for the test
21151 // You should call this before RUN_ALL_TESTS() is called, probably in
21152 // main(). If you use gtest_main, you need to call this before main()
21153 // starts for it to take effect. For example, you can define a global
21154 // variable like this:
21156 // testing::Environment* const foo_env =
21157 // testing::AddGlobalTestEnvironment(new FooEnvironment);
21159 // However, we strongly recommend you to write your own main() and
21160 // call AddGlobalTestEnvironment() there, as relying on initialization
21161 // of global variables makes the code harder to read and may cause
21162 // problems when you register multiple environments from different
21163 // translation units and the environments have dependencies among them
21164 // (remember that the compiler doesn't guarantee the order in which
21165 // global variables from different translation units are initialized).
21166 inline Environment
* AddGlobalTestEnvironment(Environment
* env
) {
21167 return UnitTest::GetInstance()->AddEnvironment(env
);
21170 // Initializes Google Test. This must be called before calling
21171 // RUN_ALL_TESTS(). In particular, it parses a command line for the
21172 // flags that Google Test recognizes. Whenever a Google Test flag is
21173 // seen, it is removed from argv, and *argc is decremented.
21175 // No value is returned. Instead, the Google Test flag variables are
21178 // Calling the function for the second time has no user-visible effect.
21179 GTEST_API_
void InitGoogleTest(int* argc
, char** argv
);
21181 // This overloaded version can be used in Windows programs compiled in
21183 GTEST_API_
void InitGoogleTest(int* argc
, wchar_t** argv
);
21185 namespace internal
{
21187 // Separate the error generating code from the code path to reduce the stack
21188 // frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers
21189 // when calling EXPECT_* in a tight loop.
21190 template <typename T1
, typename T2
>
21191 AssertionResult
CmpHelperEQFailure(const char* lhs_expression
,
21192 const char* rhs_expression
,
21193 const T1
& lhs
, const T2
& rhs
) {
21194 return EqFailure(lhs_expression
,
21196 FormatForComparisonFailureMessage(lhs
, rhs
),
21197 FormatForComparisonFailureMessage(rhs
, lhs
),
21201 // The helper function for {ASSERT|EXPECT}_EQ.
21202 template <typename T1
, typename T2
>
21203 AssertionResult
CmpHelperEQ(const char* lhs_expression
,
21204 const char* rhs_expression
,
21208 return AssertionSuccess();
21211 return CmpHelperEQFailure(lhs_expression
, rhs_expression
, lhs
, rhs
);
21214 // With this overloaded version, we allow anonymous enums to be used
21215 // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
21216 // can be implicitly cast to BiggestInt.
21217 GTEST_API_ AssertionResult
CmpHelperEQ(const char* lhs_expression
,
21218 const char* rhs_expression
,
21222 // The helper class for {ASSERT|EXPECT}_EQ. The template argument
21223 // lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
21224 // is a null pointer literal. The following default implementation is
21225 // for lhs_is_null_literal being false.
21226 template <bool lhs_is_null_literal
>
21229 // This templatized version is for the general case.
21230 template <typename T1
, typename T2
>
21231 static AssertionResult
Compare(const char* lhs_expression
,
21232 const char* rhs_expression
,
21235 return CmpHelperEQ(lhs_expression
, rhs_expression
, lhs
, rhs
);
21238 // With this overloaded version, we allow anonymous enums to be used
21239 // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
21240 // enums can be implicitly cast to BiggestInt.
21242 // Even though its body looks the same as the above version, we
21243 // cannot merge the two, as it will make anonymous enums unhappy.
21244 static AssertionResult
Compare(const char* lhs_expression
,
21245 const char* rhs_expression
,
21248 return CmpHelperEQ(lhs_expression
, rhs_expression
, lhs
, rhs
);
21252 // This specialization is used when the first argument to ASSERT_EQ()
21253 // is a null pointer literal, like NULL, false, or 0.
21255 class EqHelper
<true> {
21257 // We define two overloaded versions of Compare(). The first
21258 // version will be picked when the second argument to ASSERT_EQ() is
21259 // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
21260 // EXPECT_EQ(false, a_bool).
21261 template <typename T1
, typename T2
>
21262 static AssertionResult
Compare(
21263 const char* lhs_expression
,
21264 const char* rhs_expression
,
21267 // The following line prevents this overload from being considered if T2
21268 // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)
21269 // expands to Compare("", "", NULL, my_ptr), which requires a conversion
21270 // to match the Secret* in the other overload, which would otherwise make
21271 // this template match better.
21272 typename EnableIf
<!is_pointer
<T2
>::value
>::type
* = 0) {
21273 return CmpHelperEQ(lhs_expression
, rhs_expression
, lhs
, rhs
);
21276 // This version will be picked when the second argument to ASSERT_EQ() is a
21277 // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
21278 template <typename T
>
21279 static AssertionResult
Compare(
21280 const char* lhs_expression
,
21281 const char* rhs_expression
,
21282 // We used to have a second template parameter instead of Secret*. That
21283 // template parameter would deduce to 'long', making this a better match
21284 // than the first overload even without the first overload's EnableIf.
21285 // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
21286 // non-pointer argument" (even a deduced integral argument), so the old
21287 // implementation caused warnings in user code.
21288 Secret
* /* lhs (NULL) */,
21290 // We already know that 'lhs' is a null pointer.
21291 return CmpHelperEQ(lhs_expression
, rhs_expression
,
21292 static_cast<T
*>(NULL
), rhs
);
21296 // Separate the error generating code from the code path to reduce the stack
21297 // frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers
21298 // when calling EXPECT_OP in a tight loop.
21299 template <typename T1
, typename T2
>
21300 AssertionResult
CmpHelperOpFailure(const char* expr1
, const char* expr2
,
21301 const T1
& val1
, const T2
& val2
,
21303 return AssertionFailure()
21304 << "Expected: (" << expr1
<< ") " << op
<< " (" << expr2
21305 << "), actual: " << FormatForComparisonFailureMessage(val1
, val2
)
21306 << " vs " << FormatForComparisonFailureMessage(val2
, val1
);
21309 // A macro for implementing the helper functions needed to implement
21310 // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
21311 // of similar code.
21313 // For each templatized helper function, we also define an overloaded
21314 // version for BiggestInt in order to reduce code bloat and allow
21315 // anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
21318 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21320 #define GTEST_IMPL_CMP_HELPER_(op_name, op)\
21321 template <typename T1, typename T2>\
21322 AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
21323 const T1& val1, const T2& val2) {\
21324 if (val1 op val2) {\
21325 return AssertionSuccess();\
21327 return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\
21330 GTEST_API_ AssertionResult CmpHelper##op_name(\
21331 const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
21333 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21335 // Implements the helper function for {ASSERT|EXPECT}_NE
21336 GTEST_IMPL_CMP_HELPER_(NE
, !=);
21337 // Implements the helper function for {ASSERT|EXPECT}_LE
21338 GTEST_IMPL_CMP_HELPER_(LE
, <=);
21339 // Implements the helper function for {ASSERT|EXPECT}_LT
21340 GTEST_IMPL_CMP_HELPER_(LT
, <);
21341 // Implements the helper function for {ASSERT|EXPECT}_GE
21342 GTEST_IMPL_CMP_HELPER_(GE
, >=);
21343 // Implements the helper function for {ASSERT|EXPECT}_GT
21344 GTEST_IMPL_CMP_HELPER_(GT
, >);
21346 #undef GTEST_IMPL_CMP_HELPER_
21348 // The helper function for {ASSERT|EXPECT}_STREQ.
21350 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21351 GTEST_API_ AssertionResult
CmpHelperSTREQ(const char* s1_expression
,
21352 const char* s2_expression
,
21356 // The helper function for {ASSERT|EXPECT}_STRCASEEQ.
21358 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21359 GTEST_API_ AssertionResult
CmpHelperSTRCASEEQ(const char* s1_expression
,
21360 const char* s2_expression
,
21364 // The helper function for {ASSERT|EXPECT}_STRNE.
21366 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21367 GTEST_API_ AssertionResult
CmpHelperSTRNE(const char* s1_expression
,
21368 const char* s2_expression
,
21372 // The helper function for {ASSERT|EXPECT}_STRCASENE.
21374 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21375 GTEST_API_ AssertionResult
CmpHelperSTRCASENE(const char* s1_expression
,
21376 const char* s2_expression
,
21381 // Helper function for *_STREQ on wide strings.
21383 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21384 GTEST_API_ AssertionResult
CmpHelperSTREQ(const char* s1_expression
,
21385 const char* s2_expression
,
21387 const wchar_t* s2
);
21389 // Helper function for *_STRNE on wide strings.
21391 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21392 GTEST_API_ AssertionResult
CmpHelperSTRNE(const char* s1_expression
,
21393 const char* s2_expression
,
21395 const wchar_t* s2
);
21397 } // namespace internal
21399 // IsSubstring() and IsNotSubstring() are intended to be used as the
21400 // first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
21401 // themselves. They check whether needle is a substring of haystack
21402 // (NULL is considered a substring of itself only), and return an
21403 // appropriate error message when they fail.
21405 // The {needle,haystack}_expr arguments are the stringified
21406 // expressions that generated the two real arguments.
21407 GTEST_API_ AssertionResult
IsSubstring(
21408 const char* needle_expr
, const char* haystack_expr
,
21409 const char* needle
, const char* haystack
);
21410 GTEST_API_ AssertionResult
IsSubstring(
21411 const char* needle_expr
, const char* haystack_expr
,
21412 const wchar_t* needle
, const wchar_t* haystack
);
21413 GTEST_API_ AssertionResult
IsNotSubstring(
21414 const char* needle_expr
, const char* haystack_expr
,
21415 const char* needle
, const char* haystack
);
21416 GTEST_API_ AssertionResult
IsNotSubstring(
21417 const char* needle_expr
, const char* haystack_expr
,
21418 const wchar_t* needle
, const wchar_t* haystack
);
21419 GTEST_API_ AssertionResult
IsSubstring(
21420 const char* needle_expr
, const char* haystack_expr
,
21421 const ::std::string
& needle
, const ::std::string
& haystack
);
21422 GTEST_API_ AssertionResult
IsNotSubstring(
21423 const char* needle_expr
, const char* haystack_expr
,
21424 const ::std::string
& needle
, const ::std::string
& haystack
);
21426 #if GTEST_HAS_STD_WSTRING
21427 GTEST_API_ AssertionResult
IsSubstring(
21428 const char* needle_expr
, const char* haystack_expr
,
21429 const ::std::wstring
& needle
, const ::std::wstring
& haystack
);
21430 GTEST_API_ AssertionResult
IsNotSubstring(
21431 const char* needle_expr
, const char* haystack_expr
,
21432 const ::std::wstring
& needle
, const ::std::wstring
& haystack
);
21433 #endif // GTEST_HAS_STD_WSTRING
21435 namespace internal
{
21437 // Helper template function for comparing floating-points.
21439 // Template parameter:
21441 // RawType: the raw floating-point type (either float or double)
21443 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21444 template <typename RawType
>
21445 AssertionResult
CmpHelperFloatingPointEQ(const char* lhs_expression
,
21446 const char* rhs_expression
,
21448 RawType rhs_value
) {
21449 const FloatingPoint
<RawType
> lhs(lhs_value
), rhs(rhs_value
);
21451 if (lhs
.AlmostEquals(rhs
)) {
21452 return AssertionSuccess();
21455 ::std::stringstream lhs_ss
;
21456 lhs_ss
<< std::setprecision(std::numeric_limits
<RawType
>::digits10
+ 2)
21459 ::std::stringstream rhs_ss
;
21460 rhs_ss
<< std::setprecision(std::numeric_limits
<RawType
>::digits10
+ 2)
21463 return EqFailure(lhs_expression
,
21465 StringStreamToString(&lhs_ss
),
21466 StringStreamToString(&rhs_ss
),
21470 // Helper function for implementing ASSERT_NEAR.
21472 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
21473 GTEST_API_ AssertionResult
DoubleNearPredFormat(const char* expr1
,
21475 const char* abs_error_expr
,
21480 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
21481 // A class that enables one to stream messages to assertion macros
21482 class GTEST_API_ AssertHelper
{
21485 AssertHelper(TestPartResult::Type type
,
21488 const char* message
);
21491 // Message assignment is a semantic trick to enable assertion
21492 // streaming; see the GTEST_MESSAGE_ macro below.
21493 void operator=(const Message
& message
) const;
21496 // We put our data in a struct so that the size of the AssertHelper class can
21497 // be as small as possible. This is important because gcc is incapable of
21498 // re-using stack space even for temporary variables, so every EXPECT_EQ
21499 // reserves stack space for another AssertHelper.
21500 struct AssertHelperData
{
21501 AssertHelperData(TestPartResult::Type t
,
21502 const char* srcfile
,
21505 : type(t
), file(srcfile
), line(line_num
), message(msg
) { }
21507 TestPartResult::Type
const type
;
21508 const char* const file
;
21510 std::string
const message
;
21513 GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData
);
21516 AssertHelperData
* const data_
;
21518 GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper
);
21521 } // namespace internal
21523 // The pure interface class that all value-parameterized tests inherit from.
21524 // A value-parameterized class must inherit from both ::testing::Test and
21525 // ::testing::WithParamInterface. In most cases that just means inheriting
21526 // from ::testing::TestWithParam, but more complicated test hierarchies
21527 // may need to inherit from Test and WithParamInterface at different levels.
21529 // This interface has support for accessing the test parameter value via
21530 // the GetParam() method.
21532 // Use it with one of the parameter generator defining functions, like Range(),
21533 // Values(), ValuesIn(), Bool(), and Combine().
21535 // class FooTest : public ::testing::TestWithParam<int> {
21538 // // Can use GetParam() here.
21540 // virtual ~FooTest() {
21541 // // Can use GetParam() here.
21543 // virtual void SetUp() {
21544 // // Can use GetParam() here.
21546 // virtual void TearDown {
21547 // // Can use GetParam() here.
21550 // TEST_P(FooTest, DoesBar) {
21551 // // Can use GetParam() method here.
21553 // ASSERT_TRUE(foo.DoesBar(GetParam()));
21555 // INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
21557 template <typename T
>
21558 class WithParamInterface
{
21560 typedef T ParamType
;
21561 virtual ~WithParamInterface() {}
21563 // The current parameter value. Is also available in the test fixture's
21564 // constructor. This member function is non-static, even though it only
21565 // references static data, to reduce the opportunity for incorrect uses
21566 // like writing 'WithParamInterface<bool>::GetParam()' for a test that
21567 // uses a fixture whose parameter type is int.
21568 const ParamType
& GetParam() const {
21569 GTEST_CHECK_(parameter_
!= NULL
)
21570 << "GetParam() can only be called inside a value-parameterized test "
21571 << "-- did you intend to write TEST_P instead of TEST_F?";
21572 return *parameter_
;
21576 // Sets parameter value. The caller is responsible for making sure the value
21577 // remains alive and unchanged throughout the current test.
21578 static void SetParam(const ParamType
* parameter
) {
21579 parameter_
= parameter
;
21582 // Static value used for accessing parameter during a test lifetime.
21583 static const ParamType
* parameter_
;
21585 // TestClass must be a subclass of WithParamInterface<T> and Test.
21586 template <class TestClass
> friend class internal::ParameterizedTestFactory
;
21589 template <typename T
>
21590 const T
* WithParamInterface
<T
>::parameter_
= NULL
;
21592 // Most value-parameterized classes can ignore the existence of
21593 // WithParamInterface, and can just inherit from ::testing::TestWithParam.
21595 template <typename T
>
21596 class TestWithParam
: public Test
, public WithParamInterface
<T
> {
21599 // Macros for indicating success/failure in test code.
21601 // ADD_FAILURE unconditionally adds a failure to the current test.
21602 // SUCCEED generates a success - it doesn't automatically make the
21603 // current test successful, as a test is only successful when it has
21606 // EXPECT_* verifies that a certain condition is satisfied. If not,
21607 // it behaves like ADD_FAILURE. In particular:
21609 // EXPECT_TRUE verifies that a Boolean condition is true.
21610 // EXPECT_FALSE verifies that a Boolean condition is false.
21612 // FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
21613 // that they will also abort the current function on failure. People
21614 // usually want the fail-fast behavior of FAIL and ASSERT_*, but those
21615 // writing data-driven tests often find themselves using ADD_FAILURE
21616 // and EXPECT_* more.
21618 // Generates a nonfatal failure with a generic message.
21619 #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
21621 // Generates a nonfatal failure at the given source file location with
21622 // a generic message.
21623 #define ADD_FAILURE_AT(file, line) \
21624 GTEST_MESSAGE_AT_(file, line, "Failed", \
21625 ::testing::TestPartResult::kNonFatalFailure)
21627 // Generates a fatal failure with a generic message.
21628 #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
21630 // Define this macro to 1 to omit the definition of FAIL(), which is a
21631 // generic name and clashes with some other libraries.
21632 #if !GTEST_DONT_DEFINE_FAIL
21633 # define FAIL() GTEST_FAIL()
21636 // Generates a success with a generic message.
21637 #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
21639 // Define this macro to 1 to omit the definition of SUCCEED(), which
21640 // is a generic name and clashes with some other libraries.
21641 #if !GTEST_DONT_DEFINE_SUCCEED
21642 # define SUCCEED() GTEST_SUCCEED()
21645 // Macros for testing exceptions.
21647 // * {ASSERT|EXPECT}_THROW(statement, expected_exception):
21648 // Tests that the statement throws the expected exception.
21649 // * {ASSERT|EXPECT}_NO_THROW(statement):
21650 // Tests that the statement doesn't throw any exception.
21651 // * {ASSERT|EXPECT}_ANY_THROW(statement):
21652 // Tests that the statement throws an exception.
21654 #define EXPECT_THROW(statement, expected_exception) \
21655 GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
21656 #define EXPECT_NO_THROW(statement) \
21657 GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
21658 #define EXPECT_ANY_THROW(statement) \
21659 GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
21660 #define ASSERT_THROW(statement, expected_exception) \
21661 GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
21662 #define ASSERT_NO_THROW(statement) \
21663 GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
21664 #define ASSERT_ANY_THROW(statement) \
21665 GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
21667 // Boolean assertions. Condition can be either a Boolean expression or an
21668 // AssertionResult. For more information on how to use AssertionResult with
21669 // these macros see comments on that class.
21670 #define EXPECT_TRUE(condition) \
21671 GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
21672 GTEST_NONFATAL_FAILURE_)
21673 #define EXPECT_FALSE(condition) \
21674 GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
21675 GTEST_NONFATAL_FAILURE_)
21676 #define ASSERT_TRUE(condition) \
21677 GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
21678 GTEST_FATAL_FAILURE_)
21679 #define ASSERT_FALSE(condition) \
21680 GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
21681 GTEST_FATAL_FAILURE_)
21683 // Macros for testing equalities and inequalities.
21685 // * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2
21686 // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
21687 // * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
21688 // * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
21689 // * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
21690 // * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
21692 // When they are not, Google Test prints both the tested expressions and
21693 // their actual values. The values must be compatible built-in types,
21694 // or you will get a compiler error. By "compatible" we mean that the
21695 // values can be compared by the respective operator.
21699 // 1. It is possible to make a user-defined type work with
21700 // {ASSERT|EXPECT}_??(), but that requires overloading the
21701 // comparison operators and is thus discouraged by the Google C++
21702 // Usage Guide. Therefore, you are advised to use the
21703 // {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
21706 // 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
21707 // pointers (in particular, C strings). Therefore, if you use it
21708 // with two C strings, you are testing how their locations in memory
21709 // are related, not how their content is related. To compare two C
21710 // strings by content, use {ASSERT|EXPECT}_STR*().
21712 // 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to
21713 // {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you
21714 // what the actual value is when it fails, and similarly for the
21715 // other comparisons.
21717 // 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
21718 // evaluate their arguments, which is undefined.
21720 // 5. These macros evaluate their arguments exactly once.
21724 // EXPECT_NE(Foo(), 5);
21725 // EXPECT_EQ(a_pointer, NULL);
21726 // ASSERT_LT(i, array_size);
21727 // ASSERT_GT(records.size(), 0) << "There is no record left.";
21729 #define EXPECT_EQ(val1, val2) \
21730 EXPECT_PRED_FORMAT2(::testing::internal:: \
21731 EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \
21733 #define EXPECT_NE(val1, val2) \
21734 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
21735 #define EXPECT_LE(val1, val2) \
21736 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
21737 #define EXPECT_LT(val1, val2) \
21738 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
21739 #define EXPECT_GE(val1, val2) \
21740 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
21741 #define EXPECT_GT(val1, val2) \
21742 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
21744 #define GTEST_ASSERT_EQ(val1, val2) \
21745 ASSERT_PRED_FORMAT2(::testing::internal:: \
21746 EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \
21748 #define GTEST_ASSERT_NE(val1, val2) \
21749 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
21750 #define GTEST_ASSERT_LE(val1, val2) \
21751 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
21752 #define GTEST_ASSERT_LT(val1, val2) \
21753 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
21754 #define GTEST_ASSERT_GE(val1, val2) \
21755 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
21756 #define GTEST_ASSERT_GT(val1, val2) \
21757 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
21759 // Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
21760 // ASSERT_XY(), which clashes with some users' own code.
21762 #if !GTEST_DONT_DEFINE_ASSERT_EQ
21763 # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
21766 #if !GTEST_DONT_DEFINE_ASSERT_NE
21767 # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
21770 #if !GTEST_DONT_DEFINE_ASSERT_LE
21771 # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
21774 #if !GTEST_DONT_DEFINE_ASSERT_LT
21775 # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
21778 #if !GTEST_DONT_DEFINE_ASSERT_GE
21779 # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
21782 #if !GTEST_DONT_DEFINE_ASSERT_GT
21783 # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
21786 // C-string Comparisons. All tests treat NULL and any non-NULL string
21787 // as different. Two NULLs are equal.
21789 // * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
21790 // * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
21791 // * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
21792 // * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
21794 // For wide or narrow string objects, you can use the
21795 // {ASSERT|EXPECT}_??() macros.
21797 // Don't depend on the order in which the arguments are evaluated,
21798 // which is undefined.
21800 // These macros evaluate their arguments exactly once.
21802 #define EXPECT_STREQ(s1, s2) \
21803 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
21804 #define EXPECT_STRNE(s1, s2) \
21805 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
21806 #define EXPECT_STRCASEEQ(s1, s2) \
21807 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
21808 #define EXPECT_STRCASENE(s1, s2)\
21809 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
21811 #define ASSERT_STREQ(s1, s2) \
21812 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
21813 #define ASSERT_STRNE(s1, s2) \
21814 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
21815 #define ASSERT_STRCASEEQ(s1, s2) \
21816 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
21817 #define ASSERT_STRCASENE(s1, s2)\
21818 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
21820 // Macros for comparing floating-point numbers.
21822 // * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):
21823 // Tests that two float values are almost equal.
21824 // * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):
21825 // Tests that two double values are almost equal.
21826 // * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
21827 // Tests that v1 and v2 are within the given distance to each other.
21829 // Google Test uses ULP-based comparison to automatically pick a default
21830 // error bound that is appropriate for the operands. See the
21831 // FloatingPoint template class in gtest-internal.h if you are
21832 // interested in the implementation details.
21834 #define EXPECT_FLOAT_EQ(val1, val2)\
21835 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
21838 #define EXPECT_DOUBLE_EQ(val1, val2)\
21839 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
21842 #define ASSERT_FLOAT_EQ(val1, val2)\
21843 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
21846 #define ASSERT_DOUBLE_EQ(val1, val2)\
21847 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
21850 #define EXPECT_NEAR(val1, val2, abs_error)\
21851 EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
21852 val1, val2, abs_error)
21854 #define ASSERT_NEAR(val1, val2, abs_error)\
21855 ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
21856 val1, val2, abs_error)
21858 // These predicate format functions work on floating-point values, and
21859 // can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
21861 // EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
21863 // Asserts that val1 is less than, or almost equal to, val2. Fails
21864 // otherwise. In particular, it fails if either val1 or val2 is NaN.
21865 GTEST_API_ AssertionResult
FloatLE(const char* expr1
, const char* expr2
,
21866 float val1
, float val2
);
21867 GTEST_API_ AssertionResult
DoubleLE(const char* expr1
, const char* expr2
,
21868 double val1
, double val2
);
21871 #if GTEST_OS_WINDOWS
21873 // Macros that test for HRESULT failure and success, these are only useful
21874 // on Windows, and rely on Windows SDK macros and APIs to compile.
21876 // * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
21878 // When expr unexpectedly fails or succeeds, Google Test prints the
21879 // expected result and the actual result with both a human-readable
21880 // string representation of the error, if available, as well as the
21881 // hex result code.
21882 # define EXPECT_HRESULT_SUCCEEDED(expr) \
21883 EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
21885 # define ASSERT_HRESULT_SUCCEEDED(expr) \
21886 ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
21888 # define EXPECT_HRESULT_FAILED(expr) \
21889 EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
21891 # define ASSERT_HRESULT_FAILED(expr) \
21892 ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
21894 #endif // GTEST_OS_WINDOWS
21896 // Macros that execute statement and check that it doesn't generate new fatal
21897 // failures in the current thread.
21899 // * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
21903 // EXPECT_NO_FATAL_FAILURE(Process());
21904 // ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
21906 #define ASSERT_NO_FATAL_FAILURE(statement) \
21907 GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
21908 #define EXPECT_NO_FATAL_FAILURE(statement) \
21909 GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
21911 // Causes a trace (including the given source file path and line number,
21912 // and the given message) to be included in every test failure message generated
21913 // by code in the scope of the lifetime of an instance of this class. The effect
21914 // is undone with the destruction of the instance.
21916 // The message argument can be anything streamable to std::ostream.
21919 // testing::ScopedTrace trace("file.cc", 123, "message");
21921 class GTEST_API_ ScopedTrace
{
21923 // The c'tor pushes the given source file location and message onto
21924 // a trace stack maintained by Google Test.
21926 // Template version. Uses Message() to convert the values into strings.
21927 // Slow, but flexible.
21928 template <typename T
>
21929 ScopedTrace(const char* file
, int line
, const T
& message
) {
21930 PushTrace(file
, line
, (Message() << message
).GetString());
21933 // Optimize for some known types.
21934 ScopedTrace(const char* file
, int line
, const char* message
) {
21935 PushTrace(file
, line
, message
? message
: "(null)");
21938 #if GTEST_HAS_GLOBAL_STRING
21939 ScopedTrace(const char* file
, int line
, const ::string
& message
) {
21940 PushTrace(file
, line
, message
);
21944 ScopedTrace(const char* file
, int line
, const std::string
& message
) {
21945 PushTrace(file
, line
, message
);
21948 // The d'tor pops the info pushed by the c'tor.
21950 // Note that the d'tor is not virtual in order to be efficient.
21951 // Don't inherit from ScopedTrace!
21955 void PushTrace(const char* file
, int line
, std::string message
);
21957 GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace
);
21958 } GTEST_ATTRIBUTE_UNUSED_
; // A ScopedTrace object does its job in its
21959 // c'tor and d'tor. Therefore it doesn't
21960 // need to be used otherwise.
21962 // Causes a trace (including the source file path, the current line
21963 // number, and the given message) to be included in every test failure
21964 // message generated by code in the current scope. The effect is
21965 // undone when the control leaves the current scope.
21967 // The message argument can be anything streamable to std::ostream.
21969 // In the implementation, we include the current line number as part
21970 // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
21971 // to appear in the same block - as long as they are on different
21974 // Assuming that each thread maintains its own stack of traces.
21975 // Therefore, a SCOPED_TRACE() would (correctly) only affect the
21976 // assertions in its own thread.
21977 #define SCOPED_TRACE(message) \
21978 ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
21979 __FILE__, __LINE__, (message))
21982 // Compile-time assertion for type equality.
21983 // StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
21984 // the same type. The value it returns is not interesting.
21986 // Instead of making StaticAssertTypeEq a class template, we make it a
21987 // function template that invokes a helper class template. This
21988 // prevents a user from misusing StaticAssertTypeEq<T1, T2> by
21989 // defining objects of that type.
21993 // When used inside a method of a class template,
21994 // StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
21995 // instantiated. For example, given:
21997 // template <typename T> class Foo {
21999 // void Bar() { testing::StaticAssertTypeEq<int, T>(); }
22004 // void Test1() { Foo<bool> foo; }
22006 // will NOT generate a compiler error, as Foo<bool>::Bar() is never
22007 // actually instantiated. Instead, you need:
22009 // void Test2() { Foo<bool> foo; foo.Bar(); }
22011 // to cause a compiler error.
22012 template <typename T1
, typename T2
>
22013 bool StaticAssertTypeEq() {
22014 (void)internal::StaticAssertTypeEqHelper
<T1
, T2
>();
22020 // The first parameter is the name of the test case, and the second
22021 // parameter is the name of the test within the test case.
22023 // The convention is to end the test case name with "Test". For
22024 // example, a test case for the Foo class can be named FooTest.
22026 // Test code should appear between braces after an invocation of
22027 // this macro. Example:
22029 // TEST(FooTest, InitializesCorrectly) {
22031 // EXPECT_TRUE(foo.StatusIsOK());
22034 // Note that we call GetTestTypeId() instead of GetTypeId<
22035 // ::testing::Test>() here to get the type ID of testing::Test. This
22036 // is to work around a suspected linker bug when using Google Test as
22037 // a framework on Mac OS X. The bug causes GetTypeId<
22038 // ::testing::Test>() to return different values depending on whether
22039 // the call is from the Google Test framework itself or from user test
22040 // code. GetTestTypeId() is guaranteed to always return the same
22041 // value, as it always calls GetTypeId<>() from the Google Test
22043 #define GTEST_TEST(test_case_name, test_name)\
22044 GTEST_TEST_(test_case_name, test_name, \
22045 ::testing::Test, ::testing::internal::GetTestTypeId())
22047 // Define this macro to 1 to omit the definition of TEST(), which
22048 // is a generic name and clashes with some other libraries.
22049 #if !GTEST_DONT_DEFINE_TEST
22050 # define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
22053 // Defines a test that uses a test fixture.
22055 // The first parameter is the name of the test fixture class, which
22056 // also doubles as the test case name. The second parameter is the
22057 // name of the test within the test case.
22059 // A test fixture class must be declared earlier. The user should put
22060 // the test code between braces after using this macro. Example:
22062 // class FooTest : public testing::Test {
22064 // virtual void SetUp() { b_.AddElement(3); }
22070 // TEST_F(FooTest, InitializesCorrectly) {
22071 // EXPECT_TRUE(a_.StatusIsOK());
22074 // TEST_F(FooTest, ReturnsElementCountCorrectly) {
22075 // EXPECT_EQ(a_.size(), 0);
22076 // EXPECT_EQ(b_.size(), 1);
22079 #define TEST_F(test_fixture, test_name)\
22080 GTEST_TEST_(test_fixture, test_name, test_fixture, \
22081 ::testing::internal::GetTypeId<test_fixture>())
22083 // Returns a path to temporary directory.
22084 // Tries to determine an appropriate directory for the platform.
22085 GTEST_API_
std::string
TempDir();
22088 # pragma warning(pop)
22091 } // namespace testing
22093 // Use this function in main() to run all tests. It returns 0 if all
22094 // tests are successful, or 1 otherwise.
22096 // RUN_ALL_TESTS() should be invoked after the command line has been
22097 // parsed by InitGoogleTest().
22099 // This function was formerly a macro; thus, it is in the global
22100 // namespace and has an all-caps name.
22101 int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
;
22103 inline int RUN_ALL_TESTS() {
22104 return ::testing::UnitTest::GetInstance()->Run();
22107 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
22109 #endif // GTEST_INCLUDE_GTEST_GTEST_H_