Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
25905b9f
Commit
25905b9f
authored
Jan 02, 2019
by
Gennadiy Civil
Browse files
Merge branch 'master' of
https://github.com/google/googletest
parents
4665eee1
3bedb5a9
Changes
143
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
506 additions
and
2010 deletions
+506
-2010
googletest/include/gtest/internal/gtest-port-arch.h
googletest/include/gtest/internal/gtest-port-arch.h
+2
-0
googletest/include/gtest/internal/gtest-port.h
googletest/include/gtest/internal/gtest-port.h
+51
-395
googletest/include/gtest/internal/gtest-tuple.h
googletest/include/gtest/internal/gtest-tuple.h
+0
-1021
googletest/include/gtest/internal/gtest-tuple.h.pump
googletest/include/gtest/internal/gtest-tuple.h.pump
+0
-348
googletest/include/gtest/internal/gtest-type-util.h.pump
googletest/include/gtest/internal/gtest-type-util.h.pump
+1
-1
googletest/make/Makefile
googletest/make/Makefile
+1
-1
googletest/samples/prime_tables.h
googletest/samples/prime_tables.h
+5
-5
googletest/samples/sample10_unittest.cc
googletest/samples/sample10_unittest.cc
+2
-2
googletest/samples/sample3_unittest.cc
googletest/samples/sample3_unittest.cc
+1
-1
googletest/samples/sample5_unittest.cc
googletest/samples/sample5_unittest.cc
+3
-3
googletest/samples/sample6_unittest.cc
googletest/samples/sample6_unittest.cc
+1
-1
googletest/samples/sample7_unittest.cc
googletest/samples/sample7_unittest.cc
+3
-3
googletest/samples/sample8_unittest.cc
googletest/samples/sample8_unittest.cc
+9
-28
googletest/samples/sample9_unittest.cc
googletest/samples/sample9_unittest.cc
+5
-5
googletest/src/gtest-all.cc
googletest/src/gtest-all.cc
+1
-0
googletest/src/gtest-death-test.cc
googletest/src/gtest-death-test.cc
+199
-132
googletest/src/gtest-filepath.cc
googletest/src/gtest-filepath.cc
+5
-5
googletest/src/gtest-internal-inl.h
googletest/src/gtest-internal-inl.h
+22
-19
googletest/src/gtest-matchers.cc
googletest/src/gtest-matchers.cc
+152
-0
googletest/src/gtest-port.cc
googletest/src/gtest-port.cc
+43
-40
No files found.
googletest/include/gtest/internal/gtest-port-arch.h
View file @
25905b9f
...
...
@@ -66,6 +66,8 @@
# else
# define GTEST_OS_WINDOWS_DESKTOP 1
# endif // _WIN32_WCE
#elif defined __OS2__
# define GTEST_OS_OS2 1
#elif defined __APPLE__
# define GTEST_OS_MAC 1
# if TARGET_OS_IPHONE
...
...
googletest/include/gtest/internal/gtest-port.h
View file @
25905b9f
...
...
@@ -85,8 +85,6 @@
// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
// std::wstring does/doesn't work (Google Test can
// be used where std::wstring is unavailable).
// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
// is/isn't available.
// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
// compiler supports Microsoft's "Structured
// Exception Handling".
...
...
@@ -94,12 +92,6 @@
// - Define it to 1/0 to indicate whether the
// platform supports I/O stream redirection using
// dup() and dup2().
// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
// Test's own tr1 tuple implementation should be
// used. Unused when the user sets
// GTEST_HAS_TR1_TUPLE to 0.
// GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test
// is building in C++11/C++98 mode.
// GTEST_LINKED_AS_SHARED_LIBRARY
// - Define to 1 when compiling tests that use
// Google Test as a shared library (known as
...
...
@@ -135,6 +127,7 @@
// GTEST_OS_NACL - Google Native Client (NaCl)
// GTEST_OS_NETBSD - NetBSD
// GTEST_OS_OPENBSD - OpenBSD
// GTEST_OS_OS2 - OS/2
// GTEST_OS_QNX - QNX
// GTEST_OS_SOLARIS - Sun Solaris
// GTEST_OS_SYMBIAN - Symbian
...
...
@@ -172,8 +165,6 @@
// EXPECT_DEATH(DoSomethingDeadly());
// #endif
//
// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
// tests)
// GTEST_HAS_DEATH_TEST - death tests
// GTEST_HAS_TYPED_TEST - typed tests
// GTEST_HAS_TYPED_TEST_P - type-parameterized tests
...
...
@@ -210,11 +201,6 @@
// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127
// is suppressed.
//
// C++11 feature wrappers:
//
// testing::internal::forward - portability wrapper for std::forward.
// testing::internal::move - portability wrapper for std::move.
//
// Synchronization:
// Mutex, MutexLock, ThreadLocal, GetThreadCount()
// - synchronization primitives.
...
...
@@ -224,8 +210,6 @@
// IteratorTraits - partial implementation of std::iterator_traits, which
// is not available in libCstd when compiled with Sun C++.
//
// Smart pointers:
// scoped_ptr - as in TR2.
//
// Regular expressions:
// RE - a simple regular expression class using the POSIX
...
...
@@ -265,9 +249,11 @@
#include <ctype.h> // for isspace, etc
#include <stddef.h> // for ptrdiff_t
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory>
#ifndef _WIN32_WCE
# include <sys/types.h>
# include <sys/stat.h>
...
...
@@ -284,6 +270,7 @@
#include <algorithm> // NOLINT
#include <iostream> // NOLINT
#include <sstream> // NOLINT
#include <tuple>
#include <utility>
#include <vector> // NOLINT
...
...
@@ -315,14 +302,14 @@
// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)
// /* code that triggers warnings C4800 and C4385 */
// GTEST_DISABLE_MSC_WARNINGS_POP_()
#if
_MSC_VER >= 1400
#if
defined(_MSC_VER)
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
__pragma(warning(push)) \
__pragma(warning(disable: warnings))
# define GTEST_DISABLE_MSC_WARNINGS_POP_() \
__pragma(warning(pop))
#else
//
Older versions of MSVC don't have __pragma.
//
Not all compilers are MSVC
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
# define GTEST_DISABLE_MSC_WARNINGS_POP_()
#endif
...
...
@@ -343,69 +330,6 @@
GTEST_DISABLE_MSC_WARNINGS_POP_()
#endif
#define GTEST_LANG_CXX11 1
// Distinct from C++11 language support, some environments don't provide
// proper C++11 library support. Notably, it's possible to build in
// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++
// with no C++11 support.
//
// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__
// 20110325, but maintenance releases in the 4.4 and 4.5 series followed
// this date, so check for those versions by their date stamps.
// https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning
#if GTEST_LANG_CXX11 && \
(!defined(__GLIBCXX__) || ( \
__GLIBCXX__ >= 20110325ul &&
/* GCC >= 4.6.0 */
\
/* Blacklist of patch releases of older branches: */
\
__GLIBCXX__ != 20110416ul &&
/* GCC 4.4.6 */
\
__GLIBCXX__ != 20120313ul &&
/* GCC 4.4.7 */
\
__GLIBCXX__ != 20110428ul &&
/* GCC 4.5.3 */
\
__GLIBCXX__ != 20120702ul))
/* GCC 4.5.4 */
# define GTEST_STDLIB_CXX11 1
#endif
// Only use C++11 library features if the library provides them.
#if GTEST_STDLIB_CXX11
# define GTEST_HAS_STD_BEGIN_AND_END_ 1
# define GTEST_HAS_STD_FORWARD_LIST_ 1
# if !defined(_MSC_VER) || (_MSC_FULL_VER >= 190023824)
// works only with VS2015U2 and better
# define GTEST_HAS_STD_FUNCTION_ 1
# endif
# define GTEST_HAS_STD_INITIALIZER_LIST_ 1
# define GTEST_HAS_STD_MOVE_ 1
# define GTEST_HAS_STD_UNIQUE_PTR_ 1
# define GTEST_HAS_STD_SHARED_PTR_ 1
# define GTEST_HAS_UNORDERED_MAP_ 1
# define GTEST_HAS_UNORDERED_SET_ 1
#endif
// C++11 specifies that <tuple> provides std::tuple.
// Some platforms still might not have it, however.
#if GTEST_LANG_CXX11
# define GTEST_HAS_STD_TUPLE_ 1
# if defined(__clang__)
// Inspired by
// https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros
# if defined(__has_include) && !__has_include(<tuple>)
# undef GTEST_HAS_STD_TUPLE_
# endif
# elif defined(_MSC_VER)
// Inspired by boost/config/stdlib/dinkumware.hpp
# if defined(_CPPLIB_VER) && _CPPLIB_VER < 520
# undef GTEST_HAS_STD_TUPLE_
# endif
# elif defined(__GLIBCXX__)
// Inspired by boost/config/stdlib/libstdcpp3.hpp,
// http://gcc.gnu.org/gcc-4.2/changes.html and
// https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
# undef GTEST_HAS_STD_TUPLE_
# endif
# endif
#endif
// Brings in definitions for functions used in the testing::internal::posix
// namespace (read, write, close, chdir, isatty, stat). We do not currently
// use them on Windows Mobile.
...
...
@@ -638,136 +562,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# include <time.h> // NOLINT
#endif
// Determines if hash_map/hash_set are available.
// Only used for testing against those containers.
#if !defined(GTEST_HAS_HASH_MAP_)
# if defined(_MSC_VER) && (_MSC_VER < 1900)
# define GTEST_HAS_HASH_MAP_ 1 // Indicates that hash_map is available.
# define GTEST_HAS_HASH_SET_ 1 // Indicates that hash_set is available.
# endif // _MSC_VER
#endif // !defined(GTEST_HAS_HASH_MAP_)
// Determines whether Google Test can use tr1/tuple. You can define
// this macro to 0 to prevent Google Test from using tuple (any
// feature depending on tuple with be disabled in this mode).
#ifndef GTEST_HAS_TR1_TUPLE
# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
# define GTEST_HAS_TR1_TUPLE 0
# elif defined(_MSC_VER) && (_MSC_VER >= 1910)
// Prevent `warning C4996: 'std::tr1': warning STL4002:
// The non-Standard std::tr1 namespace and TR1-only machinery
// are deprecated and will be REMOVED.`
# define GTEST_HAS_TR1_TUPLE 0
# elif GTEST_LANG_CXX11 && defined(_LIBCPP_VERSION)
// libc++ doesn't support TR1.
# define GTEST_HAS_TR1_TUPLE 0
# else
// The user didn't tell us not to do it, so we assume it's OK.
# define GTEST_HAS_TR1_TUPLE 1
# endif
#endif // GTEST_HAS_TR1_TUPLE
// Determines whether Google Test's own tr1 tuple implementation
// should be used.
#ifndef GTEST_USE_OWN_TR1_TUPLE
// We use our own tuple implementation on Symbian.
# if GTEST_OS_SYMBIAN
# define GTEST_USE_OWN_TR1_TUPLE 1
# else
// The user didn't tell us, so we need to figure it out.
// We use our own TR1 tuple if we aren't sure the user has an
// implementation of it already. At this time, libstdc++ 4.0.0+ and
// MSVC 2010 are the only mainstream standard libraries that come
// with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler
// pretends to be GCC by defining __GNUC__ and friends, but cannot
// compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1
// tuple in a 323 MB Feature Pack download, which we cannot assume the
// user has. QNX's QCC compiler is a modified GCC but it doesn't
// support TR1 tuple. libc++ only provides std::tuple, in C++11 mode,
// and it can be used with some compilers that define __GNUC__.
# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
&& !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) \
|| (_MSC_VER >= 1600 && _MSC_VER < 1900)
# define GTEST_ENV_HAS_TR1_TUPLE_ 1
# endif
// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
// can build with clang but need to use gcc4.2's libstdc++).
# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
# define GTEST_ENV_HAS_STD_TUPLE_ 1
# endif
# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
# define GTEST_USE_OWN_TR1_TUPLE 0
# else
# define GTEST_USE_OWN_TR1_TUPLE 1
# endif
# endif // GTEST_OS_SYMBIAN
#endif // GTEST_USE_OWN_TR1_TUPLE
// To avoid conditional compilation we make it gtest-port.h's responsibility
// to #include the header implementing tuple.
#if GTEST_HAS_STD_TUPLE_
# include <tuple> // IWYU pragma: export
# define GTEST_TUPLE_NAMESPACE_ ::std
#endif // GTEST_HAS_STD_TUPLE_
// We include tr1::tuple even if std::tuple is available to define printers for
// them.
#if GTEST_HAS_TR1_TUPLE
# ifndef GTEST_TUPLE_NAMESPACE_
# define GTEST_TUPLE_NAMESPACE_ ::std::tr1
# endif // GTEST_TUPLE_NAMESPACE_
# if GTEST_USE_OWN_TR1_TUPLE
# include "gtest/internal/gtest-tuple.h" // IWYU pragma: export // NOLINT
# elif GTEST_OS_SYMBIAN
// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
// use STLport's tuple implementation, which unfortunately doesn't
// work as the copy of STLport distributed with Symbian is incomplete.
// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
// use its own tuple implementation.
# ifdef BOOST_HAS_TR1_TUPLE
# undef BOOST_HAS_TR1_TUPLE
# endif // BOOST_HAS_TR1_TUPLE
// This prevents <boost/tr1/detail/config.hpp>, which defines
// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
# include <tuple> // IWYU pragma: export // NOLINT
# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
// not conform to the TR1 spec, which requires the header to be <tuple>.
# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
// which is #included by <tr1/tuple>, to not compile when RTTI is
// disabled. _TR1_FUNCTIONAL is the header guard for
// <tr1/functional>. Hence the following #define is used to prevent
// <tr1/functional> from being included.
# define _TR1_FUNCTIONAL 1
# include <tr1/tuple>
# undef _TR1_FUNCTIONAL // Allows the user to #include
// <tr1/functional> if they choose to.
# else
# include <tr1/tuple> // NOLINT
# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
// VS 2010 now has tr1 support.
# elif _MSC_VER >= 1600
# include <tuple> // IWYU pragma: export // NOLINT
# else // GTEST_USE_OWN_TR1_TUPLE
# include <tr1/tuple> // IWYU pragma: export // NOLINT
# endif // GTEST_USE_OWN_TR1_TUPLE
#endif // GTEST_HAS_TR1_TUPLE
// Determines whether clone(2) is supported.
// Usually it will only be available on Linux, excluding
// Linux on the Itanium architecture.
...
...
@@ -810,12 +604,10 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#endif // GTEST_HAS_STREAM_REDIRECTION
// Determines whether to support death tests.
// Google Test does not support death tests for VC 7.1 and earlier as
// abort() in a VC 7.1 application compiled as GUI in debug config
// pops up a dialog window that cannot be suppressed programmatically.
#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
(GTEST_OS_MAC && !GTEST_OS_IOS) || \
(GTEST_OS_WINDOWS_DESKTOP && _MSC_VER
>= 1400) ||
\
(GTEST_OS_WINDOWS_DESKTOP && _MSC_VER
) ||
\
GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \
GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)
...
...
@@ -826,23 +618,16 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
// Sun Pro CC, IBM Visual Age, and HP aCC support.
#if defined(__GNUC__) || (_MSC_VER
>= 1400
) || defined(__SUNPRO_CC) || \
#if defined(__GNUC__) ||
defined
(_MSC_VER) || defined(__SUNPRO_CC) || \
defined(__IBMCPP__) || defined(__HP_aCC)
# define GTEST_HAS_TYPED_TEST 1
# define GTEST_HAS_TYPED_TEST_P 1
#endif
// Determines whether to support Combine(). This only makes sense when
// value-parameterized tests are enabled. The implementation doesn't
// work on Sun Studio since it doesn't understand templated conversion
// operators.
#if (GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_) && !defined(__SUNPRO_CC)
# define GTEST_HAS_COMBINE 1
#endif
// Determines whether the system compiler uses UTF-16 for encoding wide strings.
#define GTEST_WIDE_STRING_USES_UTF16_ \
(GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
(GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || \
GTEST_OS_AIX || GTEST_OS_OS2)
// Determines whether test results can be streamed to a socket.
#if GTEST_OS_LINUX
...
...
@@ -887,12 +672,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# define GTEST_ATTRIBUTE_UNUSED_
#endif
#if GTEST_LANG_CXX11
# define GTEST_CXX11_EQUALS_DELETE_ = delete
#else // GTEST_LANG_CXX11
# define GTEST_CXX11_EQUALS_DELETE_
#endif // GTEST_LANG_CXX11
// Use this annotation before a function that takes a printf format string.
#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)
# if defined(__MINGW_PRINTF_FORMAT)
...
...
@@ -914,12 +693,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// A macro to disallow operator=
// This should be used in the private: declarations for a class.
#define GTEST_DISALLOW_ASSIGN_(type) \
void operator=(type const &)
GTEST_CXX11_EQUALS_DELETE_
void operator=(type const &)
= delete
// A macro to disallow copy constructor and operator=
// This should be used in the private: declarations for a class.
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
type(type const &)
GTEST_CXX11_EQUALS_DELETE_
; \
type(type const &)
= delete
; \
GTEST_DISALLOW_ASSIGN_(type)
// Tell the compiler to warn about unused return values for functions declared
...
...
@@ -960,12 +739,16 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# define GTEST_HAS_SEH 0
# endif
#endif // GTEST_HAS_SEH
#ifndef GTEST_IS_THREADSAFE
#define GTEST_IS_THREADSAFE \
(GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \
||
(GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \
||
GTEST_HAS_PTHREAD)
(GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
||
\
(GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT)
||
\
GTEST_HAS_PTHREAD)
#endif // GTEST_
HAS_SEH
#endif // GTEST_
IS_THREADSAFE
// GTEST_API_ qualifies all symbols that must be exported. The definitions below
// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in
...
...
@@ -1049,16 +832,13 @@ namespace testing {
class
Message
;
#if defined(GTEST_TUPLE_NAMESPACE_)
// Import tuple and friends into the ::testing namespace.
// It is part of our interface, having them in ::testing allows us to change
// their types as needed.
using
GTEST_TUPLE_NAMESPACE_
::
get
;
using
GTEST_TUPLE_NAMESPACE_
::
make_tuple
;
using
GTEST_TUPLE_NAMESPACE_
::
tuple
;
using
GTEST_TUPLE_NAMESPACE_
::
tuple_size
;
using
GTEST_TUPLE_NAMESPACE_
::
tuple_element
;
#endif // defined(GTEST_TUPLE_NAMESPACE_)
// Legacy imports for backwards compatibility.
// New code should use std:: names directly.
using
std
::
get
;
using
std
::
make_tuple
;
using
std
::
tuple
;
using
std
::
tuple_element
;
using
std
::
tuple_size
;
namespace
internal
{
...
...
@@ -1067,75 +847,16 @@ namespace internal {
// Secret object, which is what we want.
class
Secret
;
// The GTEST_COMPILE_ASSERT_
macro can be
used to verify that a compile
time
// expression is true
. For example, you could use it to verify the
// size of a static array:
// The GTEST_COMPILE_ASSERT_
is a legacy macro
used to verify that a compile
//
time
expression is true
(in new code, use static_assert instead). For
//
example, you could use it to verify the
size of a static array:
//
// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,
// names_incorrect_size);
//
// or to make sure a struct is smaller than a certain size:
//
// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
//
// The second argument to the macro is the name of the variable. If
// the expression is false, most compilers will issue a warning/error
// containing the name of the variable.
#if GTEST_LANG_CXX11
# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
#else // !GTEST_LANG_CXX11
template
<
bool
>
struct
CompileAssert
{
};
# define GTEST_COMPILE_ASSERT_(expr, msg) \
typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
#endif // !GTEST_LANG_CXX11
// Implementation details of GTEST_COMPILE_ASSERT_:
//
// (In C++11, we simply use static_assert instead of the following)
//
// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
// elements (and thus is invalid) when the expression is false.
//
// - The simpler definition
//
// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
//
// does not work, as gcc supports variable-length arrays whose sizes
// are determined at run-time (this is gcc's extension and not part
// of the C++ standard). As a result, gcc fails to reject the
// following code with the simple definition:
//
// int foo;
// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
// // not a compile-time constant.
//
// - By using the type CompileAssert<(bool(expr))>, we ensures that
// expr is a compile-time constant. (Template arguments must be
// determined at compile-time.)
//
// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
//
// CompileAssert<bool(expr)>
//
// instead, these compilers will refuse to compile
//
// GTEST_COMPILE_ASSERT_(5 > 0, some_message);
//
// (They seem to think the ">" in "5 > 0" marks the end of the
// template argument list.)
//
// - The array size is (bool(expr) ? 1 : -1), instead of simply
//
// ((expr) ? 1 : -1).
//
// This is to avoid running into a bug in MS VC 7.1, which
// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
// The second argument to the macro must be a valid C++ identifier. If the
// expression is false, compiler will issue an error containing this identifier.
#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
//
...
...
@@ -1177,48 +898,6 @@ typedef ::std::wstring wstring;
// returns 'condition'.
GTEST_API_
bool
IsTrue
(
bool
condition
);
// Defines scoped_ptr.
// This implementation of scoped_ptr is PARTIAL - it only contains
// enough stuff to satisfy Google Test's need.
template
<
typename
T
>
class
scoped_ptr
{
public:
typedef
T
element_type
;
explicit
scoped_ptr
(
T
*
p
=
nullptr
)
:
ptr_
(
p
)
{}
~
scoped_ptr
()
{
reset
();
}
T
&
operator
*
()
const
{
return
*
ptr_
;
}
T
*
operator
->
()
const
{
return
ptr_
;
}
T
*
get
()
const
{
return
ptr_
;
}
T
*
release
()
{
T
*
const
ptr
=
ptr_
;
ptr_
=
nullptr
;
return
ptr
;
}
void
reset
(
T
*
p
=
nullptr
)
{
if
(
p
!=
ptr_
)
{
if
(
IsTrue
(
sizeof
(
T
)
>
0
))
{
// Makes sure T is a complete type.
delete
ptr_
;
}
ptr_
=
p
;
}
}
friend
void
swap
(
scoped_ptr
&
a
,
scoped_ptr
&
b
)
{
using
std
::
swap
;
swap
(
a
.
ptr_
,
b
.
ptr_
);
}
private:
T
*
ptr_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
scoped_ptr
);
};
// Defines RE.
#if GTEST_USES_PCRE
...
...
@@ -1419,28 +1098,6 @@ struct ConstRef<T&> { typedef T& type; };
#define GTEST_REFERENCE_TO_CONST_(T) \
typename ::testing::internal::ConstRef<T>::type
#if GTEST_HAS_STD_MOVE_
using
std
::
forward
;
using
std
::
move
;
template
<
typename
T
>
struct
RvalueRef
{
typedef
T
&&
type
;
};
#else // GTEST_HAS_STD_MOVE_
template
<
typename
T
>
const
T
&
move
(
const
T
&
t
)
{
return
t
;
}
template
<
typename
T
>
GTEST_ADD_REFERENCE_
(
T
)
forward
(
GTEST_ADD_REFERENCE_
(
T
)
t
)
{
return
t
;
}
template
<
typename
T
>
struct
RvalueRef
{
typedef
const
T
&
type
;
};
#endif // GTEST_HAS_STD_MOVE_
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Use ImplicitCast_ as a safe version of static_cast for upcasting in
...
...
@@ -1494,13 +1151,13 @@ inline To DownCast_(From* f) { // so we only accept pointers
GTEST_INTENTIONAL_CONST_COND_PUSH_
()
if
(
false
)
{
GTEST_INTENTIONAL_CONST_COND_POP_
()
const
To
to
=
NULL
;
const
To
to
=
nullptr
;
::
testing
::
internal
::
ImplicitCast_
<
From
*>
(
to
);
}
#if GTEST_HAS_RTTI
// RTTI: debug mode only!
GTEST_CHECK_
(
f
==
nullptr
||
dynamic_cast
<
To
>
(
f
)
!=
NULL
);
GTEST_CHECK_
(
f
==
nullptr
||
dynamic_cast
<
To
>
(
f
)
!=
nullptr
);
#endif
return
static_cast
<
To
>
(
f
);
}
...
...
@@ -1730,7 +1387,7 @@ class ThreadWithParam : public ThreadWithParamBase {
GTEST_CHECK_POSIX_SUCCESS_
(
pthread_create
(
&
thread_
,
nullptr
,
&
ThreadFuncWithCLinkage
,
base
));
}
~
ThreadWithParam
()
{
Join
();
}
~
ThreadWithParam
()
override
{
Join
();
}
void
Join
()
{
if
(
!
finished_
)
{
...
...
@@ -1739,7 +1396,7 @@ class ThreadWithParam : public ThreadWithParamBase {
}
}
virtual
void
Run
()
{
void
Run
()
override
{
if
(
thread_can_start_
!=
nullptr
)
thread_can_start_
->
WaitForNotification
();
func_
(
param_
);
}
...
...
@@ -2034,7 +1691,7 @@ class ThreadLocal : public ThreadLocalBase {
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
InstanceValueHolderFactory
);
};
s
coped
_ptr
<
ValueHolderFactory
>
default_factory_
;
s
td
::
unique
_ptr
<
ValueHolderFactory
>
default_factory_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ThreadLocal
);
};
...
...
@@ -2245,7 +1902,7 @@ class GTEST_API_ ThreadLocal {
// A key pthreads uses for looking up per-thread values.
const
pthread_key_t
key_
;
s
coped
_ptr
<
ValueHolderFactory
>
default_factory_
;
s
td
::
unique
_ptr
<
ValueHolderFactory
>
default_factory_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ThreadLocal
);
};
...
...
@@ -2523,12 +2180,12 @@ inline const char* GetEnv(const char* name) {
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
// We are on Windows CE, which has no environment variables.
static_cast
<
void
>
(
name
);
// To prevent 'unused argument' warning.
return
NULL
;
return
nullptr
;
#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
// Environment variables which we programmatically clear will be set to the
// empty string rather than unset (NULL). Handle that case.
const
char
*
const
env
=
getenv
(
name
);
return
(
env
!=
NULL
&&
env
[
0
]
!=
'\0'
)
?
env
:
NULL
;
return
(
env
!=
nullptr
&&
env
[
0
]
!=
'\0'
)
?
env
:
nullptr
;
#else
return
getenv
(
name
);
#endif
...
...
@@ -2540,9 +2197,9 @@ GTEST_DISABLE_MSC_DEPRECATED_POP_()
// Windows CE has no C library. The abort() function is used in
// several places in Google Test. This implementation provides a reasonable
// imitation of standard behaviour.
void
Abort
();
[[
noreturn
]]
void
Abort
();
#else
inline
void
Abort
()
{
abort
();
}
[[
noreturn
]]
inline
void
Abort
()
{
abort
();
}
#endif // GTEST_OS_WINDOWS_MOBILE
}
// namespace posix
...
...
@@ -2552,13 +2209,12 @@ inline void Abort() { abort(); }
// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
// function in order to achieve that. We use macro definition here because
// snprintf is a variadic function.
#if _MSC_VER
>= 1400
&& !GTEST_OS_WINDOWS_MOBILE
#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE
// MSVC 2005 and above support variadic macros.
# define GTEST_SNPRINTF_(buffer, size, format, ...) \
_snprintf_s(buffer, size, size, format, __VA_ARGS__)
#elif defined(_MSC_VER)
// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
// complain about _snprintf.
// Windows CE does not define _snprintf_s
# define GTEST_SNPRINTF_ _snprintf
#else
# define GTEST_SNPRINTF_ snprintf
...
...
googletest/include/gtest/internal/gtest-tuple.h
deleted
100644 → 0
View file @
4665eee1
// This file was GENERATED by command:
// pump.py gtest-tuple.h.pump
// DO NOT EDIT BY HAND!!!
// Copyright 2009 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
// GOOGLETEST_CM0001 DO NOT DELETE
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#include <utility> // For ::std::pair.
// The compiler used in Symbian has a bug that prevents us from declaring the
// tuple template as a friend (it complains that tuple is redefined). This
// bypasses the bug by declaring the members that should otherwise be
// private as public.
// Sun Studio versions < 12 also have the above bug.
#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
#else
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
private:
#endif
// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict
// with our own definitions. Therefore using our own tuple does not work on
// those compilers.
#if defined(_MSC_VER) && _MSC_VER >= 1600
/* 1600 is Visual Studio 2010 */
# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \
GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."
#endif
// GTEST_n_TUPLE_(T) is the type of an n-tuple.
#define GTEST_0_TUPLE_(T) tuple<>
#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
void, void, void>
#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
void, void, void>
#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
void, void, void>
#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
void, void, void>
#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
void, void, void>
#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
void, void, void>
#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
void, void, void>
#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
T##7, void, void>
#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
T##7, T##8, void>
#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
T##7, T##8, T##9>
// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
#define GTEST_0_TYPENAMES_(T)
#define GTEST_1_TYPENAMES_(T) typename T##0
#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3
#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4
#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5
#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6
#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6, \
typename T##7, typename T##8
#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6, \
typename T##7, typename T##8, typename T##9
// In theory, defining stuff in the ::std namespace is undefined
// behavior. We can do this as we are playing the role of a standard
// library vendor.
namespace
std
{
namespace
tr1
{
template
<
typename
T0
=
void
,
typename
T1
=
void
,
typename
T2
=
void
,
typename
T3
=
void
,
typename
T4
=
void
,
typename
T5
=
void
,
typename
T6
=
void
,
typename
T7
=
void
,
typename
T8
=
void
,
typename
T9
=
void
>
class
tuple
;
// Anything in namespace gtest_internal is Google Test's INTERNAL
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
namespace
gtest_internal
{
// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
template
<
typename
T
>
struct
ByRef
{
typedef
const
T
&
type
;
};
// NOLINT
template
<
typename
T
>
struct
ByRef
<
T
&>
{
typedef
T
&
type
;
};
// NOLINT
// A handy wrapper for ByRef.
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
// is the same as tr1::add_reference<T>::type.
template
<
typename
T
>
struct
AddRef
{
typedef
T
&
type
;
};
// NOLINT
template
<
typename
T
>
struct
AddRef
<
T
&>
{
typedef
T
&
type
;
};
// NOLINT
// A handy wrapper for AddRef.
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
// A helper for implementing get<k>().
template
<
int
k
>
class
Get
;
// A helper for implementing tuple_element<k, T>. kIndexValid is true
// iff k < the number of fields in tuple type T.
template
<
bool
kIndexValid
,
int
kIndex
,
class
Tuple
>
struct
TupleElement
;
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
0
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T0
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
1
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T1
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
2
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T2
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
3
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T3
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
4
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T4
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
5
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T5
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
6
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T6
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
7
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T7
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
8
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T8
type
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
9
,
GTEST_10_TUPLE_
(
T
)
>
{
typedef
T9
type
;
};
}
// namespace gtest_internal
template
<
>
class
tuple
<>
{
public:
tuple
()
{}
tuple
(
const
tuple
&
/* t */
)
{}
tuple
&
operator
=
(
const
tuple
&
/* t */
)
{
return
*
this
;
}
};
template
<
GTEST_1_TYPENAMES_
(
T
)>
class
GTEST_1_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
)
:
f0_
(
f0
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
)
{}
template
<
GTEST_1_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_1_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_1_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_1_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_1_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_1_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
return
*
this
;
}
T0
f0_
;
};
template
<
GTEST_2_TYPENAMES_
(
T
)>
class
GTEST_2_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
)
:
f0_
(
f0
),
f1_
(
f1
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
)
{}
template
<
GTEST_2_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_2_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
)
{}
template
<
typename
U0
,
typename
U1
>
tuple
(
const
::
std
::
pair
<
U0
,
U1
>&
p
)
:
f0_
(
p
.
first
),
f1_
(
p
.
second
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_2_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_2_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
typename
U0
,
typename
U1
>
tuple
&
operator
=
(
const
::
std
::
pair
<
U0
,
U1
>&
p
)
{
f0_
=
p
.
first
;
f1_
=
p
.
second
;
return
*
this
;
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_2_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_2_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
};
template
<
GTEST_3_TYPENAMES_
(
T
)>
class
GTEST_3_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
)
{}
template
<
GTEST_3_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_3_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_3_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_3_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_3_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_3_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
};
template
<
GTEST_4_TYPENAMES_
(
T
)>
class
GTEST_4_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
)
{}
template
<
GTEST_4_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_4_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_4_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_4_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_4_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_4_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
};
template
<
GTEST_5_TYPENAMES_
(
T
)>
class
GTEST_5_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
(),
f4_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
,
GTEST_BY_REF_
(
T4
)
f4
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
),
f4_
(
f4
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
)
{}
template
<
GTEST_5_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_5_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_5_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_5_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_5_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_5_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
f4_
=
t
.
f4_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
T4
f4_
;
};
template
<
GTEST_6_TYPENAMES_
(
T
)>
class
GTEST_6_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
(),
f4_
(),
f5_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
,
GTEST_BY_REF_
(
T4
)
f4
,
GTEST_BY_REF_
(
T5
)
f5
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
),
f4_
(
f4
),
f5_
(
f5
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
)
{}
template
<
GTEST_6_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_6_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_6_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_6_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_6_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_6_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
f4_
=
t
.
f4_
;
f5_
=
t
.
f5_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
T4
f4_
;
T5
f5_
;
};
template
<
GTEST_7_TYPENAMES_
(
T
)>
class
GTEST_7_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
(),
f4_
(),
f5_
(),
f6_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
,
GTEST_BY_REF_
(
T4
)
f4
,
GTEST_BY_REF_
(
T5
)
f5
,
GTEST_BY_REF_
(
T6
)
f6
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
),
f4_
(
f4
),
f5_
(
f5
),
f6_
(
f6
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
)
{}
template
<
GTEST_7_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_7_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_7_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_7_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_7_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_7_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
f4_
=
t
.
f4_
;
f5_
=
t
.
f5_
;
f6_
=
t
.
f6_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
T4
f4_
;
T5
f5_
;
T6
f6_
;
};
template
<
GTEST_8_TYPENAMES_
(
T
)>
class
GTEST_8_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
(),
f4_
(),
f5_
(),
f6_
(),
f7_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
,
GTEST_BY_REF_
(
T4
)
f4
,
GTEST_BY_REF_
(
T5
)
f5
,
GTEST_BY_REF_
(
T6
)
f6
,
GTEST_BY_REF_
(
T7
)
f7
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
),
f4_
(
f4
),
f5_
(
f5
),
f6_
(
f6
),
f7_
(
f7
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
),
f7_
(
t
.
f7_
)
{}
template
<
GTEST_8_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_8_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
),
f7_
(
t
.
f7_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_8_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_8_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_8_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_8_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
f4_
=
t
.
f4_
;
f5_
=
t
.
f5_
;
f6_
=
t
.
f6_
;
f7_
=
t
.
f7_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
T4
f4_
;
T5
f5_
;
T6
f6_
;
T7
f7_
;
};
template
<
GTEST_9_TYPENAMES_
(
T
)>
class
GTEST_9_TUPLE_
(
T
)
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
(),
f4_
(),
f5_
(),
f6_
(),
f7_
(),
f8_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
,
GTEST_BY_REF_
(
T4
)
f4
,
GTEST_BY_REF_
(
T5
)
f5
,
GTEST_BY_REF_
(
T6
)
f6
,
GTEST_BY_REF_
(
T7
)
f7
,
GTEST_BY_REF_
(
T8
)
f8
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
),
f4_
(
f4
),
f5_
(
f5
),
f6_
(
f6
),
f7_
(
f7
),
f8_
(
f8
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
),
f7_
(
t
.
f7_
),
f8_
(
t
.
f8_
)
{}
template
<
GTEST_9_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_9_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
),
f7_
(
t
.
f7_
),
f8_
(
t
.
f8_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_9_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_9_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_9_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_9_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
f4_
=
t
.
f4_
;
f5_
=
t
.
f5_
;
f6_
=
t
.
f6_
;
f7_
=
t
.
f7_
;
f8_
=
t
.
f8_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
T4
f4_
;
T5
f5_
;
T6
f6_
;
T7
f7_
;
T8
f8_
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
class
tuple
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
f0_
(),
f1_
(),
f2_
(),
f3_
(),
f4_
(),
f5_
(),
f6_
(),
f7_
(),
f8_
(),
f9_
()
{}
explicit
tuple
(
GTEST_BY_REF_
(
T0
)
f0
,
GTEST_BY_REF_
(
T1
)
f1
,
GTEST_BY_REF_
(
T2
)
f2
,
GTEST_BY_REF_
(
T3
)
f3
,
GTEST_BY_REF_
(
T4
)
f4
,
GTEST_BY_REF_
(
T5
)
f5
,
GTEST_BY_REF_
(
T6
)
f6
,
GTEST_BY_REF_
(
T7
)
f7
,
GTEST_BY_REF_
(
T8
)
f8
,
GTEST_BY_REF_
(
T9
)
f9
)
:
f0_
(
f0
),
f1_
(
f1
),
f2_
(
f2
),
f3_
(
f3
),
f4_
(
f4
),
f5_
(
f5
),
f6_
(
f6
),
f7_
(
f7
),
f8_
(
f8
),
f9_
(
f9
)
{}
tuple
(
const
tuple
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
),
f7_
(
t
.
f7_
),
f8_
(
t
.
f8_
),
f9_
(
t
.
f9_
)
{}
template
<
GTEST_10_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_10_TUPLE_
(
U
)
&
t
)
:
f0_
(
t
.
f0_
),
f1_
(
t
.
f1_
),
f2_
(
t
.
f2_
),
f3_
(
t
.
f3_
),
f4_
(
t
.
f4_
),
f5_
(
t
.
f5_
),
f6_
(
t
.
f6_
),
f7_
(
t
.
f7_
),
f8_
(
t
.
f8_
),
f9_
(
t
.
f9_
)
{}
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_10_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_10_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_10_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_10_TUPLE_
(
U
)
&
t
)
{
f0_
=
t
.
f0_
;
f1_
=
t
.
f1_
;
f2_
=
t
.
f2_
;
f3_
=
t
.
f3_
;
f4_
=
t
.
f4_
;
f5_
=
t
.
f5_
;
f6_
=
t
.
f6_
;
f7_
=
t
.
f7_
;
f8_
=
t
.
f8_
;
f9_
=
t
.
f9_
;
return
*
this
;
}
T0
f0_
;
T1
f1_
;
T2
f2_
;
T3
f3_
;
T4
f4_
;
T5
f5_
;
T6
f6_
;
T7
f7_
;
T8
f8_
;
T9
f9_
;
};
// 6.1.3.2 Tuple creation functions.
// Known limitations: we don't support passing an
// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
// implement tie().
inline
tuple
<>
make_tuple
()
{
return
tuple
<>
();
}
template
<
GTEST_1_TYPENAMES_
(
T
)>
inline
GTEST_1_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
)
{
return
GTEST_1_TUPLE_
(
T
)(
f0
);
}
template
<
GTEST_2_TYPENAMES_
(
T
)>
inline
GTEST_2_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
)
{
return
GTEST_2_TUPLE_
(
T
)(
f0
,
f1
);
}
template
<
GTEST_3_TYPENAMES_
(
T
)>
inline
GTEST_3_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
)
{
return
GTEST_3_TUPLE_
(
T
)(
f0
,
f1
,
f2
);
}
template
<
GTEST_4_TYPENAMES_
(
T
)>
inline
GTEST_4_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
)
{
return
GTEST_4_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
);
}
template
<
GTEST_5_TYPENAMES_
(
T
)>
inline
GTEST_5_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
,
const
T4
&
f4
)
{
return
GTEST_5_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
,
f4
);
}
template
<
GTEST_6_TYPENAMES_
(
T
)>
inline
GTEST_6_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
,
const
T4
&
f4
,
const
T5
&
f5
)
{
return
GTEST_6_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
,
f4
,
f5
);
}
template
<
GTEST_7_TYPENAMES_
(
T
)>
inline
GTEST_7_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
,
const
T4
&
f4
,
const
T5
&
f5
,
const
T6
&
f6
)
{
return
GTEST_7_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
,
f4
,
f5
,
f6
);
}
template
<
GTEST_8_TYPENAMES_
(
T
)>
inline
GTEST_8_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
,
const
T4
&
f4
,
const
T5
&
f5
,
const
T6
&
f6
,
const
T7
&
f7
)
{
return
GTEST_8_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
,
f4
,
f5
,
f6
,
f7
);
}
template
<
GTEST_9_TYPENAMES_
(
T
)>
inline
GTEST_9_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
,
const
T4
&
f4
,
const
T5
&
f5
,
const
T6
&
f6
,
const
T7
&
f7
,
const
T8
&
f8
)
{
return
GTEST_9_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
,
f4
,
f5
,
f6
,
f7
,
f8
);
}
template
<
GTEST_10_TYPENAMES_
(
T
)>
inline
GTEST_10_TUPLE_
(
T
)
make_tuple
(
const
T0
&
f0
,
const
T1
&
f1
,
const
T2
&
f2
,
const
T3
&
f3
,
const
T4
&
f4
,
const
T5
&
f5
,
const
T6
&
f6
,
const
T7
&
f7
,
const
T8
&
f8
,
const
T9
&
f9
)
{
return
GTEST_10_TUPLE_
(
T
)(
f0
,
f1
,
f2
,
f3
,
f4
,
f5
,
f6
,
f7
,
f8
,
f9
);
}
// 6.1.3.3 Tuple helper classes.
template
<
typename
Tuple
>
struct
tuple_size
;
template
<
GTEST_0_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_0_TUPLE_
(
T
)
>
{
static
const
int
value
=
0
;
};
template
<
GTEST_1_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_1_TUPLE_
(
T
)
>
{
static
const
int
value
=
1
;
};
template
<
GTEST_2_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_2_TUPLE_
(
T
)
>
{
static
const
int
value
=
2
;
};
template
<
GTEST_3_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_3_TUPLE_
(
T
)
>
{
static
const
int
value
=
3
;
};
template
<
GTEST_4_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_4_TUPLE_
(
T
)
>
{
static
const
int
value
=
4
;
};
template
<
GTEST_5_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_5_TUPLE_
(
T
)
>
{
static
const
int
value
=
5
;
};
template
<
GTEST_6_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_6_TUPLE_
(
T
)
>
{
static
const
int
value
=
6
;
};
template
<
GTEST_7_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_7_TUPLE_
(
T
)
>
{
static
const
int
value
=
7
;
};
template
<
GTEST_8_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_8_TUPLE_
(
T
)
>
{
static
const
int
value
=
8
;
};
template
<
GTEST_9_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_9_TUPLE_
(
T
)
>
{
static
const
int
value
=
9
;
};
template
<
GTEST_10_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_10_TUPLE_
(
T
)
>
{
static
const
int
value
=
10
;
};
template
<
int
k
,
class
Tuple
>
struct
tuple_element
{
typedef
typename
gtest_internal
::
TupleElement
<
k
<
(
tuple_size
<
Tuple
>::
value
),
k
,
Tuple
>::
type
type
;
};
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
// 6.1.3.4 Element access.
namespace
gtest_internal
{
template
<
>
class
Get
<
0
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
0
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f0_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
0
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f0_
;
}
};
template
<
>
class
Get
<
1
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
1
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f1_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
1
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f1_
;
}
};
template
<
>
class
Get
<
2
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
2
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f2_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
2
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f2_
;
}
};
template
<
>
class
Get
<
3
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
3
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f3_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
3
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f3_
;
}
};
template
<
>
class
Get
<
4
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
4
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f4_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
4
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f4_
;
}
};
template
<
>
class
Get
<
5
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
5
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f5_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
5
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f5_
;
}
};
template
<
>
class
Get
<
6
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
6
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f6_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
6
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f6_
;
}
};
template
<
>
class
Get
<
7
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
7
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f7_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
7
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f7_
;
}
};
template
<
>
class
Get
<
8
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
8
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f8_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
8
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f8_
;
}
};
template
<
>
class
Get
<
9
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
9
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f9_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
9
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f9_
;
}
};
}
// namespace gtest_internal
template
<
int
k
,
GTEST_10_TYPENAMES_
(
T
)>
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
k
,
GTEST_10_TUPLE_
(
T
)))
get
(
GTEST_10_TUPLE_
(
T
)
&
t
)
{
return
gtest_internal
::
Get
<
k
>::
Field
(
t
);
}
template
<
int
k
,
GTEST_10_TYPENAMES_
(
T
)>
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
k
,
GTEST_10_TUPLE_
(
T
)))
get
(
const
GTEST_10_TUPLE_
(
T
)
&
t
)
{
return
gtest_internal
::
Get
<
k
>::
ConstField
(
t
);
}
// 6.1.3.5 Relational operators
// We only implement == and !=, as we don't have a need for the rest yet.
namespace
gtest_internal
{
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
// first k fields of t1 equals the first k fields of t2.
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
// k1 != k2.
template
<
int
kSize1
,
int
kSize2
>
struct
SameSizeTuplePrefixComparator
;
template
<
>
struct
SameSizeTuplePrefixComparator
<
0
,
0
>
{
template
<
class
Tuple1
,
class
Tuple2
>
static
bool
Eq
(
const
Tuple1
&
/* t1 */
,
const
Tuple2
&
/* t2 */
)
{
return
true
;
}
};
template
<
int
k
>
struct
SameSizeTuplePrefixComparator
<
k
,
k
>
{
template
<
class
Tuple1
,
class
Tuple2
>
static
bool
Eq
(
const
Tuple1
&
t1
,
const
Tuple2
&
t2
)
{
return
SameSizeTuplePrefixComparator
<
k
-
1
,
k
-
1
>::
Eq
(
t1
,
t2
)
&&
::
std
::
tr1
::
get
<
k
-
1
>
(
t1
)
==
::
std
::
tr1
::
get
<
k
-
1
>
(
t2
);
}
};
}
// namespace gtest_internal
template
<
GTEST_10_TYPENAMES_
(
T
),
GTEST_10_TYPENAMES_
(
U
)>
inline
bool
operator
==
(
const
GTEST_10_TUPLE_
(
T
)
&
t
,
const
GTEST_10_TUPLE_
(
U
)
&
u
)
{
return
gtest_internal
::
SameSizeTuplePrefixComparator
<
tuple_size
<
GTEST_10_TUPLE_
(
T
)
>::
value
,
tuple_size
<
GTEST_10_TUPLE_
(
U
)
>::
value
>::
Eq
(
t
,
u
);
}
template
<
GTEST_10_TYPENAMES_
(
T
),
GTEST_10_TYPENAMES_
(
U
)>
inline
bool
operator
!=
(
const
GTEST_10_TUPLE_
(
T
)
&
t
,
const
GTEST_10_TUPLE_
(
U
)
&
u
)
{
return
!
(
t
==
u
);
}
// 6.1.4 Pairs.
// Unimplemented.
}
// namespace tr1
}
// namespace std
#undef GTEST_0_TUPLE_
#undef GTEST_1_TUPLE_
#undef GTEST_2_TUPLE_
#undef GTEST_3_TUPLE_
#undef GTEST_4_TUPLE_
#undef GTEST_5_TUPLE_
#undef GTEST_6_TUPLE_
#undef GTEST_7_TUPLE_
#undef GTEST_8_TUPLE_
#undef GTEST_9_TUPLE_
#undef GTEST_10_TUPLE_
#undef GTEST_0_TYPENAMES_
#undef GTEST_1_TYPENAMES_
#undef GTEST_2_TYPENAMES_
#undef GTEST_3_TYPENAMES_
#undef GTEST_4_TYPENAMES_
#undef GTEST_5_TYPENAMES_
#undef GTEST_6_TYPENAMES_
#undef GTEST_7_TYPENAMES_
#undef GTEST_8_TYPENAMES_
#undef GTEST_9_TYPENAMES_
#undef GTEST_10_TYPENAMES_
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
#undef GTEST_BY_REF_
#undef GTEST_ADD_REF_
#undef GTEST_TUPLE_ELEMENT_
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
googletest/include/gtest/internal/gtest-tuple.h.pump
deleted
100644 → 0
View file @
4665eee1
$$
-*-
mode
:
c
++
;
-*-
$
var
n
=
10
$$
Maximum
number
of
tuple
fields
we
want
to
support
.
$$
This
meta
comment
fixes
auto
-
indentation
in
Emacs
.
}}
// Copyright 2009 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
// GOOGLETEST_CM0001 DO NOT DELETE
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#include <utility> // For ::std::pair.
// The compiler used in Symbian has a bug that prevents us from declaring the
// tuple template as a friend (it complains that tuple is redefined). This
// bypasses the bug by declaring the members that should otherwise be
// private as public.
// Sun Studio versions < 12 also have the above bug.
#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
#else
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \
private:
#endif
// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict
// with our own definitions. Therefore using our own tuple does not work on
// those compilers.
#if defined(_MSC_VER) && _MSC_VER >= 1600
/* 1600 is Visual Studio 2010 */
# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \
GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."
#endif
$
range
i
0.
.
n
-
1
$
range
j
0.
.
n
$
range
k
1.
.
n
// GTEST_n_TUPLE_(T) is the type of an n-tuple.
#define GTEST_0_TUPLE_(T) tuple<>
$
for
k
[[
$
range
m
0.
.
k
-
1
$
range
m2
k
..
n
-
1
#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>
]]
// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
$
for
j
[[
$
range
m
0.
.
j
-
1
#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]
]]
// In theory, defining stuff in the ::std namespace is undefined
// behavior. We can do this as we are playing the role of a standard
// library vendor.
namespace
std
{
namespace
tr1
{
template
<
$
for
i
,
[[
typename
T
$
i
=
void
]]>
class
tuple
;
// Anything in namespace gtest_internal is Google Test's INTERNAL
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
namespace
gtest_internal
{
// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
template
<
typename
T
>
struct
ByRef
{
typedef
const
T
&
type
;
};
// NOLINT
template
<
typename
T
>
struct
ByRef
<
T
&>
{
typedef
T
&
type
;
};
// NOLINT
// A handy wrapper for ByRef.
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
// is the same as tr1::add_reference<T>::type.
template
<
typename
T
>
struct
AddRef
{
typedef
T
&
type
;
};
// NOLINT
template
<
typename
T
>
struct
AddRef
<
T
&>
{
typedef
T
&
type
;
};
// NOLINT
// A handy wrapper for AddRef.
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
// A helper for implementing get<k>().
template
<
int
k
>
class
Get
;
// A helper for implementing tuple_element<k, T>. kIndexValid is true
// iff k < the number of fields in tuple type T.
template
<
bool
kIndexValid
,
int
kIndex
,
class
Tuple
>
struct
TupleElement
;
$
for
i
[[
template
<
GTEST_
$
(
n
)
_TYPENAMES_
(
T
)>
struct
TupleElement
<
true
,
$
i
,
GTEST_
$
(
n
)
_TUPLE_
(
T
)
>
{
typedef
T
$
i
type
;
};
]]
}
// namespace gtest_internal
template
<
>
class
tuple
<>
{
public:
tuple
()
{}
tuple
(
const
tuple
&
/* t */
)
{}
tuple
&
operator
=
(
const
tuple
&
/* t */
)
{
return
*
this
;
}
};
$
for
k
[[
$
range
m
0.
.
k
-
1
template
<
GTEST_
$
(
k
)
_TYPENAMES_
(
T
)>
class
$
if
k
<
n
[[
GTEST_
$
(
k
)
_TUPLE_
(
T
)]]
$
else
[[
tuple
]]
{
public:
template
<
int
k
>
friend
class
gtest_internal
::
Get
;
tuple
()
:
$
for
m
,
[[
f
$
(
m
)
_
()]]
{}
explicit
tuple
(
$
for
m
,
[[
GTEST_BY_REF_
(
T
$
m
)
f
$
m
]])
:
[[]]
$
for
m
,
[[
f
$
(
m
)
_
(
f
$
m
)]]
{}
tuple
(
const
tuple
&
t
)
:
$
for
m
,
[[
f
$
(
m
)
_
(
t
.
f
$
(
m
)
_
)]]
{}
template
<
GTEST_
$
(
k
)
_TYPENAMES_
(
U
)>
tuple
(
const
GTEST_
$
(
k
)
_TUPLE_
(
U
)
&
t
)
:
$
for
m
,
[[
f
$
(
m
)
_
(
t
.
f
$
(
m
)
_
)]]
{}
$
if
k
==
2
[[
template
<
typename
U0
,
typename
U1
>
tuple
(
const
::
std
::
pair
<
U0
,
U1
>&
p
)
:
f0_
(
p
.
first
),
f1_
(
p
.
second
)
{}
]]
tuple
&
operator
=
(
const
tuple
&
t
)
{
return
CopyFrom
(
t
);
}
template
<
GTEST_
$
(
k
)
_TYPENAMES_
(
U
)>
tuple
&
operator
=
(
const
GTEST_
$
(
k
)
_TUPLE_
(
U
)
&
t
)
{
return
CopyFrom
(
t
);
}
$
if
k
==
2
[[
template
<
typename
U0
,
typename
U1
>
tuple
&
operator
=
(
const
::
std
::
pair
<
U0
,
U1
>&
p
)
{
f0_
=
p
.
first
;
f1_
=
p
.
second
;
return
*
this
;
}
]]
GTEST_DECLARE_TUPLE_AS_FRIEND_
template
<
GTEST_
$
(
k
)
_TYPENAMES_
(
U
)>
tuple
&
CopyFrom
(
const
GTEST_
$
(
k
)
_TUPLE_
(
U
)
&
t
)
{
$
for
m
[[
f
$
(
m
)
_
=
t
.
f
$
(
m
)
_
;
]]
return
*
this
;
}
$
for
m
[[
T
$
m
f
$
(
m
)
_
;
]]
};
]]
// 6.1.3.2 Tuple creation functions.
// Known limitations: we don't support passing an
// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
// implement tie().
inline
tuple
<>
make_tuple
()
{
return
tuple
<>
();
}
$
for
k
[[
$
range
m
0.
.
k
-
1
template
<
GTEST_
$
(
k
)
_TYPENAMES_
(
T
)>
inline
GTEST_
$
(
k
)
_TUPLE_
(
T
)
make_tuple
(
$
for
m
,
[[
const
T
$
m
&
f
$
m
]])
{
return
GTEST_
$
(
k
)
_TUPLE_
(
T
)(
$
for
m
,
[[
f
$
m
]]);
}
]]
// 6.1.3.3 Tuple helper classes.
template
<
typename
Tuple
>
struct
tuple_size
;
$
for
j
[[
template
<
GTEST_
$
(
j
)
_TYPENAMES_
(
T
)>
struct
tuple_size
<
GTEST_
$
(
j
)
_TUPLE_
(
T
)
>
{
static
const
int
value
=
$
j
;
};
]]
template
<
int
k
,
class
Tuple
>
struct
tuple_element
{
typedef
typename
gtest_internal
::
TupleElement
<
k
<
(
tuple_size
<
Tuple
>::
value
),
k
,
Tuple
>::
type
type
;
};
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
// 6.1.3.4 Element access.
namespace
gtest_internal
{
$
for
i
[[
template
<
>
class
Get
<
$
i
>
{
public:
template
<
class
Tuple
>
static
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
$
i
,
Tuple
))
Field
(
Tuple
&
t
)
{
return
t
.
f
$
(
i
)
_
;
}
// NOLINT
template
<
class
Tuple
>
static
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
$
i
,
Tuple
))
ConstField
(
const
Tuple
&
t
)
{
return
t
.
f
$
(
i
)
_
;
}
};
]]
}
// namespace gtest_internal
template
<
int
k
,
GTEST_
$
(
n
)
_TYPENAMES_
(
T
)>
GTEST_ADD_REF_
(
GTEST_TUPLE_ELEMENT_
(
k
,
GTEST_
$
(
n
)
_TUPLE_
(
T
)))
get
(
GTEST_
$
(
n
)
_TUPLE_
(
T
)
&
t
)
{
return
gtest_internal
::
Get
<
k
>::
Field
(
t
);
}
template
<
int
k
,
GTEST_
$
(
n
)
_TYPENAMES_
(
T
)>
GTEST_BY_REF_
(
GTEST_TUPLE_ELEMENT_
(
k
,
GTEST_
$
(
n
)
_TUPLE_
(
T
)))
get
(
const
GTEST_
$
(
n
)
_TUPLE_
(
T
)
&
t
)
{
return
gtest_internal
::
Get
<
k
>::
ConstField
(
t
);
}
// 6.1.3.5 Relational operators
// We only implement == and !=, as we don't have a need for the rest yet.
namespace
gtest_internal
{
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
// first k fields of t1 equals the first k fields of t2.
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
// k1 != k2.
template
<
int
kSize1
,
int
kSize2
>
struct
SameSizeTuplePrefixComparator
;
template
<
>
struct
SameSizeTuplePrefixComparator
<
0
,
0
>
{
template
<
class
Tuple1
,
class
Tuple2
>
static
bool
Eq
(
const
Tuple1
&
/* t1 */
,
const
Tuple2
&
/* t2 */
)
{
return
true
;
}
};
template
<
int
k
>
struct
SameSizeTuplePrefixComparator
<
k
,
k
>
{
template
<
class
Tuple1
,
class
Tuple2
>
static
bool
Eq
(
const
Tuple1
&
t1
,
const
Tuple2
&
t2
)
{
return
SameSizeTuplePrefixComparator
<
k
-
1
,
k
-
1
>::
Eq
(
t1
,
t2
)
&&
::
std
::
tr1
::
get
<
k
-
1
>
(
t1
)
==
::
std
::
tr1
::
get
<
k
-
1
>
(
t2
);
}
};
}
// namespace gtest_internal
template
<
GTEST_
$
(
n
)
_TYPENAMES_
(
T
),
GTEST_
$
(
n
)
_TYPENAMES_
(
U
)>
inline
bool
operator
==
(
const
GTEST_
$
(
n
)
_TUPLE_
(
T
)
&
t
,
const
GTEST_
$
(
n
)
_TUPLE_
(
U
)
&
u
)
{
return
gtest_internal
::
SameSizeTuplePrefixComparator
<
tuple_size
<
GTEST_
$
(
n
)
_TUPLE_
(
T
)
>::
value
,
tuple_size
<
GTEST_
$
(
n
)
_TUPLE_
(
U
)
>::
value
>::
Eq
(
t
,
u
);
}
template
<
GTEST_
$
(
n
)
_TYPENAMES_
(
T
),
GTEST_
$
(
n
)
_TYPENAMES_
(
U
)>
inline
bool
operator
!=
(
const
GTEST_
$
(
n
)
_TUPLE_
(
T
)
&
t
,
const
GTEST_
$
(
n
)
_TUPLE_
(
U
)
&
u
)
{
return
!
(
t
==
u
);
}
// 6.1.4 Pairs.
// Unimplemented.
}
// namespace tr1
}
// namespace std
$
for
j
[[
#undef GTEST_$(j)_TUPLE_
]]
$
for
j
[[
#undef GTEST_$(j)_TYPENAMES_
]]
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
#undef GTEST_BY_REF_
#undef GTEST_ADD_REF_
#undef GTEST_TUPLE_ELEMENT_
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
googletest/include/gtest/internal/gtest-type-util.h.pump
View file @
25905b9f
...
...
@@ -87,7 +87,7 @@ std::string GetTypeName() {
# if GTEST_HAS_CXXABI_H_
using
abi
::
__cxa_demangle
;
# endif // GTEST_HAS_CXXABI_H_
char
*
const
readable_name
=
__cxa_demangle
(
name
,
0
,
0
,
&
status
);
char
*
const
readable_name
=
__cxa_demangle
(
name
,
nullptr
,
nullptr
,
&
status
);
const
std
::
string
name_str
(
status
==
0
?
readable_name
:
name
);
free
(
readable_name
);
return
CanonicalizeForStdLibVersioning
(
name_str
);
...
...
googletest/make/Makefile
View file @
25905b9f
...
...
@@ -25,7 +25,7 @@ USER_DIR = ../samples
CPPFLAGS
+=
-isystem
$(GTEST_DIR)
/include
# Flags passed to the C++ compiler.
CXXFLAGS
+=
-g
-Wall
-Wextra
-pthread
CXXFLAGS
+=
-g
-Wall
-Wextra
-pthread
-std
=
c++11
# All tests produced by this Makefile. Remember to add new tests you
# created to the list.
...
...
googletest/samples/prime_tables.h
View file @
25905b9f
...
...
@@ -54,7 +54,7 @@ class PrimeTable {
// Implementation #1 calculates the primes on-the-fly.
class
OnTheFlyPrimeTable
:
public
PrimeTable
{
public:
virtual
bool
IsPrime
(
int
n
)
const
{
bool
IsPrime
(
int
n
)
const
override
{
if
(
n
<=
1
)
return
false
;
for
(
int
i
=
2
;
i
*
i
<=
n
;
i
++
)
{
...
...
@@ -65,7 +65,7 @@ class OnTheFlyPrimeTable : public PrimeTable {
return
true
;
}
virtual
int
GetNextPrime
(
int
p
)
const
{
int
GetNextPrime
(
int
p
)
const
override
{
for
(
int
n
=
p
+
1
;
n
>
0
;
n
++
)
{
if
(
IsPrime
(
n
))
return
n
;
}
...
...
@@ -83,13 +83,13 @@ class PreCalculatedPrimeTable : public PrimeTable {
:
is_prime_size_
(
max
+
1
),
is_prime_
(
new
bool
[
max
+
1
])
{
CalculatePrimesUpTo
(
max
);
}
virtual
~
PreCalculatedPrimeTable
()
{
delete
[]
is_prime_
;
}
~
PreCalculatedPrimeTable
()
override
{
delete
[]
is_prime_
;
}
virtual
bool
IsPrime
(
int
n
)
const
{
bool
IsPrime
(
int
n
)
const
override
{
return
0
<=
n
&&
n
<
is_prime_size_
&&
is_prime_
[
n
];
}
virtual
int
GetNextPrime
(
int
p
)
const
{
int
GetNextPrime
(
int
p
)
const
override
{
for
(
int
n
=
p
+
1
;
n
<
is_prime_size_
;
n
++
)
{
if
(
is_prime_
[
n
])
return
n
;
}
...
...
googletest/samples/sample10_unittest.cc
View file @
25905b9f
...
...
@@ -74,12 +74,12 @@ int Water::allocated_ = 0;
class
LeakChecker
:
public
EmptyTestEventListener
{
private:
// Called before a test starts.
virtual
void
OnTestStart
(
const
TestInfo
&
/* test_info */
)
{
void
OnTestStart
(
const
TestInfo
&
/* test_info */
)
override
{
initially_allocated_
=
Water
::
allocated
();
}
// Called after a test ends.
virtual
void
OnTestEnd
(
const
TestInfo
&
/* test_info */
)
{
void
OnTestEnd
(
const
TestInfo
&
/* test_info */
)
override
{
int
difference
=
Water
::
allocated
()
-
initially_allocated_
;
// You can generate a failure in any event handler except
...
...
googletest/samples/sample3_unittest.cc
View file @
25905b9f
...
...
@@ -71,7 +71,7 @@ class QueueTestSmpl3 : public testing::Test {
// virtual void SetUp() will be called before each test is run. You
// should define it if you need to initialize the variables.
// Otherwise, this can be skipped.
virtual
void
SetUp
()
{
void
SetUp
()
override
{
q1_
.
Enqueue
(
1
);
q2_
.
Enqueue
(
2
);
q2_
.
Enqueue
(
3
);
...
...
googletest/samples/sample5_unittest.cc
View file @
25905b9f
...
...
@@ -63,11 +63,11 @@ class QuickTest : public testing::Test {
protected:
// Remember that SetUp() is run immediately before a test starts.
// This is a good place to record the start time.
virtual
void
SetUp
()
{
start_time_
=
time
(
nullptr
);
}
void
SetUp
()
override
{
start_time_
=
time
(
nullptr
);
}
// TearDown() is invoked immediately after a test finishes. Here we
// check if the test was too slow.
virtual
void
TearDown
()
{
void
TearDown
()
override
{
// Gets the time when the test finishes
const
time_t
end_time
=
time
(
nullptr
);
...
...
@@ -140,7 +140,7 @@ TEST_F(IntegerFunctionTest, IsPrime) {
// stuff inside the body of the test fixture, as usual.
class
QueueTest
:
public
QuickTest
{
protected:
virtual
void
SetUp
()
{
void
SetUp
()
override
{
// First, we need to set up the super fixture (QuickTest).
QuickTest
::
SetUp
();
...
...
googletest/samples/sample6_unittest.cc
View file @
25905b9f
...
...
@@ -61,7 +61,7 @@ class PrimeTableTest : public testing::Test {
// implemented by T.
PrimeTableTest
()
:
table_
(
CreatePrimeTable
<
T
>
())
{}
virtual
~
PrimeTableTest
()
{
delete
table_
;
}
~
PrimeTableTest
()
override
{
delete
table_
;
}
// Note that we test an implementation via the base interface
// instead of the actual implementation class. This is important
...
...
googletest/samples/sample7_unittest.cc
View file @
25905b9f
...
...
@@ -65,9 +65,9 @@ PrimeTable* CreatePreCalculatedPrimeTable() {
// create and store an instance of PrimeTable.
class
PrimeTableTestSmpl7
:
public
TestWithParam
<
CreatePrimeTableFunc
*>
{
public:
virtual
~
PrimeTableTestSmpl7
()
{
delete
table_
;
}
virtual
void
SetUp
()
{
table_
=
(
*
GetParam
())();
}
virtual
void
TearDown
()
{
~
PrimeTableTestSmpl7
()
override
{
delete
table_
;
}
void
SetUp
()
override
{
table_
=
(
*
GetParam
())();
}
void
TearDown
()
override
{
delete
table_
;
table_
=
nullptr
;
}
...
...
googletest/samples/sample8_unittest.cc
View file @
25905b9f
...
...
@@ -37,7 +37,6 @@
#include "gtest/gtest.h"
namespace
{
#if GTEST_HAS_COMBINE
// Suppose we want to introduce a new, improved implementation of PrimeTable
// which combines speed of PrecalcPrimeTable and versatility of
...
...
@@ -54,19 +53,19 @@ class HybridPrimeTable : public PrimeTable {
?
nullptr
:
new
PreCalculatedPrimeTable
(
max_precalculated
)),
max_precalculated_
(
max_precalculated
)
{}
virtual
~
HybridPrimeTable
()
{
~
HybridPrimeTable
()
override
{
delete
on_the_fly_impl_
;
delete
precalc_impl_
;
}
virtual
bool
IsPrime
(
int
n
)
const
{
bool
IsPrime
(
int
n
)
const
override
{
if
(
precalc_impl_
!=
nullptr
&&
n
<
max_precalculated_
)
return
precalc_impl_
->
IsPrime
(
n
);
else
return
on_the_fly_impl_
->
IsPrime
(
n
);
}
virtual
int
GetNextPrime
(
int
p
)
const
{
int
GetNextPrime
(
int
p
)
const
override
{
int
next_prime
=
-
1
;
if
(
precalc_impl_
!=
nullptr
&&
p
<
max_precalculated_
)
next_prime
=
precalc_impl_
->
GetNextPrime
(
p
);
...
...
@@ -90,22 +89,15 @@ using ::testing::Combine;
// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
// accept different combinations of parameters for instantiating a
// HybridPrimeTable instance.
class
PrimeTableTest
:
public
TestWithParam
<
::
testing
::
tuple
<
bool
,
int
>
>
{
class
PrimeTableTest
:
public
TestWithParam
<
::
std
::
tuple
<
bool
,
int
>
>
{
protected:
virtual
void
SetUp
()
{
// This can be written as
//
// bool force_on_the_fly;
// int max_precalculated;
// tie(force_on_the_fly, max_precalculated) = GetParam();
//
// once the Google C++ Style Guide allows use of ::std::tr1::tie.
//
bool
force_on_the_fly
=
::
testing
::
get
<
0
>
(
GetParam
());
int
max_precalculated
=
::
testing
::
get
<
1
>
(
GetParam
());
void
SetUp
()
override
{
bool
force_on_the_fly
;
int
max_precalculated
;
std
::
tie
(
force_on_the_fly
,
max_precalculated
)
=
GetParam
();
table_
=
new
HybridPrimeTable
(
force_on_the_fly
,
max_precalculated
);
}
virtual
void
TearDown
()
{
void
TearDown
()
override
{
delete
table_
;
table_
=
nullptr
;
}
...
...
@@ -160,15 +152,4 @@ INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
PrimeTableTest
,
Combine
(
Bool
(),
Values
(
1
,
10
)));
#else
// Google Test may not support Combine() with some compilers. If we
// use conditional compilation to compile out all code referring to
// the gtest_main library, MSVC linker will not link that library at
// all and consequently complain about missing entry point defined in
// that library (fatal error LNK1561: entry point must be
// defined). This dummy test keeps gtest_main linked in.
TEST
(
DummyTest
,
CombineIsNotSupportedOnThisPlatform
)
{}
#endif // GTEST_HAS_COMBINE
}
// namespace
googletest/samples/sample9_unittest.cc
View file @
25905b9f
...
...
@@ -49,16 +49,16 @@ namespace {
class
TersePrinter
:
public
EmptyTestEventListener
{
private:
// Called before any test activity starts.
virtual
void
OnTestProgramStart
(
const
UnitTest
&
/* unit_test */
)
{}
void
OnTestProgramStart
(
const
UnitTest
&
/* unit_test */
)
override
{}
// Called after all test activities have ended.
virtual
void
OnTestProgramEnd
(
const
UnitTest
&
unit_test
)
{
void
OnTestProgramEnd
(
const
UnitTest
&
unit_test
)
override
{
fprintf
(
stdout
,
"TEST %s
\n
"
,
unit_test
.
Passed
()
?
"PASSED"
:
"FAILED"
);
fflush
(
stdout
);
}
// Called before a test starts.
virtual
void
OnTestStart
(
const
TestInfo
&
test_info
)
{
void
OnTestStart
(
const
TestInfo
&
test_info
)
override
{
fprintf
(
stdout
,
"*** Test %s.%s starting.
\n
"
,
test_info
.
test_case_name
(),
...
...
@@ -67,7 +67,7 @@ class TersePrinter : public EmptyTestEventListener {
}
// Called after a failed assertion or a SUCCEED() invocation.
virtual
void
OnTestPartResult
(
const
TestPartResult
&
test_part_result
)
{
void
OnTestPartResult
(
const
TestPartResult
&
test_part_result
)
override
{
fprintf
(
stdout
,
"%s in %s:%d
\n
%s
\n
"
,
test_part_result
.
failed
()
?
"*** Failure"
:
"Success"
,
...
...
@@ -78,7 +78,7 @@ class TersePrinter : public EmptyTestEventListener {
}
// Called after a test ends.
virtual
void
OnTestEnd
(
const
TestInfo
&
test_info
)
{
void
OnTestEnd
(
const
TestInfo
&
test_info
)
override
{
fprintf
(
stdout
,
"*** Test %s.%s ending.
\n
"
,
test_info
.
test_case_name
(),
...
...
googletest/src/gtest-all.cc
View file @
25905b9f
...
...
@@ -41,6 +41,7 @@
#include "src/gtest.cc"
#include "src/gtest-death-test.cc"
#include "src/gtest-filepath.cc"
#include "src/gtest-matchers.cc"
#include "src/gtest-port.cc"
#include "src/gtest-printers.cc"
#include "src/gtest-test-part.cc"
...
...
googletest/src/gtest-death-test.cc
View file @
25905b9f
...
...
@@ -31,6 +31,9 @@
// This file implements death tests.
#include "gtest/gtest-death-test.h"
#include <utility>
#include "gtest/internal/gtest-port.h"
#include "gtest/internal/custom/gtest.h"
...
...
@@ -64,8 +67,13 @@
# if GTEST_OS_FUCHSIA
# include <lib/fdio/io.h>
# include <lib/fdio/spawn.h>
# include <lib/fdio/util.h>
# include <lib/zx/socket.h>
# include <lib/zx/port.h>
# include <lib/zx/process.h>
# include <zircon/processargs.h>
# include <zircon/syscalls.h>
# include <zircon/syscalls/policy.h>
# include <zircon/syscalls/port.h>
# endif // GTEST_OS_FUCHSIA
...
...
@@ -369,10 +377,11 @@ DeathTest::DeathTest() {
// Creates and returns a death test by dispatching to the current
// death test factory.
bool
DeathTest
::
Create
(
const
char
*
statement
,
const
RE
*
regex
,
const
char
*
file
,
int
line
,
DeathTest
**
test
)
{
bool
DeathTest
::
Create
(
const
char
*
statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
,
DeathTest
**
test
)
{
return
GetUnitTestImpl
()
->
death_test_factory
()
->
Create
(
statement
,
regex
,
file
,
line
,
test
);
statement
,
std
::
move
(
matcher
)
,
file
,
line
,
test
);
}
const
char
*
DeathTest
::
LastMessage
()
{
...
...
@@ -388,9 +397,9 @@ std::string DeathTest::last_death_test_message_;
// Provides cross platform implementation for some death functionality.
class
DeathTestImpl
:
public
DeathTest
{
protected:
DeathTestImpl
(
const
char
*
a_statement
,
const
RE
*
a_regex
)
DeathTestImpl
(
const
char
*
a_statement
,
Matcher
<
const
std
::
string
&>
matcher
)
:
statement_
(
a_statement
),
regex_
(
a_regex
),
matcher_
(
std
::
move
(
matcher
)
),
spawned_
(
false
),
status_
(
-
1
),
outcome_
(
IN_PROGRESS
),
...
...
@@ -398,13 +407,12 @@ class DeathTestImpl : public DeathTest {
write_fd_
(
-
1
)
{}
// read_fd_ is expected to be closed and cleared by a derived class.
~
DeathTestImpl
()
{
GTEST_DEATH_TEST_CHECK_
(
read_fd_
==
-
1
);
}
~
DeathTestImpl
()
override
{
GTEST_DEATH_TEST_CHECK_
(
read_fd_
==
-
1
);
}
void
Abort
(
AbortReason
reason
);
virtual
bool
Passed
(
bool
status_ok
);
void
Abort
(
AbortReason
reason
)
override
;
bool
Passed
(
bool
status_ok
)
override
;
const
char
*
statement
()
const
{
return
statement_
;
}
const
RE
*
regex
()
const
{
return
regex_
;
}
bool
spawned
()
const
{
return
spawned_
;
}
void
set_spawned
(
bool
is_spawned
)
{
spawned_
=
is_spawned
;
}
int
status
()
const
{
return
status_
;
}
...
...
@@ -422,13 +430,15 @@ class DeathTestImpl : public DeathTest {
// case of unexpected codes.
void
ReadAndInterpretStatusByte
();
// Returns stderr output from the child process.
virtual
std
::
string
GetErrorLogs
();
private:
// The textual content of the code this object is testing. This class
// doesn't own this string and should not attempt to delete it.
const
char
*
const
statement_
;
// The regular expression which test output must match. DeathTestImpl
// doesn't own this object and should not attempt to delete it.
const
RE
*
const
regex_
;
// A matcher that's expected to match the stderr output by the child process.
Matcher
<
const
std
::
string
&>
matcher_
;
// True if the death test child process has been successfully spawned.
bool
spawned_
;
// The exit status of the child process.
...
...
@@ -490,6 +500,10 @@ void DeathTestImpl::ReadAndInterpretStatusByte() {
set_read_fd
(
-
1
);
}
std
::
string
DeathTestImpl
::
GetErrorLogs
()
{
return
GetCapturedStderr
();
}
// Signals that the death test code which should have exited, didn't.
// Should be called only in a death test child process.
// Writes a status byte to the child's status file descriptor, then
...
...
@@ -543,9 +557,8 @@ static ::std::string FormatDeathTestOutput(const ::std::string& output) {
// in the format specified by wait(2). On Windows, this is the
// value supplied to the ExitProcess() API or a numeric code
// of the exception that terminated the program.
// regex: A regular expression object to be applied to
// the test's captured standard error output; the death test
// fails if it does not match.
// matcher_: A matcher that's expected to match the stderr output by the child
// process.
//
// Argument:
// status_ok: true if exit_status is acceptable in the context of
...
...
@@ -558,7 +571,7 @@ bool DeathTestImpl::Passed(bool status_ok) {
if
(
!
spawned
())
return
false
;
const
std
::
string
error_message
=
Get
CapturedStderr
();
const
std
::
string
error_message
=
Get
ErrorLogs
();
bool
success
=
false
;
Message
buffer
;
...
...
@@ -579,18 +592,15 @@ bool DeathTestImpl::Passed(bool status_ok) {
break
;
case
DIED
:
if
(
status_ok
)
{
# if GTEST_USES_PCRE
// PCRE regexes support embedded NULs.
const
bool
matched
=
RE
::
PartialMatch
(
error_message
,
*
regex
());
# else
const
bool
matched
=
RE
::
PartialMatch
(
error_message
.
c_str
(),
*
regex
());
# endif // GTEST_USES_PCRE
if
(
matched
)
{
if
(
matcher_
.
Matches
(
error_message
))
{
success
=
true
;
}
else
{
std
::
ostringstream
stream
;
matcher_
.
DescribeTo
(
&
stream
);
buffer
<<
" Result: died but not with expected error.
\n
"
<<
" Expected: "
<<
regex
()
->
pattern
()
<<
"
\n
"
<<
"Actual msg:
\n
"
<<
FormatDeathTestOutput
(
error_message
);
<<
" Expected: "
<<
stream
.
str
()
<<
"
\n
"
<<
"Actual msg:
\n
"
<<
FormatDeathTestOutput
(
error_message
);
}
}
else
{
buffer
<<
" Result: died but not with expected exit code:
\n
"
...
...
@@ -639,11 +649,11 @@ bool DeathTestImpl::Passed(bool status_ok) {
//
class
WindowsDeathTest
:
public
DeathTestImpl
{
public:
WindowsDeathTest
(
const
char
*
a_statement
,
const
RE
*
a_regex
,
const
char
*
file
,
int
lin
e
)
:
DeathTestImpl
(
a_statement
,
a_regex
),
file_
(
file
),
line_
(
line
)
{}
WindowsDeathTest
(
const
char
*
a_statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
)
:
DeathTestImpl
(
a_statement
,
std
::
move
(
matcher
))
,
file_
(
fil
e
)
,
line_
(
line
)
{}
// All of these virtual functions are inherited from DeathTest.
virtual
int
Wait
();
...
...
@@ -720,7 +730,7 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
const
TestInfo
*
const
info
=
impl
->
current_test_info
();
const
int
death_test_index
=
info
->
result
()
->
death_test_count
();
if
(
flag
!=
NULL
)
{
if
(
flag
!=
nullptr
)
{
// ParseInternalRunDeathTestFlag() has performed all the necessary
// processing.
set_write_fd
(
flag
->
write_fd
());
...
...
@@ -729,8 +739,8 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
// WindowsDeathTest uses an anonymous pipe to communicate results of
// a death test.
SECURITY_ATTRIBUTES
handles_are_inheritable
=
{
sizeof
(
SECURITY_ATTRIBUTES
),
NULL
,
TRUE
};
SECURITY_ATTRIBUTES
handles_are_inheritable
=
{
sizeof
(
SECURITY_ATTRIBUTES
),
nullptr
,
TRUE
};
HANDLE
read_handle
,
write_handle
;
GTEST_DEATH_TEST_CHECK_
(
::
CreatePipe
(
&
read_handle
,
&
write_handle
,
&
handles_are_inheritable
,
...
...
@@ -743,8 +753,8 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
&
handles_are_inheritable
,
TRUE
,
// The event will automatically reset to non-signaled state.
FALSE
,
// The initial state is non-signalled.
NULL
));
// The even is unnamed.
GTEST_DEATH_TEST_CHECK_
(
event_handle_
.
Get
()
!=
NULL
);
nullptr
));
// The even is unnamed.
GTEST_DEATH_TEST_CHECK_
(
event_handle_
.
Get
()
!=
nullptr
);
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_case_name
()
+
"."
+
info
->
name
();
...
...
@@ -760,8 +770,7 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
"|"
+
StreamableToString
(
reinterpret_cast
<
size_t
>
(
event_handle_
.
Get
()));
char
executable_path
[
_MAX_PATH
+
1
];
// NOLINT
GTEST_DEATH_TEST_CHECK_
(
_MAX_PATH
+
1
!=
::
GetModuleFileNameA
(
NULL
,
GTEST_DEATH_TEST_CHECK_
(
_MAX_PATH
+
1
!=
::
GetModuleFileNameA
(
nullptr
,
executable_path
,
_MAX_PATH
));
...
...
@@ -784,16 +793,15 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
startup_info
.
hStdError
=
::
GetStdHandle
(
STD_ERROR_HANDLE
);
PROCESS_INFORMATION
process_info
;
GTEST_DEATH_TEST_CHECK_
(
::
CreateProcessA
(
executable_path
,
const_cast
<
char
*>
(
command_line
.
c_str
()),
NULL
,
// Retuned process handle is not inheritable.
NULL
,
// Retuned thread handle is not inheritable.
GTEST_DEATH_TEST_CHECK_
(
::
CreateProcessA
(
executable_path
,
const_cast
<
char
*>
(
command_line
.
c_str
()),
nullptr
,
// Retuned process handle is not inheritable.
nullptr
,
// Retuned thread handle is not inheritable.
TRUE
,
// Child inherits all inheritable handles (for write_handle_).
0x0
,
// Default creation flags.
NULL
,
// Inherit the parent's environment.
UnitTest
::
GetInstance
()
->
original_working_dir
(),
&
startup_info
,
nullptr
,
// Inherit the parent's environment.
UnitTest
::
GetInstance
()
->
original_working_dir
(),
&
startup_info
,
&
process_info
)
!=
FALSE
);
child_handle_
.
Reset
(
process_info
.
hProcess
);
::
CloseHandle
(
process_info
.
hThread
);
...
...
@@ -805,38 +813,34 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
class
FuchsiaDeathTest
:
public
DeathTestImpl
{
public:
FuchsiaDeathTest
(
const
char
*
a_statement
,
const
RE
*
a_regex
,
const
char
*
file
,
int
line
)
:
DeathTestImpl
(
a_statement
,
a_regex
),
file_
(
file
),
line_
(
line
)
{}
virtual
~
FuchsiaDeathTest
()
{
zx_status_t
status
=
zx_handle_close
(
child_process_
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
status
=
zx_handle_close
(
port_
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
}
FuchsiaDeathTest
(
const
char
*
a_statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
)
:
DeathTestImpl
(
a_statement
,
std
::
move
(
matcher
)),
file_
(
file
),
line_
(
line
)
{}
// All of these virtual functions are inherited from DeathTest.
virtual
int
Wait
();
virtual
TestRole
AssumeRole
();
int
Wait
()
override
;
TestRole
AssumeRole
()
override
;
std
::
string
GetErrorLogs
()
override
;
private:
// The name of the file in which the death test is located.
const
char
*
const
file_
;
// The line number on which the death test is located.
const
int
line_
;
// The stderr data captured by the child process.
std
::
string
captured_stderr_
;
zx_handle_t
child_process_
=
ZX_HANDLE_INVALID
;
zx_handle_t
port_
=
ZX_HANDLE_INVALID
;
zx
::
process
child_process_
;
zx
::
port
port_
;
zx
::
socket
stderr_socket_
;
};
// Utility class for accumulating command-line arguments.
class
Arguments
{
public:
Arguments
()
{
args_
.
push_back
(
NULL
);
}
Arguments
()
{
args_
.
push_back
(
nullptr
);
}
~
Arguments
()
{
for
(
std
::
vector
<
char
*>::
iterator
i
=
args_
.
begin
();
i
!=
args_
.
end
();
...
...
@@ -872,51 +876,74 @@ class Arguments {
// status, or 0 if no child process exists. As a side effect, sets the
// outcome data member.
int
FuchsiaDeathTest
::
Wait
()
{
const
int
kProcessKey
=
0
;
const
int
kSocketKey
=
1
;
if
(
!
spawned
())
return
0
;
// Register to wait for the child process to terminate.
zx_status_t
status_zx
;
status_zx
=
zx_object_wait_async
(
child_process_
,
port_
,
0
/* key */
,
ZX_PROCESS_TERMINATED
,
ZX_WAIT_ASYNC_ONCE
);
status_zx
=
child_process_
.
wait_async
(
port_
,
kProcessKey
,
ZX_PROCESS_TERMINATED
,
ZX_WAIT_ASYNC_ONCE
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
// Wait for it to terminate, or an exception to be received.
zx_
port_
packet_t
packet
;
status_zx
=
zx_port_wait
(
port_
,
ZX_TIME_INFINITE
,
&
packet
);
// Register to wait for the socket to be readable or closed.
status_zx
=
stderr_socket_
.
wait_async
(
port_
,
kSocketKey
,
ZX_SOCKET_READABLE
|
ZX_SOCKET_PEER_CLOSED
,
ZX_WAIT_ASYNC_REPEATING
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
if
(
ZX_PKT_IS_EXCEPTION
(
packet
.
type
))
{
// Process encountered an exception. Kill it directly rather than letting
// other handlers process the event.
status_zx
=
zx_task_kill
(
child_process_
);
bool
process_terminated
=
false
;
bool
socket_closed
=
false
;
do
{
zx_port_packet_t
packet
=
{};
status_zx
=
port_
.
wait
(
zx
::
time
::
infinite
(),
&
packet
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
// Now wait for |child_process_| to terminate.
zx_signals_t
signals
=
0
;
status_zx
=
zx_object_wait_one
(
child_process_
,
ZX_PROCESS_TERMINATED
,
ZX_TIME_INFINITE
,
&
signals
);
if
(
packet
.
key
==
kProcessKey
)
{
if
(
ZX_PKT_IS_EXCEPTION
(
packet
.
type
))
{
// Process encountered an exception. Kill it directly rather than
// letting other handlers process the event. We will get a second
// kProcessKey event when the process actually terminates.
status_zx
=
child_process_
.
kill
();
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
GTEST_DEATH_TEST_CHECK_
(
signals
&
ZX_PROCESS_TERMINATED
);
}
else
{
// Process terminated.
GTEST_DEATH_TEST_CHECK_
(
ZX_PKT_IS_SIGNAL_ONE
(
packet
.
type
));
GTEST_DEATH_TEST_CHECK_
(
packet
.
signal
.
observed
&
ZX_PROCESS_TERMINATED
);
process_terminated
=
true
;
}
}
else
if
(
packet
.
key
==
kSocketKey
)
{
GTEST_DEATH_TEST_CHECK_
(
ZX_PKT_IS_SIGNAL_REP
(
packet
.
type
));
if
(
packet
.
signal
.
observed
&
ZX_SOCKET_READABLE
)
{
// Read data from the socket.
constexpr
size_t
kBufferSize
=
1024
;
do
{
size_t
old_length
=
captured_stderr_
.
length
();
size_t
bytes_read
=
0
;
captured_stderr_
.
resize
(
old_length
+
kBufferSize
);
status_zx
=
stderr_socket_
.
read
(
0
,
&
captured_stderr_
.
front
()
+
old_length
,
kBufferSize
,
&
bytes_read
);
captured_stderr_
.
resize
(
old_length
+
bytes_read
);
}
while
(
status_zx
==
ZX_OK
);
if
(
status_zx
==
ZX_ERR_PEER_CLOSED
)
{
socket_closed
=
true
;
}
else
{
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_ERR_SHOULD_WAIT
);
}
}
else
{
GTEST_DEATH_TEST_CHECK_
(
packet
.
signal
.
observed
&
ZX_SOCKET_PEER_CLOSED
);
socket_closed
=
true
;
}
}
}
while
(
!
process_terminated
&&
!
socket_closed
);
ReadAndInterpretStatusByte
();
zx_info_process_t
buffer
;
status_zx
=
zx_object_get_info
(
child_process_
,
ZX_INFO_PROCESS
,
&
buffer
,
sizeof
(
buffer
),
nullptr
,
nullptr
);
status_zx
=
child_process_
.
get_info
(
ZX_INFO_PROCESS
,
&
buffer
,
sizeof
(
buffer
),
nullptr
,
nullptr
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
GTEST_DEATH_TEST_CHECK_
(
buffer
.
exited
);
...
...
@@ -936,14 +963,13 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
const
TestInfo
*
const
info
=
impl
->
current_test_info
();
const
int
death_test_index
=
info
->
result
()
->
death_test_count
();
if
(
flag
!=
NULL
)
{
if
(
flag
!=
nullptr
)
{
// ParseInternalRunDeathTestFlag() has performed all the necessary
// processing.
set_write_fd
(
kFuchsiaReadPipeFd
);
return
EXECUTE_TEST
;
}
CaptureStderr
();
// Flush the log buffers since the log streams are shared with the child.
FlushInfoLog
();
...
...
@@ -970,29 +996,65 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
set_read_fd
(
status
);
// Set the pipe handle for the child.
fdio_spawn_action_t
add_handle_action
=
{};
add_handle_action
.
action
=
FDIO_SPAWN_ACTION_ADD_HANDLE
;
add_handle_action
.
h
.
id
=
PA_HND
(
type
,
kFuchsiaReadPipeFd
);
add_handle_action
.
h
.
handle
=
child_pipe_handle
;
fdio_spawn_action_t
spawn_actions
[
2
]
=
{};
fdio_spawn_action_t
*
add_handle_action
=
&
spawn_actions
[
0
];
add_handle_action
->
action
=
FDIO_SPAWN_ACTION_ADD_HANDLE
;
add_handle_action
->
h
.
id
=
PA_HND
(
type
,
kFuchsiaReadPipeFd
);
add_handle_action
->
h
.
handle
=
child_pipe_handle
;
// Create a socket pair will be used to receive the child process' stderr.
zx
::
socket
stderr_producer_socket
;
status
=
zx
::
socket
::
create
(
0
,
&
stderr_producer_socket
,
&
stderr_socket_
);
GTEST_DEATH_TEST_CHECK_
(
status
>=
0
);
int
stderr_producer_fd
=
-
1
;
zx_handle_t
producer_handle
[
1
]
=
{
stderr_producer_socket
.
release
()
};
uint32_t
producer_handle_type
[
1
]
=
{
PA_FDIO_SOCKET
};
status
=
fdio_create_fd
(
producer_handle
,
producer_handle_type
,
1
,
&
stderr_producer_fd
);
GTEST_DEATH_TEST_CHECK_
(
status
>=
0
);
// Spawn the child process.
status
=
fdio_spawn_etc
(
ZX_HANDLE_INVALID
,
FDIO_SPAWN_CLONE_ALL
,
args
.
Argv
()[
0
],
args
.
Argv
(),
nullptr
,
1
,
&
add_handle_action
,
&
child_process_
,
nullptr
);
// Make the stderr socket nonblocking.
GTEST_DEATH_TEST_CHECK_
(
fcntl
(
stderr_producer_fd
,
F_SETFL
,
0
)
==
0
);
fdio_spawn_action_t
*
add_stderr_action
=
&
spawn_actions
[
1
];
add_stderr_action
->
action
=
FDIO_SPAWN_ACTION_CLONE_FD
;
add_stderr_action
->
fd
.
local_fd
=
stderr_producer_fd
;
add_stderr_action
->
fd
.
target_fd
=
STDERR_FILENO
;
// Create a child job.
zx_handle_t
child_job
=
ZX_HANDLE_INVALID
;
status
=
zx_job_create
(
zx_job_default
(),
0
,
&
child_job
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
zx_policy_basic_t
policy
;
policy
.
condition
=
ZX_POL_NEW_ANY
;
policy
.
policy
=
ZX_POL_ACTION_ALLOW
;
status
=
zx_job_set_policy
(
child_job
,
ZX_JOB_POL_RELATIVE
,
ZX_JOB_POL_BASIC
,
&
policy
,
1
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
// Create an exception port and attach it to the |child_
process_
|, to allow
// Create an exception port and attach it to the |child_
job
|, to allow
// us to suppress the system default exception handler from firing.
status
=
zx
_
port
_
create
(
0
,
&
port_
);
status
=
zx
::
port
::
create
(
0
,
&
port_
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
status
=
zx_task_bind_exception_port
(
child_process_
,
port_
,
0
/* key */
,
0
/*options */
);
child_job
,
port_
.
get
(),
0
/* key */
,
0
/*options */
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
// Spawn the child process.
status
=
fdio_spawn_etc
(
child_job
,
FDIO_SPAWN_CLONE_ALL
,
args
.
Argv
()[
0
],
args
.
Argv
(),
nullptr
,
2
,
spawn_actions
,
child_process_
.
reset_and_get_address
(),
nullptr
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
set_spawned
(
true
);
return
OVERSEE_TEST
;
}
std
::
string
FuchsiaDeathTest
::
GetErrorLogs
()
{
return
captured_stderr_
;
}
#else // We are neither on Windows, nor on Fuchsia.
// ForkingDeathTest provides implementations for most of the abstract
...
...
@@ -1000,10 +1062,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
// left undefined.
class
ForkingDeathTest
:
public
DeathTestImpl
{
public:
ForkingDeathTest
(
const
char
*
statement
,
const
RE
*
regex
);
ForkingDeathTest
(
const
char
*
statement
,
Matcher
<
const
std
::
string
&>
matcher
);
// All of these virtual functions are inherited from DeathTest.
virtual
int
Wait
();
int
Wait
()
override
;
protected:
void
set_child_pid
(
pid_t
child_pid
)
{
child_pid_
=
child_pid
;
}
...
...
@@ -1014,9 +1076,9 @@ class ForkingDeathTest : public DeathTestImpl {
};
// Constructs a ForkingDeathTest.
ForkingDeathTest
::
ForkingDeathTest
(
const
char
*
a_statement
,
const
RE
*
a_regex
)
:
DeathTestImpl
(
a_statement
,
a_regex
),
child_pid_
(
-
1
)
{}
ForkingDeathTest
::
ForkingDeathTest
(
const
char
*
a_statement
,
Matcher
<
const
std
::
string
&>
matcher
)
:
DeathTestImpl
(
a_statement
,
std
::
move
(
matcher
)),
child_pid_
(
-
1
)
{}
// Waits for the child in a death test to exit, returning its exit
// status, or 0 if no child process exists. As a side effect, sets the
...
...
@@ -1037,9 +1099,9 @@ int ForkingDeathTest::Wait() {
// in the child process.
class
NoExecDeathTest
:
public
ForkingDeathTest
{
public:
NoExecDeathTest
(
const
char
*
a_statement
,
const
RE
*
a_regex
)
:
ForkingDeathTest
(
a_statement
,
a_regex
)
{
}
virtual
TestRole
AssumeRole
();
NoExecDeathTest
(
const
char
*
a_statement
,
Matcher
<
const
std
::
string
&>
matcher
)
:
ForkingDeathTest
(
a_statement
,
std
::
move
(
matcher
)
)
{}
TestRole
AssumeRole
()
override
;
};
// The AssumeRole process for a fork-and-run death test. It implements a
...
...
@@ -1092,10 +1154,13 @@ DeathTest::TestRole NoExecDeathTest::AssumeRole() {
// only this specific death test to be run.
class
ExecDeathTest
:
public
ForkingDeathTest
{
public:
ExecDeathTest
(
const
char
*
a_statement
,
const
RE
*
a_regex
,
const
char
*
file
,
int
line
)
:
ForkingDeathTest
(
a_statement
,
a_regex
),
file_
(
file
),
line_
(
line
)
{
}
virtual
TestRole
AssumeRole
();
ExecDeathTest
(
const
char
*
a_statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
)
:
ForkingDeathTest
(
a_statement
,
std
::
move
(
matcher
)),
file_
(
file
),
line_
(
line
)
{}
TestRole
AssumeRole
()
override
;
private:
static
::
std
::
vector
<
std
::
string
>
GetArgvsForDeathTestChildProcess
()
{
::
std
::
vector
<
std
::
string
>
args
=
GetInjectableArgvs
();
...
...
@@ -1260,7 +1325,8 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
fd_flags
|
FD_CLOEXEC
));
struct
inheritance
inherit
=
{
0
};
// spawn is a system call.
child_pid
=
spawn
(
args
.
argv
[
0
],
0
,
NULL
,
&
inherit
,
args
.
argv
,
GetEnviron
());
child_pid
=
spawn
(
args
.
argv
[
0
],
0
,
nullptr
,
&
inherit
,
args
.
argv
,
GetEnviron
());
// Restores the current working directory.
GTEST_DEATH_TEST_CHECK_
(
fchdir
(
cwd_fd
)
!=
-
1
);
GTEST_DEATH_TEST_CHECK_SYSCALL_
(
close
(
cwd_fd
));
...
...
@@ -1382,7 +1448,8 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
// by the "test" argument to its address. If the test should be
// skipped, sets that pointer to NULL. Returns true, unless the
// flag is set to an invalid value.
bool
DefaultDeathTestFactory
::
Create
(
const
char
*
statement
,
const
RE
*
regex
,
bool
DefaultDeathTestFactory
::
Create
(
const
char
*
statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
,
DeathTest
**
test
)
{
UnitTestImpl
*
const
impl
=
GetUnitTestImpl
();
...
...
@@ -1411,22 +1478,22 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
if
(
GTEST_FLAG
(
death_test_style
)
==
"threadsafe"
||
GTEST_FLAG
(
death_test_style
)
==
"fast"
)
{
*
test
=
new
WindowsDeathTest
(
statement
,
regex
,
file
,
line
);
*
test
=
new
WindowsDeathTest
(
statement
,
std
::
move
(
matcher
)
,
file
,
line
);
}
# elif GTEST_OS_FUCHSIA
if
(
GTEST_FLAG
(
death_test_style
)
==
"threadsafe"
||
GTEST_FLAG
(
death_test_style
)
==
"fast"
)
{
*
test
=
new
FuchsiaDeathTest
(
statement
,
regex
,
file
,
line
);
*
test
=
new
FuchsiaDeathTest
(
statement
,
std
::
move
(
matcher
)
,
file
,
line
);
}
# else
if
(
GTEST_FLAG
(
death_test_style
)
==
"threadsafe"
)
{
*
test
=
new
ExecDeathTest
(
statement
,
regex
,
file
,
line
);
*
test
=
new
ExecDeathTest
(
statement
,
std
::
move
(
matcher
)
,
file
,
line
);
}
else
if
(
GTEST_FLAG
(
death_test_style
)
==
"fast"
)
{
*
test
=
new
NoExecDeathTest
(
statement
,
regex
);
*
test
=
new
NoExecDeathTest
(
statement
,
std
::
move
(
matcher
)
);
}
# endif // GTEST_OS_WINDOWS
...
...
googletest/src/gtest-filepath.cc
View file @
25905b9f
...
...
@@ -101,7 +101,7 @@ FilePath FilePath::GetCurrentDir() {
return
FilePath
(
kCurrentDirectoryString
);
#elif GTEST_OS_WINDOWS
char
cwd
[
GTEST_PATH_MAX_
+
1
]
=
{
'\0'
};
return
FilePath
(
_getcwd
(
cwd
,
sizeof
(
cwd
))
==
NULL
?
""
:
cwd
);
return
FilePath
(
_getcwd
(
cwd
,
sizeof
(
cwd
))
==
nullptr
?
""
:
cwd
);
#else
char
cwd
[
GTEST_PATH_MAX_
+
1
]
=
{
'\0'
};
char
*
result
=
getcwd
(
cwd
,
sizeof
(
cwd
));
...
...
@@ -109,7 +109,7 @@ FilePath FilePath::GetCurrentDir() {
// getcwd will likely fail in NaCl due to the sandbox, so return something
// reasonable. The user may have provided a shim implementation for getcwd,
// however, so fallback only when failure is detected.
return
FilePath
(
result
==
NULL
?
kCurrentDirectoryString
:
cwd
);
return
FilePath
(
result
==
nullptr
?
kCurrentDirectoryString
:
cwd
);
# endif // GTEST_OS_NACL
return
FilePath
(
result
==
nullptr
?
""
:
cwd
);
#endif // GTEST_OS_WINDOWS_MOBILE
...
...
@@ -136,8 +136,8 @@ const char* FilePath::FindLastPathSeparator() const {
#if GTEST_HAS_ALT_PATH_SEP_
const
char
*
const
last_alt_sep
=
strrchr
(
c_str
(),
kAlternatePathSeparator
);
// Comparing two pointers of which only one is NULL is undefined.
if
(
last_alt_sep
!=
NULL
&&
(
last_sep
==
NULL
||
last_alt_sep
>
last_sep
))
{
if
(
last_alt_sep
!=
nullptr
&&
(
last_sep
==
nullptr
||
last_alt_sep
>
last_sep
))
{
return
last_alt_sep
;
}
#endif
...
...
@@ -324,7 +324,7 @@ bool FilePath::CreateFolder() const {
#if GTEST_OS_WINDOWS_MOBILE
FilePath
removed_sep
(
this
->
RemoveTrailingPathSeparator
());
LPCWSTR
unicode
=
String
::
AnsiToUtf16
(
removed_sep
.
c_str
());
int
result
=
CreateDirectory
(
unicode
,
NULL
)
?
0
:
-
1
;
int
result
=
CreateDirectory
(
unicode
,
nullptr
)
?
0
:
-
1
;
delete
[]
unicode
;
#elif GTEST_OS_WINDOWS
int
result
=
_mkdir
(
pathname_
.
c_str
());
...
...
googletest/src/gtest-internal-inl.h
View file @
25905b9f
...
...
@@ -42,6 +42,7 @@
#include <string.h> // For memmove.
#include <algorithm>
#include <memory>
#include <string>
#include <vector>
...
...
@@ -442,8 +443,8 @@ class OsStackTraceGetter : public OsStackTraceGetterInterface {
public:
OsStackTraceGetter
()
{}
virtual
std
::
string
CurrentStackTrace
(
int
max_depth
,
int
skip_count
);
virtual
void
UponLeavingGTest
();
std
::
string
CurrentStackTrace
(
int
max_depth
,
int
skip_count
)
override
;
void
UponLeavingGTest
()
override
;
private:
#if GTEST_HAS_ABSL
...
...
@@ -474,7 +475,7 @@ class DefaultGlobalTestPartResultReporter
explicit
DefaultGlobalTestPartResultReporter
(
UnitTestImpl
*
unit_test
);
// Implements the TestPartResultReporterInterface. Reports the test part
// result in the current test.
virtual
void
ReportTestPartResult
(
const
TestPartResult
&
result
);
void
ReportTestPartResult
(
const
TestPartResult
&
result
)
override
;
private:
UnitTestImpl
*
const
unit_test_
;
...
...
@@ -490,7 +491,7 @@ class DefaultPerThreadTestPartResultReporter
explicit
DefaultPerThreadTestPartResultReporter
(
UnitTestImpl
*
unit_test
);
// Implements the TestPartResultReporterInterface. The implementation just
// delegates to the current global test part result reporter of *unit_test_.
virtual
void
ReportTestPartResult
(
const
TestPartResult
&
result
);
void
ReportTestPartResult
(
const
TestPartResult
&
result
)
override
;
private:
UnitTestImpl
*
const
unit_test_
;
...
...
@@ -913,8 +914,8 @@ class GTEST_API_ UnitTestImpl {
#if GTEST_HAS_DEATH_TEST
// The decomposed components of the gtest_internal_run_death_test flag,
// parsed when RUN_ALL_TESTS is called.
internal
::
scoped
_ptr
<
InternalRunDeathTestFlag
>
internal_run_death_test_flag_
;
internal
::
scoped
_ptr
<
internal
::
DeathTestFactory
>
death_test_factory_
;
std
::
unique
_ptr
<
InternalRunDeathTestFlag
>
internal_run_death_test_flag_
;
std
::
unique
_ptr
<
internal
::
DeathTestFactory
>
death_test_factory_
;
#endif // GTEST_HAS_DEATH_TEST
// A per-thread stack of traces created by the SCOPED_TRACE() macro.
...
...
@@ -1062,13 +1063,13 @@ class StreamingListener : public EmptyTestEventListener {
MakeConnection
();
}
virtual
~
SocketWriter
()
{
~
SocketWriter
()
override
{
if
(
sockfd_
!=
-
1
)
CloseConnection
();
}
// Sends a string to the socket.
virtual
void
Send
(
const
std
::
string
&
message
)
{
void
Send
(
const
std
::
string
&
message
)
override
{
GTEST_CHECK_
(
sockfd_
!=
-
1
)
<<
"Send() can be called only when there is a connection."
;
...
...
@@ -1085,7 +1086,7 @@ class StreamingListener : public EmptyTestEventListener {
void
MakeConnection
();
// Closes the socket.
void
CloseConnection
()
{
void
CloseConnection
()
override
{
GTEST_CHECK_
(
sockfd_
!=
-
1
)
<<
"CloseConnection() can be called only when there is a connection."
;
...
...
@@ -1111,11 +1112,11 @@ class StreamingListener : public EmptyTestEventListener {
explicit
StreamingListener
(
AbstractSocketWriter
*
socket_writer
)
:
socket_writer_
(
socket_writer
)
{
Start
();
}
void
OnTestProgramStart
(
const
UnitTest
&
/* unit_test */
)
{
void
OnTestProgramStart
(
const
UnitTest
&
/* unit_test */
)
override
{
SendLn
(
"event=TestProgramStart"
);
}
void
OnTestProgramEnd
(
const
UnitTest
&
unit_test
)
{
void
OnTestProgramEnd
(
const
UnitTest
&
unit_test
)
override
{
// Note that Google Test current only report elapsed time for each
// test iteration, not for the entire test program.
SendLn
(
"event=TestProgramEnd&passed="
+
FormatBool
(
unit_test
.
Passed
()));
...
...
@@ -1124,39 +1125,41 @@ class StreamingListener : public EmptyTestEventListener {
socket_writer_
->
CloseConnection
();
}
void
OnTestIterationStart
(
const
UnitTest
&
/* unit_test */
,
int
iteration
)
{
void
OnTestIterationStart
(
const
UnitTest
&
/* unit_test */
,
int
iteration
)
override
{
SendLn
(
"event=TestIterationStart&iteration="
+
StreamableToString
(
iteration
));
}
void
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
/* iteration */
)
{
void
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
/* iteration */
)
override
{
SendLn
(
"event=TestIterationEnd&passed="
+
FormatBool
(
unit_test
.
Passed
())
+
"&elapsed_time="
+
StreamableToString
(
unit_test
.
elapsed_time
())
+
"ms"
);
}
void
OnTestCaseStart
(
const
TestCase
&
test_case
)
{
void
OnTestCaseStart
(
const
TestCase
&
test_case
)
override
{
SendLn
(
std
::
string
(
"event=TestCaseStart&name="
)
+
test_case
.
name
());
}
void
OnTestCaseEnd
(
const
TestCase
&
test_case
)
{
void
OnTestCaseEnd
(
const
TestCase
&
test_case
)
override
{
SendLn
(
"event=TestCaseEnd&passed="
+
FormatBool
(
test_case
.
Passed
())
+
"&elapsed_time="
+
StreamableToString
(
test_case
.
elapsed_time
())
+
"ms"
);
}
void
OnTestStart
(
const
TestInfo
&
test_info
)
{
void
OnTestStart
(
const
TestInfo
&
test_info
)
override
{
SendLn
(
std
::
string
(
"event=TestStart&name="
)
+
test_info
.
name
());
}
void
OnTestEnd
(
const
TestInfo
&
test_info
)
{
void
OnTestEnd
(
const
TestInfo
&
test_info
)
override
{
SendLn
(
"event=TestEnd&passed="
+
FormatBool
((
test_info
.
result
())
->
Passed
())
+
"&elapsed_time="
+
StreamableToString
((
test_info
.
result
())
->
elapsed_time
())
+
"ms"
);
}
void
OnTestPartResult
(
const
TestPartResult
&
test_part_result
)
{
void
OnTestPartResult
(
const
TestPartResult
&
test_part_result
)
override
{
const
char
*
file_name
=
test_part_result
.
file_name
();
if
(
file_name
==
nullptr
)
file_name
=
""
;
SendLn
(
"event=TestPartResult&file="
+
UrlEncode
(
file_name
)
+
...
...
@@ -1174,7 +1177,7 @@ class StreamingListener : public EmptyTestEventListener {
std
::
string
FormatBool
(
bool
value
)
{
return
value
?
"1"
:
"0"
;
}
const
s
coped
_ptr
<
AbstractSocketWriter
>
socket_writer_
;
const
s
td
::
unique
_ptr
<
AbstractSocketWriter
>
socket_writer_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
StreamingListener
);
};
// class StreamingListener
...
...
googletest/src/gtest-matchers.cc
0 → 100644
View file @
25905b9f
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// The Google C++ Testing and Mocking Framework (Google Test)
//
// This file implements just enough of the matcher interface to allow
// EXPECT_DEATH and friends to accept a matcher argument.
#include "gtest/internal/gtest-internal.h"
#include "gtest/internal/gtest-port.h"
#include "gtest/gtest-matchers.h"
#include <string>
namespace
testing
{
// Constructs a matcher that matches a const std::string& whose value is
// equal to s.
Matcher
<
const
std
::
string
&>::
Matcher
(
const
std
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
#if GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a const std::string& whose value is
// equal to s.
Matcher
<
const
std
::
string
&>::
Matcher
(
const
::
string
&
s
)
{
*
this
=
Eq
(
static_cast
<
std
::
string
>
(
s
));
}
#endif // GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a const std::string& whose value is
// equal to s.
Matcher
<
const
std
::
string
&>::
Matcher
(
const
char
*
s
)
{
*
this
=
Eq
(
std
::
string
(
s
));
}
// Constructs a matcher that matches a std::string whose value is equal to
// s.
Matcher
<
std
::
string
>::
Matcher
(
const
std
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
#if GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a std::string whose value is equal to
// s.
Matcher
<
std
::
string
>::
Matcher
(
const
::
string
&
s
)
{
*
this
=
Eq
(
static_cast
<
std
::
string
>
(
s
));
}
#endif // GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a std::string whose value is equal to
// s.
Matcher
<
std
::
string
>::
Matcher
(
const
char
*
s
)
{
*
this
=
Eq
(
std
::
string
(
s
));
}
#if GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a const ::string& whose value is
// equal to s.
Matcher
<
const
::
string
&>::
Matcher
(
const
std
::
string
&
s
)
{
*
this
=
Eq
(
static_cast
<::
string
>
(
s
));
}
// Constructs a matcher that matches a const ::string& whose value is
// equal to s.
Matcher
<
const
::
string
&>::
Matcher
(
const
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
// Constructs a matcher that matches a const ::string& whose value is
// equal to s.
Matcher
<
const
::
string
&>::
Matcher
(
const
char
*
s
)
{
*
this
=
Eq
(
::
string
(
s
));
}
// Constructs a matcher that matches a ::string whose value is equal to s.
Matcher
<::
string
>::
Matcher
(
const
std
::
string
&
s
)
{
*
this
=
Eq
(
static_cast
<::
string
>
(
s
));
}
// Constructs a matcher that matches a ::string whose value is equal to s.
Matcher
<::
string
>::
Matcher
(
const
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
// Constructs a matcher that matches a string whose value is equal to s.
Matcher
<::
string
>::
Matcher
(
const
char
*
s
)
{
*
this
=
Eq
(
::
string
(
s
));
}
#endif // GTEST_HAS_GLOBAL_STRING
#if GTEST_HAS_ABSL
// Constructs a matcher that matches a const absl::string_view& whose value is
// equal to s.
Matcher
<
const
absl
::
string_view
&>::
Matcher
(
const
std
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
#if GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a const absl::string_view& whose value is
// equal to s.
Matcher
<
const
absl
::
string_view
&>::
Matcher
(
const
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
#endif // GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a const absl::string_view& whose value is
// equal to s.
Matcher
<
const
absl
::
string_view
&>::
Matcher
(
const
char
*
s
)
{
*
this
=
Eq
(
std
::
string
(
s
));
}
// Constructs a matcher that matches a const absl::string_view& whose value is
// equal to s.
Matcher
<
const
absl
::
string_view
&>::
Matcher
(
absl
::
string_view
s
)
{
*
this
=
Eq
(
std
::
string
(
s
));
}
// Constructs a matcher that matches a absl::string_view whose value is equal to
// s.
Matcher
<
absl
::
string_view
>::
Matcher
(
const
std
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
#if GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a absl::string_view whose value is equal to
// s.
Matcher
<
absl
::
string_view
>::
Matcher
(
const
::
string
&
s
)
{
*
this
=
Eq
(
s
);
}
#endif // GTEST_HAS_GLOBAL_STRING
// Constructs a matcher that matches a absl::string_view whose value is equal to
// s.
Matcher
<
absl
::
string_view
>::
Matcher
(
const
char
*
s
)
{
*
this
=
Eq
(
std
::
string
(
s
));
}
// Constructs a matcher that matches a absl::string_view whose value is equal to
// s.
Matcher
<
absl
::
string_view
>::
Matcher
(
absl
::
string_view
s
)
{
*
this
=
Eq
(
std
::
string
(
s
));
}
#endif // GTEST_HAS_ABSL
}
// namespace testing
googletest/src/gtest-port.cc
View file @
25905b9f
...
...
@@ -31,16 +31,20 @@
#include "gtest/internal/gtest-port.h"
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <memory>
#if GTEST_OS_WINDOWS
# include <windows.h>
# include <io.h>
# include <sys/stat.h>
# include <map> // Used in ThreadLocal.
# ifdef _MSC_VER
# include <crtdbg.h>
# endif // _MSC_VER
#else
# include <unistd.h>
#endif // GTEST_OS_WINDOWS
...
...
@@ -138,7 +142,7 @@ size_t GetThreadCount() {
}
procfs_info
process_info
;
const
int
status
=
devctl
(
fd
,
DCMD_PROC_INFO
,
&
process_info
,
sizeof
(
process_info
),
NULL
);
devctl
(
fd
,
DCMD_PROC_INFO
,
&
process_info
,
sizeof
(
process_info
),
nullptr
);
close
(
fd
);
if
(
status
==
EOK
)
{
return
static_cast
<
size_t
>
(
process_info
.
num_threads
);
...
...
@@ -152,7 +156,7 @@ size_t GetThreadCount() {
size_t
GetThreadCount
()
{
struct
procentry64
entry
;
pid_t
pid
=
getpid
();
int
status
=
getprocs64
(
&
entry
,
sizeof
(
entry
),
NULL
,
0
,
&
pid
,
1
);
int
status
=
getprocs64
(
&
entry
,
sizeof
(
entry
),
nullptr
,
0
,
&
pid
,
1
);
if
(
status
==
1
)
{
return
entry
.
pi_thcount
;
}
else
{
...
...
@@ -230,15 +234,15 @@ void AutoHandle::Reset(HANDLE handle) {
bool
AutoHandle
::
IsCloseable
()
const
{
// Different Windows APIs may use either of these values to represent an
// invalid handle.
return
handle_
!=
NULL
&&
handle_
!=
INVALID_HANDLE_VALUE
;
return
handle_
!=
nullptr
&&
handle_
!=
INVALID_HANDLE_VALUE
;
}
Notification
::
Notification
()
:
event_
(
::
CreateEvent
(
NULL
,
// Default security attributes.
:
event_
(
::
CreateEvent
(
nullptr
,
// Default security attributes.
TRUE
,
// Do not reset automatically.
FALSE
,
// Initially unset.
NULL
))
{
// Anonymous event.
GTEST_CHECK_
(
event_
.
Get
()
!=
NULL
);
nullptr
))
{
// Anonymous event.
GTEST_CHECK_
(
event_
.
Get
()
!=
nullptr
);
}
void
Notification
::
Notify
()
{
...
...
@@ -267,7 +271,7 @@ Mutex::~Mutex() {
if
(
type_
==
kDynamic
)
{
::
DeleteCriticalSection
(
critical_section_
);
delete
critical_section_
;
critical_section_
=
NULL
;
critical_section_
=
nullptr
;
}
}
...
...
@@ -386,15 +390,15 @@ class ThreadWithParamSupport : public ThreadWithParamBase {
DWORD
thread_id
;
// FIXME: Consider to use _beginthreadex instead.
HANDLE
thread_handle
=
::
CreateThread
(
NULL
,
// Default security.
nullptr
,
// Default security.
0
,
// Default stack size.
&
ThreadWithParamSupport
::
ThreadMain
,
param
,
// Parameter to ThreadMainStatic
0x0
,
// Default creation flags.
&
thread_id
);
// Need a valid pointer for the call to work under Win98.
GTEST_CHECK_
(
thread_handle
!=
NULL
)
<<
"CreateThread failed with error "
<<
::
GetLastError
()
<<
"."
;
if
(
thread_handle
==
NULL
)
{
GTEST_CHECK_
(
thread_handle
!=
nullptr
)
<<
"CreateThread failed with error "
<<
::
GetLastError
()
<<
"."
;
if
(
thread_handle
==
nullptr
)
{
delete
param
;
}
return
thread_handle
;
...
...
@@ -406,15 +410,15 @@ class ThreadWithParamSupport : public ThreadWithParamBase {
:
runnable_
(
runnable
),
thread_can_start_
(
thread_can_start
)
{
}
s
coped
_ptr
<
Runnable
>
runnable_
;
s
td
::
unique
_ptr
<
Runnable
>
runnable_
;
// Does not own.
Notification
*
thread_can_start_
;
};
static
DWORD
WINAPI
ThreadMain
(
void
*
ptr
)
{
// Transfers ownership.
s
coped
_ptr
<
ThreadMainParam
>
param
(
static_cast
<
ThreadMainParam
*>
(
ptr
));
if
(
param
->
thread_can_start_
!=
NULL
)
s
td
::
unique
_ptr
<
ThreadMainParam
>
param
(
static_cast
<
ThreadMainParam
*>
(
ptr
));
if
(
param
->
thread_can_start_
!=
nullptr
)
param
->
thread_can_start_
->
WaitForNotification
();
param
->
runnable_
->
Run
();
return
0
;
...
...
@@ -472,7 +476,7 @@ class ThreadLocalRegistryImpl {
thread_local_values
.
insert
(
std
::
make_pair
(
thread_local_instance
,
link
ed_ptr
<
ThreadLocalValueHolderBase
>
(
std
::
shar
ed_ptr
<
ThreadLocalValueHolderBase
>
(
thread_local_instance
->
NewValueForCurrentThread
())))
.
first
;
}
...
...
@@ -481,7 +485,7 @@ class ThreadLocalRegistryImpl {
static
void
OnThreadLocalDestroyed
(
const
ThreadLocalBase
*
thread_local_instance
)
{
std
::
vector
<
link
ed_ptr
<
ThreadLocalValueHolderBase
>
>
value_holders
;
std
::
vector
<
std
::
shar
ed_ptr
<
ThreadLocalValueHolderBase
>
>
value_holders
;
// Clean up the ThreadLocalValues data structure while holding the lock, but
// defer the destruction of the ThreadLocalValueHolderBases.
{
...
...
@@ -509,7 +513,7 @@ class ThreadLocalRegistryImpl {
static
void
OnThreadExit
(
DWORD
thread_id
)
{
GTEST_CHECK_
(
thread_id
!=
0
)
<<
::
GetLastError
();
std
::
vector
<
link
ed_ptr
<
ThreadLocalValueHolderBase
>
>
value_holders
;
std
::
vector
<
std
::
shar
ed_ptr
<
ThreadLocalValueHolderBase
>
>
value_holders
;
// Clean up the ThreadIdToThreadLocals data structure while holding the
// lock, but defer the destruction of the ThreadLocalValueHolderBases.
{
...
...
@@ -536,7 +540,8 @@ class ThreadLocalRegistryImpl {
private:
// In a particular thread, maps a ThreadLocal object to its value.
typedef
std
::
map
<
const
ThreadLocalBase
*
,
linked_ptr
<
ThreadLocalValueHolderBase
>
>
ThreadLocalValues
;
std
::
shared_ptr
<
ThreadLocalValueHolderBase
>
>
ThreadLocalValues
;
// Stores all ThreadIdToThreadLocals having values in a thread, indexed by
// thread's ID.
typedef
std
::
map
<
DWORD
,
ThreadLocalValues
>
ThreadIdToThreadLocals
;
...
...
@@ -551,18 +556,17 @@ class ThreadLocalRegistryImpl {
HANDLE
thread
=
::
OpenThread
(
SYNCHRONIZE
|
THREAD_QUERY_INFORMATION
,
FALSE
,
thread_id
);
GTEST_CHECK_
(
thread
!=
NULL
);
GTEST_CHECK_
(
thread
!=
nullptr
);
// We need to pass a valid thread ID pointer into CreateThread for it
// to work correctly under Win98.
DWORD
watcher_thread_id
;
HANDLE
watcher_thread
=
::
CreateThread
(
NULL
,
// Default security.
nullptr
,
// Default security.
0
,
// Default stack size
&
ThreadLocalRegistryImpl
::
WatcherThreadFunc
,
reinterpret_cast
<
LPVOID
>
(
new
ThreadIdAndHandle
(
thread_id
,
thread
)),
CREATE_SUSPENDED
,
&
watcher_thread_id
);
GTEST_CHECK_
(
watcher_thread
!=
NULL
);
CREATE_SUSPENDED
,
&
watcher_thread_id
);
GTEST_CHECK_
(
watcher_thread
!=
nullptr
);
// Give the watcher thread the same priority as ours to avoid being
// blocked by it.
::
SetThreadPriority
(
watcher_thread
,
...
...
@@ -682,7 +686,7 @@ void RE::Init(const char* regex) {
// Returns true iff ch appears anywhere in str (excluding the
// terminating '\0' character).
bool
IsInSet
(
char
ch
,
const
char
*
str
)
{
return
ch
!=
'\0'
&&
strchr
(
str
,
ch
)
!=
NULL
;
return
ch
!=
'\0'
&&
strchr
(
str
,
ch
)
!=
nullptr
;
}
// Returns true iff ch belongs to the given classification. Unlike
...
...
@@ -736,7 +740,7 @@ static std::string FormatRegexSyntaxError(const char* regex, int index) {
// Generates non-fatal failures and returns false if regex is invalid;
// otherwise returns true.
bool
ValidateRegex
(
const
char
*
regex
)
{
if
(
regex
==
NULL
)
{
if
(
regex
==
nullptr
)
{
// FIXME: fix the source file location in the
// assertion failures to match where the regex is used in user
// code.
...
...
@@ -862,8 +866,7 @@ bool MatchRegexAtHead(const char* regex, const char* str) {
// exponential with respect to the regex length + the string length,
// but usually it's must faster (often close to linear).
bool
MatchRegexAnywhere
(
const
char
*
regex
,
const
char
*
str
)
{
if
(
regex
==
NULL
||
str
==
NULL
)
return
false
;
if
(
regex
==
nullptr
||
str
==
nullptr
)
return
false
;
if
(
*
regex
==
'^'
)
return
MatchRegexAtHead
(
regex
+
1
,
str
);
...
...
@@ -896,8 +899,8 @@ bool RE::PartialMatch(const char* str, const RE& re) {
// Initializes an RE from its string representation.
void
RE
::
Init
(
const
char
*
regex
)
{
pattern_
=
full_pattern_
=
NULL
;
if
(
regex
!=
NULL
)
{
pattern_
=
full_pattern_
=
nullptr
;
if
(
regex
!=
nullptr
)
{
pattern_
=
posix
::
StrDup
(
regex
);
}
...
...
@@ -1254,8 +1257,8 @@ bool BoolFromGTestEnv(const char* flag, bool default_value) {
#else
const
std
::
string
env_var
=
FlagToEnvVar
(
flag
);
const
char
*
const
string_value
=
posix
::
GetEnv
(
env_var
.
c_str
());
return
string_value
==
NULL
?
default_value
:
strcmp
(
string_value
,
"0"
)
!=
0
;
return
string_value
==
nullptr
?
default_value
:
strcmp
(
string_value
,
"0"
)
!=
0
;
#endif // defined(GTEST_GET_BOOL_FROM_ENV_)
}
...
...
@@ -1268,7 +1271,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
#else
const
std
::
string
env_var
=
FlagToEnvVar
(
flag
);
const
char
*
const
string_value
=
posix
::
GetEnv
(
env_var
.
c_str
());
if
(
string_value
==
NULL
)
{
if
(
string_value
==
nullptr
)
{
// The environment variable is not set.
return
default_value
;
}
...
...
@@ -1311,7 +1314,7 @@ const char* StringFromGTestEnv(const char* flag, const char* default_value) {
#else
const
std
::
string
env_var
=
FlagToEnvVar
(
flag
);
const
char
*
const
value
=
posix
::
GetEnv
(
env_var
.
c_str
());
return
value
==
NULL
?
default_value
:
value
;
return
value
==
nullptr
?
default_value
:
value
;
#endif // defined(GTEST_GET_STRING_FROM_ENV_)
}
...
...
Prev
1
2
3
4
5
6
7
8
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment