43 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 44 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 265 # include <sys/types.h> 266 # include <sys/stat.h> 267 #endif // !_WIN32_WCE 269 #if defined __APPLE__ 270 # include <AvailabilityMacros.h> 271 # include <TargetConditionals.h> 280 #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" 281 #define GTEST_FLAG_PREFIX_ "gtest_" 282 #define GTEST_FLAG_PREFIX_DASH_ "gtest-" 283 #define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" 284 #define GTEST_NAME_ "Google Test" 285 #define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" 290 # define GTEST_GCC_VER_ \ 291 (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) 296 # define GTEST_OS_CYGWIN 1 297 #elif defined __SYMBIAN32__ 298 # define GTEST_OS_SYMBIAN 1 300 # define GTEST_OS_WINDOWS 1 302 # define GTEST_OS_WINDOWS_MOBILE 1 303 # elif defined(__MINGW__) || defined(__MINGW32__) 304 # define GTEST_OS_WINDOWS_MINGW 1 305 # elif defined(WINAPI_FAMILY) 306 # include <winapifamily.h> 307 # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 308 # define GTEST_OS_WINDOWS_DESKTOP 1 309 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) 310 # define GTEST_OS_WINDOWS_PHONE 1 311 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) 312 # define GTEST_OS_WINDOWS_RT 1 316 # define GTEST_OS_WINDOWS_DESKTOP 1 319 # define GTEST_OS_WINDOWS_DESKTOP 1 320 # endif // _WIN32_WCE 321 #elif defined __APPLE__ 322 # define GTEST_OS_MAC 1 323 # if TARGET_OS_IPHONE 324 # define GTEST_OS_IOS 1 326 #elif defined __FreeBSD__ 327 # define GTEST_OS_FREEBSD 1 328 #elif defined __linux__ 329 # define GTEST_OS_LINUX 1 330 # if defined __ANDROID__ 331 # define GTEST_OS_LINUX_ANDROID 1 333 #elif defined __MVS__ 334 # define GTEST_OS_ZOS 1 335 #elif defined(__sun) && defined(__SVR4) 336 # define GTEST_OS_SOLARIS 1 338 # define GTEST_OS_AIX 1 339 #elif defined(__hpux) 340 # define GTEST_OS_HPUX 1 341 #elif defined __native_client__ 342 # define GTEST_OS_NACL 1 343 #elif defined __OpenBSD__ 344 # define GTEST_OS_OPENBSD 1 345 #elif defined __QNX__ 346 # define GTEST_OS_QNX 1 355 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \ 356 __pragma(warning(push)) \ 357 __pragma(warning(disable: warnings)) 358 # define GTEST_DISABLE_MSC_WARNINGS_POP_() \ 359 __pragma(warning(pop)) 362 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) 363 # define GTEST_DISABLE_MSC_WARNINGS_POP_() 366 #ifndef GTEST_LANG_CXX11 371 # if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L 373 # define GTEST_LANG_CXX11 1 375 # define GTEST_LANG_CXX11 0 388 #if GTEST_LANG_CXX11 && \ 389 (!defined(__GLIBCXX__) || ( \ 390 __GLIBCXX__ >= 20110325ul && \ 392 __GLIBCXX__ != 20110416ul && \ 393 __GLIBCXX__ != 20120313ul && \ 394 __GLIBCXX__ != 20110428ul && \ 395 __GLIBCXX__ != 20120702ul)) 396 # define GTEST_STDLIB_CXX11 1 400 #if GTEST_STDLIB_CXX11 401 # define GTEST_HAS_STD_BEGIN_AND_END_ 1 402 # define GTEST_HAS_STD_FORWARD_LIST_ 1 403 # define GTEST_HAS_STD_FUNCTION_ 1 404 # define GTEST_HAS_STD_INITIALIZER_LIST_ 1 405 # define GTEST_HAS_STD_MOVE_ 1 406 # define GTEST_HAS_STD_UNIQUE_PTR_ 1 412 # define GTEST_HAS_STD_TUPLE_ 1 413 # if defined(__clang__) 415 # if defined(__has_include) && !__has_include(<tuple>) 416 # undef GTEST_HAS_STD_TUPLE_ 418 # elif defined(_MSC_VER) 420 # if defined(_CPPLIB_VER) && _CPPLIB_VER < 520 421 # undef GTEST_HAS_STD_TUPLE_ 423 # elif defined(__GLIBCXX__) 427 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) 428 # undef GTEST_HAS_STD_TUPLE_ 437 # if !GTEST_OS_WINDOWS_MOBILE 445 struct _RTL_CRITICAL_SECTION;
451 # include <strings.h> 452 #endif // GTEST_OS_WINDOWS 454 #if GTEST_OS_LINUX_ANDROID 456 # include <android/api-level.h> 460 #ifndef GTEST_HAS_POSIX_RE 461 # if GTEST_OS_LINUX_ANDROID 463 # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) 465 # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) 469 #if GTEST_HAS_POSIX_RE 477 # define GTEST_USES_POSIX_RE 1 479 #elif GTEST_OS_WINDOWS 483 # define GTEST_USES_SIMPLE_RE 1 489 # define GTEST_USES_SIMPLE_RE 1 491 #endif // GTEST_HAS_POSIX_RE 493 #ifndef GTEST_HAS_EXCEPTIONS 496 # if defined(_MSC_VER) || defined(__BORLANDC__) 500 # ifndef _HAS_EXCEPTIONS 501 # define _HAS_EXCEPTIONS 1 502 # endif // _HAS_EXCEPTIONS 503 # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS 504 # elif defined(__clang__) 512 # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions)) 513 # elif defined(__GNUC__) && __EXCEPTIONS 515 # define GTEST_HAS_EXCEPTIONS 1 516 # elif defined(__SUNPRO_CC) 520 # define GTEST_HAS_EXCEPTIONS 1 521 # elif defined(__IBMCPP__) && __EXCEPTIONS 523 # define GTEST_HAS_EXCEPTIONS 1 524 # elif defined(__HP_aCC) 527 # define GTEST_HAS_EXCEPTIONS 1 531 # define GTEST_HAS_EXCEPTIONS 0 532 # endif // defined(_MSC_VER) || defined(__BORLANDC__) 533 #endif // GTEST_HAS_EXCEPTIONS 535 #if !defined(GTEST_HAS_STD_STRING) 538 # define GTEST_HAS_STD_STRING 1 539 #elif !GTEST_HAS_STD_STRING 541 # error "Google Test cannot be used where ::std::string isn't available." 542 #endif // !defined(GTEST_HAS_STD_STRING) 544 #ifndef GTEST_HAS_GLOBAL_STRING 548 # define GTEST_HAS_GLOBAL_STRING 0 550 #endif // GTEST_HAS_GLOBAL_STRING 552 #ifndef GTEST_HAS_STD_WSTRING 561 # define GTEST_HAS_STD_WSTRING \ 562 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) 564 #endif // GTEST_HAS_STD_WSTRING 566 #ifndef GTEST_HAS_GLOBAL_WSTRING 569 # define GTEST_HAS_GLOBAL_WSTRING \ 570 (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) 571 #endif // GTEST_HAS_GLOBAL_WSTRING 574 #ifndef GTEST_HAS_RTTI 580 # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. 581 # define GTEST_HAS_RTTI 1 583 # define GTEST_HAS_RTTI 0 587 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) 594 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ 595 !defined(__EXCEPTIONS) 596 # define GTEST_HAS_RTTI 0 598 # define GTEST_HAS_RTTI 1 599 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS 601 # define GTEST_HAS_RTTI 0 602 # endif // __GXX_RTTI 607 # elif defined(__clang__) 609 # define GTEST_HAS_RTTI __has_feature(cxx_rtti) 613 # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) 616 # define GTEST_HAS_RTTI 1 618 # define GTEST_HAS_RTTI 0 624 # define GTEST_HAS_RTTI 1 628 #endif // GTEST_HAS_RTTI 637 #ifndef GTEST_HAS_PTHREAD 643 # define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \ 644 || GTEST_OS_QNX || GTEST_OS_FREEBSD || GTEST_OS_NACL) 645 #endif // GTEST_HAS_PTHREAD 647 #if GTEST_HAS_PTHREAD 650 # include <pthread.h> 659 #ifndef GTEST_HAS_TR1_TUPLE 660 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) 662 # define GTEST_HAS_TR1_TUPLE 0 665 # define GTEST_HAS_TR1_TUPLE 1 667 #endif // GTEST_HAS_TR1_TUPLE 671 #ifndef GTEST_USE_OWN_TR1_TUPLE 684 # if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \ 685 && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600 686 # define GTEST_ENV_HAS_TR1_TUPLE_ 1 692 # if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325) 693 # define GTEST_ENV_HAS_STD_TUPLE_ 1 696 # if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_ 697 # define GTEST_USE_OWN_TR1_TUPLE 0 699 # define GTEST_USE_OWN_TR1_TUPLE 1 702 #endif // GTEST_USE_OWN_TR1_TUPLE 707 #if GTEST_HAS_STD_TUPLE_ 709 # define GTEST_TUPLE_NAMESPACE_ ::std 710 #endif // GTEST_HAS_STD_TUPLE_ 714 #if GTEST_HAS_TR1_TUPLE 715 # ifndef GTEST_TUPLE_NAMESPACE_ 716 # define GTEST_TUPLE_NAMESPACE_ ::std::tr1 717 # endif // GTEST_TUPLE_NAMESPACE_ 719 # if GTEST_USE_OWN_TR1_TUPLE 721 # elif GTEST_ENV_HAS_STD_TUPLE_ 732 using ::std::tuple_element;
733 using ::std::tuple_size;
737 # elif GTEST_OS_SYMBIAN 744 # ifdef BOOST_HAS_TR1_TUPLE 745 # undef BOOST_HAS_TR1_TUPLE 746 # endif // BOOST_HAS_TR1_TUPLE 750 # define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED 753 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) 757 # if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 763 # define _TR1_FUNCTIONAL 1 764 # include <tr1/tuple> 765 # undef _TR1_FUNCTIONAL // Allows the user to #include 768 # include <tr1/tuple> 769 # endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 775 # endif // GTEST_USE_OWN_TR1_TUPLE 777 #endif // GTEST_HAS_TR1_TUPLE 783 #ifndef GTEST_HAS_CLONE 786 # if GTEST_OS_LINUX && !defined(__ia64__) 787 # if GTEST_OS_LINUX_ANDROID 789 # if defined(__arm__) && __ANDROID_API__ >= 9 790 # define GTEST_HAS_CLONE 1 792 # define GTEST_HAS_CLONE 0 795 # define GTEST_HAS_CLONE 1 798 # define GTEST_HAS_CLONE 0 799 # endif // GTEST_OS_LINUX && !defined(__ia64__) 801 #endif // GTEST_HAS_CLONE 805 #ifndef GTEST_HAS_STREAM_REDIRECTION 808 # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \ 809 GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT 810 # define GTEST_HAS_STREAM_REDIRECTION 0 812 # define GTEST_HAS_STREAM_REDIRECTION 1 813 # endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN 814 #endif // GTEST_HAS_STREAM_REDIRECTION 820 #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ 821 (GTEST_OS_MAC && !GTEST_OS_IOS) || \ 822 (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ 823 GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \ 824 GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD) 825 # define GTEST_HAS_DEATH_TEST 1 832 #define GTEST_HAS_PARAM_TEST 1 838 #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ 839 defined(__IBMCPP__) || defined(__HP_aCC) 840 # define GTEST_HAS_TYPED_TEST 1 841 # define GTEST_HAS_TYPED_TEST_P 1 848 #if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) 849 # define GTEST_HAS_COMBINE 1 853 #define GTEST_WIDE_STRING_USES_UTF16_ \ 854 (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) 858 # define GTEST_CAN_STREAM_RESULTS_ 1 871 #ifdef __INTEL_COMPILER 872 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ 874 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT 888 #if defined(__GNUC__) && !defined(COMPILER_ICC) 889 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 890 #elif defined(__clang__) 891 # if __has_attribute(unused) 892 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 895 #ifndef GTEST_ATTRIBUTE_UNUSED_ 896 # define GTEST_ATTRIBUTE_UNUSED_ 901 #define GTEST_DISALLOW_ASSIGN_(type)\ 902 void operator=(type const &) 906 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ 908 GTEST_DISALLOW_ASSIGN_(type) 915 #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) 916 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) 918 # define GTEST_MUST_USE_RESULT_ 919 #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC 929 # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \ 930 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127) 931 # define GTEST_INTENTIONAL_CONST_COND_POP_() \ 932 GTEST_DISABLE_MSC_WARNINGS_POP_() 937 #ifndef GTEST_HAS_SEH 940 # if defined(_MSC_VER) || defined(__BORLANDC__) 942 # define GTEST_HAS_SEH 1 945 # define GTEST_HAS_SEH 0 948 #define GTEST_IS_THREADSAFE \ 950 || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \ 951 || GTEST_HAS_PTHREAD) 953 #endif // GTEST_HAS_SEH 957 # if GTEST_LINKED_AS_SHARED_LIBRARY 958 # define GTEST_API_ __declspec(dllimport) 959 # elif GTEST_CREATE_SHARED_LIBRARY 960 # define GTEST_API_ __declspec(dllexport) 971 # define GTEST_NO_INLINE_ __attribute__((noinline)) 973 # define GTEST_NO_INLINE_ 977 #if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION) 978 # define GTEST_HAS_CXXABI_H_ 1 980 # define GTEST_HAS_CXXABI_H_ 0 985 #if defined(__clang__) 986 # if __has_feature(memory_sanitizer) 987 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \ 988 __attribute__((no_sanitize_memory)) 990 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ 991 # endif // __has_feature(memory_sanitizer) 993 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ 997 #if defined(__clang__) 998 # if __has_feature(address_sanitizer) 999 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ 1000 __attribute__((no_sanitize_address)) 1002 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ 1003 # endif // __has_feature(address_sanitizer) 1005 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ 1009 #if defined(__clang__) 1010 # if __has_feature(thread_sanitizer) 1011 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \ 1012 __attribute__((no_sanitize_thread)) 1014 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ 1015 # endif // __has_feature(thread_sanitizer) 1017 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ 1024 #if defined(GTEST_TUPLE_NAMESPACE_) 1028 using GTEST_TUPLE_NAMESPACE_::get;
1030 using GTEST_TUPLE_NAMESPACE_::tuple;
1031 using GTEST_TUPLE_NAMESPACE_::tuple_size;
1032 using GTEST_TUPLE_NAMESPACE_::tuple_element;
1033 #endif // defined(GTEST_TUPLE_NAMESPACE_) 1035 namespace internal {
1057 #if GTEST_LANG_CXX11 1058 # define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) 1059 #else // !GTEST_LANG_CXX11 1064 # define GTEST_COMPILE_ASSERT_(expr, msg) \ 1065 typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \ 1066 msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_ 1067 #endif // !GTEST_LANG_CXX11 1115 template <
typename T1,
typename T2>
1118 template <
typename T>
1124 #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0])) 1126 #if GTEST_HAS_GLOBAL_STRING 1130 #endif // GTEST_HAS_GLOBAL_STRING 1132 #if GTEST_HAS_GLOBAL_WSTRING 1134 #elif GTEST_HAS_STD_WSTRING 1136 #endif // GTEST_HAS_GLOBAL_WSTRING 1146 template <
typename T>
1156 T*
get()
const {
return ptr_; }
1159 T*
const ptr = ptr_;
1166 if (
IsTrue(
sizeof(T) > 0)) {
1197 #if GTEST_HAS_GLOBAL_STRING 1201 #endif // GTEST_HAS_GLOBAL_STRING 1203 RE(
const char* regex) { Init(regex); }
1217 return FullMatch(str.c_str(), re);
1220 return PartialMatch(str.c_str(), re);
1223 #if GTEST_HAS_GLOBAL_STRING 1226 return FullMatch(str.c_str(), re);
1229 return PartialMatch(str.c_str(), re);
1232 #endif // GTEST_HAS_GLOBAL_STRING 1234 static bool FullMatch(
const char* str,
const RE& re);
1235 static bool PartialMatch(
const char* str,
const RE& re);
1238 void Init(
const char* regex);
1246 #if GTEST_USES_POSIX_RE 1251 #else // GTEST_USES_SIMPLE_RE 1253 const char* full_pattern_;
1301 #define GTEST_LOG_(severity) \ 1302 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ 1303 __FILE__, __LINE__).GetStream() 1322 #define GTEST_CHECK_(condition) \ 1323 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1324 if (::testing::internal::IsTrue(condition)) \ 1327 GTEST_LOG_(FATAL) << "Condition " #condition " failed. " 1334 #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ 1335 if (const int gtest_error = (posix_call)) \ 1336 GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ 1339 #if GTEST_HAS_STD_MOVE_ 1341 #else // GTEST_HAS_STD_MOVE_ 1342 template <
typename T>
1346 #endif // GTEST_HAS_STD_MOVE_ 1368 template<
typename To>
1392 template<
typename To,
typename From>
1402 ::testing::internal::ImplicitCast_<From*>(to);
1407 GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
1409 return static_cast<To>(f);
1417 template <
class Derived,
class Base>
1427 #if GTEST_HAS_STREAM_REDIRECTION 1440 #endif // GTEST_HAS_STREAM_REDIRECTION 1443 #if GTEST_HAS_DEATH_TEST 1445 const ::std::vector<testing::internal::string>& GetInjectableArgvs();
1446 void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
1450 extern ::std::vector<testing::internal::string> g_argvs;
1452 #endif // GTEST_HAS_DEATH_TEST 1455 #if GTEST_IS_THREADSAFE 1456 # if GTEST_HAS_PTHREAD 1460 inline void SleepMilliseconds(
int n) {
1461 const timespec time = {
1465 nanosleep(&time, NULL);
1467 # endif // GTEST_HAS_PTHREAD 1469 # if 0 // OS detection 1470 # elif GTEST_HAS_PTHREAD 1483 pthread_mutex_destroy(&mutex_);
1489 pthread_mutex_lock(&mutex_);
1491 pthread_mutex_unlock(&mutex_);
1496 void WaitForNotification() {
1498 pthread_mutex_lock(&mutex_);
1499 const bool notified = notified_;
1500 pthread_mutex_unlock(&mutex_);
1503 SleepMilliseconds(10);
1508 pthread_mutex_t mutex_;
1514 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 1527 typedef void* Handle;
1529 explicit AutoHandle(Handle handle);
1535 void Reset(Handle handle);
1539 bool IsCloseable()
const;
1556 void WaitForNotification();
1563 # endif // OS detection 1568 # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW 1575 class ThreadWithParamBase {
1577 virtual ~ThreadWithParamBase() {}
1578 virtual void Run() = 0;
1587 extern "C" inline void* ThreadFuncWithCLinkage(
void* thread) {
1588 static_cast<ThreadWithParamBase*
>(thread)->Run();
1604 template <
typename T>
1605 class ThreadWithParam :
public ThreadWithParamBase {
1607 typedef void UserThreadFunc(T);
1609 ThreadWithParam(UserThreadFunc* func, T
param, Notification* thread_can_start)
1612 thread_can_start_(thread_can_start),
1614 ThreadWithParamBase*
const base =
this;
1618 pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
1620 ~ThreadWithParam() { Join(); }
1629 virtual void Run() {
1630 if (thread_can_start_ != NULL)
1631 thread_can_start_->WaitForNotification();
1636 UserThreadFunc*
const func_;
1640 Notification*
const thread_can_start_;
1646 # endif // GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW 1648 # if 0 // OS detection 1649 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 1667 enum MutexType { kStatic = 0, kDynamic = 1 };
1671 enum StaticConstructorSelector { kStaticMutex = 0 };
1676 explicit Mutex(StaticConstructorSelector ) {}
1691 void ThreadSafeLazyInit();
1695 unsigned int owner_thread_id_;
1700 long critical_section_init_phase_;
1701 _RTL_CRITICAL_SECTION* critical_section_;
1706 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1707 extern ::testing::internal::Mutex mutex 1709 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 1710 ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) 1720 : mutex_(mutex) { mutex_->Lock(); }
1725 Mutex*
const mutex_;
1734 class ThreadLocalValueHolderBase {
1736 virtual ~ThreadLocalValueHolderBase() {}
1741 class ThreadLocalBase {
1747 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const = 0;
1750 ThreadLocalBase() {}
1751 virtual ~ThreadLocalBase() {}
1764 static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
1765 const ThreadLocalBase* thread_local_instance);
1768 static void OnThreadLocalDestroyed(
1769 const ThreadLocalBase* thread_local_instance);
1779 virtual ~Runnable() {}
1780 virtual void Run() = 0;
1783 ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
1784 virtual ~ThreadWithParamBase();
1791 template <
typename T>
1792 class ThreadWithParam :
public ThreadWithParamBase {
1794 typedef void UserThreadFunc(T);
1796 ThreadWithParam(UserThreadFunc* func, T
param, Notification* thread_can_start)
1797 : ThreadWithParamBase(
new RunnableImpl(func, param), thread_can_start) {
1799 virtual ~ThreadWithParam() {}
1802 class RunnableImpl :
public Runnable {
1804 RunnableImpl(UserThreadFunc* func, T param)
1808 virtual ~RunnableImpl() {}
1809 virtual void Run() {
1814 UserThreadFunc*
const func_;
1850 template <
typename T>
1856 ~
ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(
this); }
1858 T* pointer() {
return GetOrCreateValue(); }
1859 const T* pointer()
const {
return GetOrCreateValue(); }
1860 const T&
get()
const {
return *pointer(); }
1861 void set(
const T&
value) { *pointer() =
value; }
1866 class ValueHolder :
public ThreadLocalValueHolderBase {
1868 explicit ValueHolder(
const T& value) : value_(value) {}
1870 T* pointer() {
return &value_; }
1878 T* GetOrCreateValue()
const {
1879 return static_cast<ValueHolder*
>(
1880 ThreadLocalRegistry::GetValueOnCurrentThread(
this))->pointer();
1883 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const {
1884 return new ValueHolder(default_);
1892 # elif GTEST_HAS_PTHREAD 1900 owner_ = pthread_self();
1916 void AssertHeld()
const {
1917 GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
1918 <<
"The current thread is not holding the mutex @" <<
this;
1927 pthread_mutex_t mutex_;
1939 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1940 extern ::testing::internal::MutexBase mutex 1948 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 1949 ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false } 1953 class Mutex :
public MutexBase {
1975 : mutex_(mutex) { mutex_->Lock(); }
1980 MutexBase*
const mutex_;
1993 class ThreadLocalValueHolderBase {
1995 virtual ~ThreadLocalValueHolderBase() {}
2000 extern "C" inline void DeleteThreadLocalValue(
void* value_holder) {
2001 delete static_cast<ThreadLocalValueHolderBase*
>(value_holder);
2005 template <
typename T>
2015 DeleteThreadLocalValue(pthread_getspecific(key_));
2022 T* pointer() {
return GetOrCreateValue(); }
2023 const T* pointer()
const {
return GetOrCreateValue(); }
2024 const T&
get()
const {
return *pointer(); }
2025 void set(
const T&
value) { *pointer() =
value; }
2029 class ValueHolder :
public ThreadLocalValueHolderBase {
2031 explicit ValueHolder(
const T& value) : value_(value) {}
2033 T* pointer() {
return &value_; }
2040 static pthread_key_t CreateKey() {
2045 pthread_key_create(&key, &DeleteThreadLocalValue));
2049 T* GetOrCreateValue()
const {
2050 ThreadLocalValueHolderBase*
const holder =
2051 static_cast<ThreadLocalValueHolderBase*
>(pthread_getspecific(key_));
2052 if (holder != NULL) {
2053 return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
2056 ValueHolder*
const new_holder =
new ValueHolder(default_);
2057 ThreadLocalValueHolderBase*
const holder_base = new_holder;
2059 return new_holder->pointer();
2063 const pthread_key_t key_;
2069 # endif // OS detection 2071 #else // GTEST_IS_THREADSAFE 2086 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 2087 extern ::testing::internal::Mutex mutex 2089 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex 2103 template <
typename T>
2110 const T&
get()
const {
return value_; }
2116 #endif // GTEST_IS_THREADSAFE 2128 #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) 2131 # define GTEST_ELLIPSIS_NEEDS_POD_ 1 2133 # define GTEST_CAN_COMPARE_NULL 1 2140 #if defined(__SYMBIAN32__) || defined(__IBMCPP__) 2141 # define GTEST_NEEDS_IS_POINTER_ 1 2144 template <
bool bool_value>
2154 template <
typename T>
2157 template <
typename T>
2160 template <
typename Iterator>
2165 template <
typename T>
2170 template <
typename T>
2175 #if GTEST_OS_WINDOWS 2176 # define GTEST_PATH_SEP_ "\\" 2177 # define GTEST_HAS_ALT_PATH_SEP_ 1 2181 # define GTEST_PATH_SEP_ "/" 2182 # define GTEST_HAS_ALT_PATH_SEP_ 0 2184 #endif // GTEST_OS_WINDOWS 2194 return isalpha(static_cast<unsigned char>(ch)) != 0;
2197 return isalnum(static_cast<unsigned char>(ch)) != 0;
2200 return isdigit(static_cast<unsigned char>(ch)) != 0;
2203 return islower(static_cast<unsigned char>(ch)) != 0;
2206 return isspace(static_cast<unsigned char>(ch)) != 0;
2209 return isupper(static_cast<unsigned char>(ch)) != 0;
2212 return isxdigit(static_cast<unsigned char>(ch)) != 0;
2215 const unsigned char low_byte =
static_cast<unsigned char>(ch);
2216 return ch == low_byte && isxdigit(low_byte) != 0;
2220 return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
2223 return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
2227 std::string::iterator it = str.end();
2228 while (it != str.begin() &&
IsSpace(*--it))
2243 #if GTEST_OS_WINDOWS 2245 typedef struct _stat StatStruct;
2247 # ifdef __BORLANDC__ 2248 inline int IsATTY(
int fd) {
return isatty(fd); }
2249 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2250 return stricmp(s1, s2);
2252 inline char*
StrDup(
const char* src) {
return strdup(src); }
2253 # else // !__BORLANDC__ 2254 # if GTEST_OS_WINDOWS_MOBILE 2255 inline int IsATTY(
int ) {
return 0; }
2257 inline int IsATTY(
int fd) {
return _isatty(fd); }
2258 # endif // GTEST_OS_WINDOWS_MOBILE 2259 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2260 return _stricmp(s1, s2);
2262 inline char*
StrDup(
const char* src) {
return _strdup(src); }
2263 # endif // __BORLANDC__ 2265 # if GTEST_OS_WINDOWS_MOBILE 2266 inline int FileNo(FILE* file) {
return reinterpret_cast<int>(_fileno(file)); }
2270 inline int FileNo(FILE* file) {
return _fileno(file); }
2271 inline int Stat(
const char*
path, StatStruct*
buf) {
return _stat(path, buf); }
2272 inline int RmDir(
const char* dir) {
return _rmdir(dir); }
2273 inline bool IsDir(
const StatStruct& st) {
2274 return (_S_IFDIR & st.st_mode) != 0;
2276 # endif // GTEST_OS_WINDOWS_MOBILE 2283 inline int IsATTY(
int fd) {
return isatty(fd); }
2284 inline int Stat(
const char* path, StatStruct* buf) {
return stat(path, buf); }
2289 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2290 inline bool IsDir(
const StatStruct& st) {
return S_ISDIR(st.st_mode); }
2292 #endif // GTEST_OS_WINDOWS 2298 inline const
char*
StrNCpy(
char* dest, const
char* src,
size_t n) {
2299 return strncpy(dest, src, n);
2306 #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 2307 inline int ChDir(
const char* dir) {
return chdir(dir); }
2310 return fopen(path, mode);
2312 #if !GTEST_OS_WINDOWS_MOBILE 2313 inline FILE *
FReopen(
const char*
path,
const char* mode, FILE* stream) {
2314 return freopen(path, mode, stream);
2316 inline FILE*
FDOpen(
int fd,
const char* mode) {
return fdopen(fd, mode); }
2318 inline int FClose(FILE* fp) {
return fclose(fp); }
2319 #if !GTEST_OS_WINDOWS_MOBILE 2320 inline int Read(
int fd,
void*
buf,
unsigned int count) {
2321 return static_cast<int>(read(fd, buf, count));
2323 inline int Write(
int fd,
const void*
buf,
unsigned int count) {
2324 return static_cast<int>(write(fd, buf, count));
2326 inline int Close(
int fd) {
return close(fd); }
2327 inline const char*
StrError(
int errnum) {
return strerror(errnum); }
2330 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE | GTEST_OS_WINDOWS_RT 2332 static_cast<void>(
name);
2334 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) 2337 const char*
const env =
getenv(name);
2338 return (env != NULL && env[0] !=
'\0') ? env : NULL;
2346 #if GTEST_OS_WINDOWS_MOBILE 2353 #endif // GTEST_OS_WINDOWS_MOBILE 2362 #if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE 2364 # define GTEST_SNPRINTF_(buffer, size, format, ...) \ 2365 _snprintf_s(buffer, size, size, format, __VA_ARGS__) 2366 #elif defined(_MSC_VER) 2369 # define GTEST_SNPRINTF_ _snprintf 2371 # define GTEST_SNPRINTF_ snprintf 2402 template <
size_t size>
2426 #if GTEST_OS_WINDOWS 2427 typedef __int64
Int;
2428 typedef unsigned __int64
UInt;
2432 #endif // GTEST_OS_WINDOWS 2445 #define GTEST_FLAG(name) FLAGS_gtest_##name 2448 #define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) 2449 #define GTEST_DECLARE_int32_(name) \ 2450 GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) 2451 #define GTEST_DECLARE_string_(name) \ 2452 GTEST_API_ extern ::std::string GTEST_FLAG(name) 2455 #define GTEST_DEFINE_bool_(name, default_val, doc) \ 2456 GTEST_API_ bool GTEST_FLAG(name) = (default_val) 2457 #define GTEST_DEFINE_int32_(name, default_val, doc) \ 2458 GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) 2459 #define GTEST_DEFINE_string_(name, default_val, doc) \ 2460 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) 2463 #define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) 2464 #define GTEST_LOCK_EXCLUDED_(locks) 2483 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ FILE * FReopen(const char *path, const char *mode, FILE *stream)
GTEST_API_ Int32 Int32FromGTestEnv(const char *flag, Int32 default_val)
GTEST_API_ bool IsTrue(bool condition)
GTEST_API_ std::string GetCapturedStdout()
GTEST_API_ std::string GetCapturedStderr()
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val)
static bool FullMatch(const ::std::string &str, const RE &re)
Iterator::value_type value_type
static pthread_mutex_t mutex
int stat(const char *path, struct stat *buffer)
#define GTEST_INTENTIONAL_CONST_COND_PUSH_()
#define GTEST_DISABLE_MSC_WARNINGS_POP_()
const T * pointer() const
const char * StringFromGTestEnv(const char *flag, const char *default_val)
GTEST_API_::std::string FormatFileLocation(const char *file, int line)
bool_constant< bool_value > type
bool ParseInt32(const Message &src_text, const char *str, Int32 *value)
RE(const ::std::string ®ex)
UNITTEST_START char * ptr
GTEST_API_ size_t GetThreadCount()
int Stat(const char *path, StatStruct *buf)
int ChDir(const char *dir)
const char * GetEnv(const char *name)
GTEST_API_ void CaptureStdout()
TypeWithSize< 8 >::Int TimeInMillis
bool_constant< true > true_type
static bool PartialMatch(const ::std::string &str, const RE &re)
#define GTEST_DISALLOW_ASSIGN_(type)
bool_constant< false > false_type
TypeWithSize< 4 >::UInt UInt32
::std::ostream & GetStream()
TypeWithSize< 4 >::Int Int32
const GTestLogSeverity severity_
int RmDir(const char *dir)
#define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
#define GTEST_CHECK_(condition)
friend void swap(scoped_ptr &a, scoped_ptr &b)
ThreadLocal(const T &value)
int StrCaseCmp(const char *s1, const char *s2)
bool IsDir(const StatStruct &st)
#define GTEST_CHECK_POSIX_SUCCESS_(posix_call)
GTEST_API_::std::string FormatCompilerIndependentFileLocation(const char *file, int line)
const char * pattern() const
bool BoolFromGTestEnv(const char *flag, bool default_val)
FILE * FOpen(const char *path, const char *mode)
bool IsXDigit(wchar_t ch)
GTEST_API_ void CaptureStderr()
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)
const char * StrNCpy(char *dest, const char *src, size_t n)
TypeWithSize< 8 >::UInt UInt64
UNITTEST_START int * value
TypeWithSize< 8 >::Int Int64
void swap(scoped_ptr< T > &, scoped_ptr< T > &)
FILE * FDOpen(int fd, const char *mode)
const BiggestInt kMaxBiggestInt
char * StrDup(const char *src)
const char * StrError(int errnum)
Derived * CheckedDowncastToActualType(Base *base)
const T & move(const T &t)
std::string StripTrailingSpaces(std::string str)
#define GTEST_INTENTIONAL_CONST_COND_POP_()