43 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 44 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 253 #include <type_traits> 256 # include <sys/types.h> 257 # include <sys/stat.h> 258 #endif // !_WIN32_WCE 260 #if defined __APPLE__ 261 # include <AvailabilityMacros.h> 262 # include <TargetConditionals.h> 275 #include "gtest/internal/gtest-port-arch.h" 276 #include "gtest/internal/custom/gtest-port.h" 278 #if !defined(GTEST_DEV_EMAIL_) 279 # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" 280 # define GTEST_FLAG_PREFIX_ "gtest_" 281 # define GTEST_FLAG_PREFIX_DASH_ "gtest-" 282 # define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" 283 # define GTEST_NAME_ "Google Test" 284 # define GTEST_PROJECT_URL_ "https://github.com/google/googletest/" 285 #endif // !defined(GTEST_DEV_EMAIL_) 287 #if !defined(GTEST_INIT_GOOGLE_TEST_NAME_) 288 # define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest" 289 #endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_) 294 # define GTEST_GCC_VER_ \ 295 (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) 303 #if defined(_MSC_VER) 304 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \ 305 __pragma(warning(push)) \ 306 __pragma(warning(disable: warnings)) 307 # define GTEST_DISABLE_MSC_WARNINGS_POP_() \ 308 __pragma(warning(pop)) 311 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) 312 # define GTEST_DISABLE_MSC_WARNINGS_POP_() 318 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ 319 _Pragma("clang diagnostic push") \ 320 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ 321 _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"") 322 #define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ 323 _Pragma("clang diagnostic pop") 325 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ 326 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) 327 # define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ 328 GTEST_DISABLE_MSC_WARNINGS_POP_() 335 # if !GTEST_OS_WINDOWS_MOBILE 340 #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR) 343 typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
348 typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
355 # include <strings.h> 356 #endif // GTEST_OS_WINDOWS 358 #if GTEST_OS_LINUX_ANDROID 360 # include <android/api-level.h> 364 #ifndef GTEST_HAS_POSIX_RE 365 # if GTEST_OS_LINUX_ANDROID 367 # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) 369 # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) 376 #elif GTEST_HAS_POSIX_RE 384 # define GTEST_USES_POSIX_RE 1 386 #elif GTEST_OS_WINDOWS 390 # define GTEST_USES_SIMPLE_RE 1 396 # define GTEST_USES_SIMPLE_RE 1 398 #endif // GTEST_USES_PCRE 400 #ifndef GTEST_HAS_EXCEPTIONS 403 # if defined(_MSC_VER) && defined(_CPPUNWIND) 405 # define GTEST_HAS_EXCEPTIONS 1 406 # elif defined(__BORLANDC__) 410 # ifndef _HAS_EXCEPTIONS 411 # define _HAS_EXCEPTIONS 1 412 # endif // _HAS_EXCEPTIONS 413 # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS 414 # elif defined(__clang__) 422 # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions)) 423 # elif defined(__GNUC__) && __EXCEPTIONS 425 # define GTEST_HAS_EXCEPTIONS 1 426 # elif defined(__SUNPRO_CC) 430 # define GTEST_HAS_EXCEPTIONS 1 431 # elif defined(__IBMCPP__) && __EXCEPTIONS 433 # define GTEST_HAS_EXCEPTIONS 1 434 # elif defined(__HP_aCC) 437 # define GTEST_HAS_EXCEPTIONS 1 441 # define GTEST_HAS_EXCEPTIONS 0 442 # endif // defined(_MSC_VER) || defined(__BORLANDC__) 443 #endif // GTEST_HAS_EXCEPTIONS 445 #if !defined(GTEST_HAS_STD_STRING) 448 # define GTEST_HAS_STD_STRING 1 449 #elif !GTEST_HAS_STD_STRING 451 # error "::std::string isn't available." 452 #endif // !defined(GTEST_HAS_STD_STRING) 454 #ifndef GTEST_HAS_GLOBAL_STRING 455 # define GTEST_HAS_GLOBAL_STRING 0 456 #endif // GTEST_HAS_GLOBAL_STRING 458 #ifndef GTEST_HAS_STD_WSTRING 464 # define GTEST_HAS_STD_WSTRING \ 465 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) 467 #endif // GTEST_HAS_STD_WSTRING 469 #ifndef GTEST_HAS_GLOBAL_WSTRING 472 # define GTEST_HAS_GLOBAL_WSTRING \ 473 (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) 474 #endif // GTEST_HAS_GLOBAL_WSTRING 477 #ifndef GTEST_HAS_RTTI 483 # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. 484 # define GTEST_HAS_RTTI 1 486 # define GTEST_HAS_RTTI 0 490 # elif defined(__GNUC__) 497 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ 498 !defined(__EXCEPTIONS) 499 # define GTEST_HAS_RTTI 0 501 # define GTEST_HAS_RTTI 1 502 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS 504 # define GTEST_HAS_RTTI 0 505 # endif // __GXX_RTTI 510 # elif defined(__clang__) 512 # define GTEST_HAS_RTTI __has_feature(cxx_rtti) 516 # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) 519 # define GTEST_HAS_RTTI 1 521 # define GTEST_HAS_RTTI 0 527 # define GTEST_HAS_RTTI 1 531 #endif // GTEST_HAS_RTTI 540 #ifndef GTEST_HAS_PTHREAD 546 #define GTEST_HAS_PTHREAD \ 547 (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \ 548 GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA) 549 #endif // GTEST_HAS_PTHREAD 551 #if GTEST_HAS_PTHREAD 554 # include <pthread.h> 564 #ifndef GTEST_HAS_CLONE 567 # if GTEST_OS_LINUX && !defined(__ia64__) 568 # if GTEST_OS_LINUX_ANDROID 571 # if defined(__LP64__) || \ 572 (defined(__arm__) && __ANDROID_API__ >= 9) || \ 573 (defined(__mips__) && __ANDROID_API__ >= 12) || \ 574 (defined(__i386__) && __ANDROID_API__ >= 17) 575 # define GTEST_HAS_CLONE 1 577 # define GTEST_HAS_CLONE 0 580 # define GTEST_HAS_CLONE 1 583 # define GTEST_HAS_CLONE 0 584 # endif // GTEST_OS_LINUX && !defined(__ia64__) 586 #endif // GTEST_HAS_CLONE 590 #ifndef GTEST_HAS_STREAM_REDIRECTION 593 # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT 594 # define GTEST_HAS_STREAM_REDIRECTION 0 596 # define GTEST_HAS_STREAM_REDIRECTION 1 597 # endif // !GTEST_OS_WINDOWS_MOBILE 598 #endif // GTEST_HAS_STREAM_REDIRECTION 602 #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ 603 (GTEST_OS_MAC && !GTEST_OS_IOS) || \ 604 (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || \ 605 GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \ 606 GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \ 607 GTEST_OS_NETBSD || GTEST_OS_FUCHSIA) 608 # define GTEST_HAS_DEATH_TEST 1 615 #if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \ 616 defined(__IBMCPP__) || defined(__HP_aCC) 617 # define GTEST_HAS_TYPED_TEST 1 618 # define GTEST_HAS_TYPED_TEST_P 1 622 #define GTEST_WIDE_STRING_USES_UTF16_ \ 623 (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2) 627 # define GTEST_CAN_STREAM_RESULTS_ 1 640 #ifdef __INTEL_COMPILER 641 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ 643 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT 657 #if defined(__GNUC__) && !defined(COMPILER_ICC) 658 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 659 #elif defined(__clang__) 660 # if __has_attribute(unused) 661 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 664 #ifndef GTEST_ATTRIBUTE_UNUSED_ 665 # define GTEST_ATTRIBUTE_UNUSED_ 669 #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC) 670 # if defined(__MINGW_PRINTF_FORMAT) 674 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ 675 __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \ 678 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ 679 __attribute__((__format__(__printf__, string_index, first_to_check))) 682 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) 688 #define GTEST_DISALLOW_ASSIGN_(type) \ 689 void operator=(type const &) = delete 693 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \ 694 type(type const &) = delete; \ 695 GTEST_DISALLOW_ASSIGN_(type) 702 #if defined(__GNUC__) && !defined(COMPILER_ICC) 703 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) 705 # define GTEST_MUST_USE_RESULT_ 706 #endif // __GNUC__ && !COMPILER_ICC 716 # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \ 717 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127) 718 # define GTEST_INTENTIONAL_CONST_COND_POP_() \ 719 GTEST_DISABLE_MSC_WARNINGS_POP_() 724 #ifndef GTEST_HAS_SEH 727 # if defined(_MSC_VER) || defined(__BORLANDC__) 729 # define GTEST_HAS_SEH 1 732 # define GTEST_HAS_SEH 0 735 #endif // GTEST_HAS_SEH 737 #ifndef GTEST_IS_THREADSAFE 739 #define GTEST_IS_THREADSAFE \ 740 (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \ 741 (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \ 744 #endif // GTEST_IS_THREADSAFE 752 # if GTEST_LINKED_AS_SHARED_LIBRARY 753 # define GTEST_API_ __declspec(dllimport) 754 # elif GTEST_CREATE_SHARED_LIBRARY 755 # define GTEST_API_ __declspec(dllexport) 757 #elif __GNUC__ >= 4 || defined(__clang__) 758 # define GTEST_API_ __attribute__((visibility ("default"))) 767 #ifndef GTEST_DEFAULT_DEATH_TEST_STYLE 768 # define GTEST_DEFAULT_DEATH_TEST_STYLE "fast" 769 #endif // GTEST_DEFAULT_DEATH_TEST_STYLE 773 # define GTEST_NO_INLINE_ __attribute__((noinline)) 775 # define GTEST_NO_INLINE_ 779 #if !defined(GTEST_HAS_CXXABI_H_) 780 # if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) 781 # define GTEST_HAS_CXXABI_H_ 1 783 # define GTEST_HAS_CXXABI_H_ 0 789 #if defined(__clang__) 790 # if __has_feature(memory_sanitizer) 791 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \ 792 __attribute__((no_sanitize_memory)) 794 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ 795 # endif // __has_feature(memory_sanitizer) 797 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ 801 #if defined(__clang__) 802 # if __has_feature(address_sanitizer) 803 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ 804 __attribute__((no_sanitize_address)) 806 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ 807 # endif // __has_feature(address_sanitizer) 809 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ 813 #if defined(__clang__) 814 # if __has_feature(thread_sanitizer) 815 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \ 816 __attribute__((no_sanitize_thread)) 818 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ 819 # endif // __has_feature(thread_sanitizer) 821 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ 831 using std::make_tuple;
833 using std::tuple_element;
834 using std::tuple_size;
852 #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) 857 template <
typename T1,
typename T2>
860 template <
typename T>
862 enum { value =
true };
866 template <
typename T,
typename U>
868 enum { value =
false };
870 template <
typename T>
872 enum { value =
true };
876 #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0])) 878 #if GTEST_HAS_GLOBAL_STRING 879 typedef ::string string;
881 typedef ::std::string string;
882 #endif // GTEST_HAS_GLOBAL_STRING 884 #if GTEST_HAS_GLOBAL_WSTRING 885 typedef ::wstring wstring;
886 #elif GTEST_HAS_STD_WSTRING 887 typedef ::std::wstring wstring;
888 #endif // GTEST_HAS_GLOBAL_WSTRING 892 GTEST_API_
bool IsTrue(
bool condition);
898 #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE 902 class GTEST_API_
RE {
906 RE(
const RE& other) { Init(other.pattern()); }
909 RE(const ::std::string& regex) { Init(regex.c_str()); }
911 # if GTEST_HAS_GLOBAL_STRING 913 RE(const ::string& regex) { Init(regex.c_str()); }
915 # endif // GTEST_HAS_GLOBAL_STRING 917 RE(
const char* regex) { Init(regex); }
921 const char* pattern()
const {
return pattern_; }
927 static bool FullMatch(const ::std::string& str,
const RE& re) {
928 return FullMatch(str.c_str(), re);
930 static bool PartialMatch(const ::std::string& str,
const RE& re) {
931 return PartialMatch(str.c_str(), re);
934 # if GTEST_HAS_GLOBAL_STRING 936 static bool FullMatch(const ::string& str,
const RE& re) {
937 return FullMatch(str.c_str(), re);
939 static bool PartialMatch(const ::string& str,
const RE& re) {
940 return PartialMatch(str.c_str(), re);
943 # endif // GTEST_HAS_GLOBAL_STRING 945 static bool FullMatch(
const char* str,
const RE& re);
946 static bool PartialMatch(
const char* str,
const RE& re);
949 void Init(
const char* regex);
950 const char* pattern_;
953 # if GTEST_USES_POSIX_RE 956 regex_t partial_regex_;
958 # else // GTEST_USES_SIMPLE_RE 960 const char* full_pattern_;
964 GTEST_DISALLOW_ASSIGN_(
RE);
967 #endif // GTEST_USES_PCRE 971 GTEST_API_ ::std::string FormatFileLocation(
const char* file,
int line);
976 GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
const char* file,
985 enum GTestLogSeverity {
997 GTestLog(GTestLogSeverity severity,
const char* file,
int line);
1002 ::std::ostream& GetStream() { return ::std::cerr; }
1005 const GTestLogSeverity severity_;
1007 GTEST_DISALLOW_COPY_AND_ASSIGN_(
GTestLog);
1010 #if !defined(GTEST_LOG_) 1012 # define GTEST_LOG_(severity) \ 1013 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ 1014 __FILE__, __LINE__).GetStream() 1016 inline void LogToStderr() {}
1017 inline void FlushInfoLog() { fflush(
nullptr); }
1019 #endif // !defined(GTEST_LOG_) 1021 #if !defined(GTEST_CHECK_) 1036 # define GTEST_CHECK_(condition) \ 1037 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1038 if (::testing::internal::IsTrue(condition)) \ 1041 GTEST_LOG_(FATAL) << "Condition " #condition " failed. " 1042 #endif // !defined(GTEST_CHECK_) 1049 #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ 1050 if (const int gtest_error = (posix_call)) \ 1051 GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ 1057 template <
typename T>
1059 template <
typename T>
1064 #define GTEST_ADD_REFERENCE_(T) \ 1065 typename ::testing::internal::AddReference<T>::type 1078 template <
typename T>
1080 template <
typename T>
1084 #define GTEST_REFERENCE_TO_CONST_(T) \ 1085 typename ::testing::internal::ConstRef<T>::type 1107 template<
typename To>
1108 inline To ImplicitCast_(
To x) {
return x; }
1131 template<
typename To,
typename From>
1132 inline To DownCast_(From* f) {
1137 GTEST_INTENTIONAL_CONST_COND_PUSH_()
1139 GTEST_INTENTIONAL_CONST_COND_POP_()
1140 const To to =
nullptr;
1141 ::testing::internal::ImplicitCast_<From*>(to);
1146 GTEST_CHECK_(f ==
nullptr || dynamic_cast<To>(f) !=
nullptr);
1148 return static_cast<To>(f);
1156 template <
class Derived,
class Base>
1157 Derived* CheckedDowncastToActualType(Base* base) {
1159 GTEST_CHECK_(
typeid(*base) ==
typeid(Derived));
1162 #if GTEST_HAS_DOWNCAST_ 1163 return ::down_cast<Derived*>(base);
1164 #elif GTEST_HAS_RTTI 1165 return dynamic_cast<Derived*
>(base);
1167 return static_cast<Derived*
>(base);
1171 #if GTEST_HAS_STREAM_REDIRECTION 1179 GTEST_API_
void CaptureStdout();
1180 GTEST_API_ std::string GetCapturedStdout();
1181 GTEST_API_
void CaptureStderr();
1182 GTEST_API_ std::string GetCapturedStderr();
1184 #endif // GTEST_HAS_STREAM_REDIRECTION 1186 GTEST_API_
size_t GetFileSize(FILE* file);
1189 GTEST_API_ std::string ReadEntireFile(FILE* file);
1192 GTEST_API_ std::vector<std::string> GetArgvs();
1194 #if GTEST_HAS_DEATH_TEST 1196 std::vector<std::string> GetInjectableArgvs();
1198 void SetInjectableArgvs(
const std::vector<std::string>* new_argvs);
1199 void SetInjectableArgvs(
const std::vector<std::string>& new_argvs);
1200 #if GTEST_HAS_GLOBAL_STRING 1201 void SetInjectableArgvs(
const std::vector< ::string>& new_argvs);
1202 #endif // GTEST_HAS_GLOBAL_STRING 1203 void ClearInjectableArgvs();
1205 #endif // GTEST_HAS_DEATH_TEST 1208 #if GTEST_IS_THREADSAFE 1209 # if GTEST_HAS_PTHREAD 1213 inline void SleepMilliseconds(
int n) {
1214 const timespec time = {
1218 nanosleep(&time,
nullptr);
1220 # endif // GTEST_HAS_PTHREAD 1222 # if GTEST_HAS_NOTIFICATION_ 1226 # elif GTEST_HAS_PTHREAD 1233 class Notification {
1235 Notification() : notified_(
false) {
1236 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_,
nullptr));
1239 pthread_mutex_destroy(&mutex_);
1245 pthread_mutex_lock(&mutex_);
1247 pthread_mutex_unlock(&mutex_);
1252 void WaitForNotification() {
1254 pthread_mutex_lock(&mutex_);
1255 const bool notified = notified_;
1256 pthread_mutex_unlock(&mutex_);
1259 SleepMilliseconds(10);
1264 pthread_mutex_t mutex_;
1267 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1270 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 1272 GTEST_API_
void SleepMilliseconds(
int n);
1276 class GTEST_API_ AutoHandle {
1283 typedef void* Handle;
1285 explicit AutoHandle(Handle handle);
1291 void Reset(Handle handle);
1295 bool IsCloseable()
const;
1299 GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
1308 class GTEST_API_ Notification {
1312 void WaitForNotification();
1317 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1319 # endif // GTEST_HAS_NOTIFICATION_ 1324 # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW 1331 class ThreadWithParamBase {
1333 virtual ~ThreadWithParamBase() {}
1334 virtual void Run() = 0;
1343 extern "C" inline void* ThreadFuncWithCLinkage(
void* thread) {
1344 static_cast<ThreadWithParamBase*
>(thread)->Run();
1360 template <
typename T>
1361 class ThreadWithParam :
public ThreadWithParamBase {
1363 typedef void UserThreadFunc(T);
1365 ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
1368 thread_can_start_(thread_can_start),
1370 ThreadWithParamBase*
const base =
this;
1373 GTEST_CHECK_POSIX_SUCCESS_(
1374 pthread_create(&thread_,
nullptr, &ThreadFuncWithCLinkage, base));
1376 ~ThreadWithParam()
override { Join(); }
1380 GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_,
nullptr));
1385 void Run()
override {
1386 if (thread_can_start_ !=
nullptr) thread_can_start_->WaitForNotification();
1391 UserThreadFunc*
const func_;
1395 Notification*
const thread_can_start_;
1399 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1401 # endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD || 1404 # if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ 1408 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 1424 class GTEST_API_ Mutex {
1426 enum MutexType { kStatic = 0, kDynamic = 1 };
1430 enum StaticConstructorSelector { kStaticMutex = 0 };
1435 explicit Mutex(StaticConstructorSelector ) {}
1450 void ThreadSafeLazyInit();
1454 unsigned int owner_thread_id_;
1459 long critical_section_init_phase_;
1460 GTEST_CRITICAL_SECTION* critical_section_;
1462 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1465 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1466 extern ::testing::internal::Mutex mutex 1468 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 1469 ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) 1479 : mutex_(mutex) { mutex_->Lock(); }
1484 Mutex*
const mutex_;
1493 class ThreadLocalValueHolderBase {
1495 virtual ~ThreadLocalValueHolderBase() {}
1500 class ThreadLocalBase {
1506 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const = 0;
1509 ThreadLocalBase() {}
1510 virtual ~ThreadLocalBase() {}
1513 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);
1519 class GTEST_API_ ThreadLocalRegistry {
1523 static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
1524 const ThreadLocalBase* thread_local_instance);
1527 static void OnThreadLocalDestroyed(
1528 const ThreadLocalBase* thread_local_instance);
1531 class GTEST_API_ ThreadWithParamBase {
1538 virtual ~Runnable() {}
1539 virtual void Run() = 0;
1542 ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
1543 virtual ~ThreadWithParamBase();
1550 template <
typename T>
1551 class ThreadWithParam :
public ThreadWithParamBase {
1553 typedef void UserThreadFunc(T);
1555 ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
1556 : ThreadWithParamBase(
new RunnableImpl(func, param), thread_can_start) {
1558 virtual ~ThreadWithParam() {}
1561 class RunnableImpl :
public Runnable {
1563 RunnableImpl(UserThreadFunc* func, T param)
1567 virtual ~RunnableImpl() {}
1568 virtual void Run() {
1573 UserThreadFunc*
const func_;
1576 GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);
1579 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1609 template <
typename T>
1612 ThreadLocal() : default_factory_(
new DefaultValueHolderFactory()) {}
1614 : default_factory_(
new InstanceValueHolderFactory(value)) {}
1616 ~
ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(
this); }
1618 T* pointer() {
return GetOrCreateValue(); }
1619 const T* pointer()
const {
return GetOrCreateValue(); }
1620 const T&
get()
const {
return *pointer(); }
1621 void set(
const T& value) { *pointer() = value; }
1626 class ValueHolder :
public ThreadLocalValueHolderBase {
1628 ValueHolder() : value_() {}
1629 explicit ValueHolder(
const T& value) : value_(value) {}
1631 T* pointer() {
return &value_; }
1635 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
1639 T* GetOrCreateValue()
const {
1640 return static_cast<ValueHolder*
>(
1641 ThreadLocalRegistry::GetValueOnCurrentThread(
this))->pointer();
1644 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const {
1645 return default_factory_->MakeNewHolder();
1648 class ValueHolderFactory {
1650 ValueHolderFactory() {}
1651 virtual ~ValueHolderFactory() {}
1652 virtual ValueHolder* MakeNewHolder()
const = 0;
1655 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
1658 class DefaultValueHolderFactory :
public ValueHolderFactory {
1660 DefaultValueHolderFactory() {}
1661 virtual ValueHolder* MakeNewHolder()
const {
return new ValueHolder(); }
1664 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
1667 class InstanceValueHolderFactory :
public ValueHolderFactory {
1669 explicit InstanceValueHolderFactory(
const T& value) : value_(value) {}
1670 virtual ValueHolder* MakeNewHolder()
const {
1671 return new ValueHolder(value_);
1677 GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
1680 std::unique_ptr<ValueHolderFactory> default_factory_;
1685 # elif GTEST_HAS_PTHREAD 1692 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
1693 owner_ = pthread_self();
1704 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
1709 void AssertHeld()
const {
1710 GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
1711 <<
"The current thread is not holding the mutex @" <<
this;
1720 pthread_mutex_t mutex_;
1732 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1733 extern ::testing::internal::MutexBase mutex 1741 #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 1742 ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0} 1746 class Mutex :
public MutexBase {
1749 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_,
nullptr));
1753 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
1757 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1768 : mutex_(mutex) { mutex_->Lock(); }
1773 MutexBase*
const mutex_;
1786 class ThreadLocalValueHolderBase {
1788 virtual ~ThreadLocalValueHolderBase() {}
1793 extern "C" inline void DeleteThreadLocalValue(
void* value_holder) {
1794 delete static_cast<ThreadLocalValueHolderBase*
>(value_holder);
1798 template <
typename T>
1799 class GTEST_API_ ThreadLocal {
1802 : key_(CreateKey()), default_factory_(
new DefaultValueHolderFactory()) {}
1803 explicit ThreadLocal(
const T& value)
1804 : key_(CreateKey()),
1805 default_factory_(
new InstanceValueHolderFactory(value)) {}
1809 DeleteThreadLocalValue(pthread_getspecific(key_));
1813 GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
1816 T* pointer() {
return GetOrCreateValue(); }
1817 const T* pointer()
const {
return GetOrCreateValue(); }
1818 const T&
get()
const {
return *pointer(); }
1819 void set(
const T& value) { *pointer() = value; }
1823 class ValueHolder :
public ThreadLocalValueHolderBase {
1825 ValueHolder() : value_() {}
1826 explicit ValueHolder(
const T& value) : value_(value) {}
1828 T* pointer() {
return &value_; }
1832 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
1835 static pthread_key_t CreateKey() {
1839 GTEST_CHECK_POSIX_SUCCESS_(
1840 pthread_key_create(&key, &DeleteThreadLocalValue));
1844 T* GetOrCreateValue()
const {
1845 ThreadLocalValueHolderBase*
const holder =
1846 static_cast<ThreadLocalValueHolderBase*
>(pthread_getspecific(key_));
1847 if (holder !=
nullptr) {
1848 return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
1851 ValueHolder*
const new_holder = default_factory_->MakeNewHolder();
1852 ThreadLocalValueHolderBase*
const holder_base = new_holder;
1853 GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
1854 return new_holder->pointer();
1857 class ValueHolderFactory {
1859 ValueHolderFactory() {}
1860 virtual ~ValueHolderFactory() {}
1861 virtual ValueHolder* MakeNewHolder()
const = 0;
1864 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
1867 class DefaultValueHolderFactory :
public ValueHolderFactory {
1869 DefaultValueHolderFactory() {}
1870 virtual ValueHolder* MakeNewHolder()
const {
return new ValueHolder(); }
1873 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
1876 class InstanceValueHolderFactory :
public ValueHolderFactory {
1878 explicit InstanceValueHolderFactory(
const T& value) : value_(value) {}
1879 virtual ValueHolder* MakeNewHolder()
const {
1880 return new ValueHolder(value_);
1886 GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
1890 const pthread_key_t key_;
1891 std::unique_ptr<ValueHolderFactory> default_factory_;
1893 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
1896 # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ 1898 #else // GTEST_IS_THREADSAFE 1910 void AssertHeld()
const {}
1913 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1914 extern ::testing::internal::Mutex mutex 1916 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex 1930 template <
typename T>
1931 class GTEST_API_ ThreadLocal {
1933 ThreadLocal() : value_() {}
1934 explicit ThreadLocal(
const T& value) : value_(value) {}
1935 T* pointer() {
return &value_; }
1936 const T* pointer()
const {
return &value_; }
1937 const T&
get()
const {
return value_; }
1938 void set(
const T& value) { value_ = value; }
1943 #endif // GTEST_IS_THREADSAFE 1947 GTEST_API_
size_t GetThreadCount();
1949 template <
bool bool_value>
1952 static const bool value = bool_value;
1959 template <
typename T,
typename U>
1962 template <
typename T>
1965 template <
typename Iterator>
1967 typedef typename Iterator::value_type value_type;
1971 template <
typename T>
1973 typedef T value_type;
1976 template <
typename T>
1978 typedef T value_type;
1981 #if GTEST_OS_WINDOWS 1982 # define GTEST_PATH_SEP_ "\\" 1983 # define GTEST_HAS_ALT_PATH_SEP_ 1 1985 typedef __int64 BiggestInt;
1987 # define GTEST_PATH_SEP_ "/" 1988 # define GTEST_HAS_ALT_PATH_SEP_ 0 1989 typedef long long BiggestInt;
1990 #endif // GTEST_OS_WINDOWS 1999 inline bool IsAlpha(
char ch) {
2000 return isalpha(static_cast<unsigned char>(ch)) != 0;
2002 inline bool IsAlNum(
char ch) {
2003 return isalnum(static_cast<unsigned char>(ch)) != 0;
2005 inline bool IsDigit(
char ch) {
2006 return isdigit(static_cast<unsigned char>(ch)) != 0;
2008 inline bool IsLower(
char ch) {
2009 return islower(static_cast<unsigned char>(ch)) != 0;
2011 inline bool IsSpace(
char ch) {
2012 return isspace(static_cast<unsigned char>(ch)) != 0;
2014 inline bool IsUpper(
char ch) {
2015 return isupper(static_cast<unsigned char>(ch)) != 0;
2017 inline bool IsXDigit(
char ch) {
2018 return isxdigit(static_cast<unsigned char>(ch)) != 0;
2020 inline bool IsXDigit(
wchar_t ch) {
2021 const unsigned char low_byte =
static_cast<unsigned char>(ch);
2022 return ch == low_byte && isxdigit(low_byte) != 0;
2025 inline char ToLower(
char ch) {
2026 return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
2028 inline char ToUpper(
char ch) {
2029 return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
2032 inline std::string StripTrailingSpaces(std::string str) {
2033 std::string::iterator it = str.end();
2034 while (it != str.begin() && IsSpace(*--it))
2049 #if GTEST_OS_WINDOWS 2051 typedef struct _stat StatStruct;
2053 # ifdef __BORLANDC__ 2054 inline int IsATTY(
int fd) {
return isatty(fd); }
2055 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2056 return stricmp(s1, s2);
2058 inline char* StrDup(
const char* src) {
return strdup(src); }
2059 # else // !__BORLANDC__ 2060 # if GTEST_OS_WINDOWS_MOBILE 2061 inline int IsATTY(
int ) {
return 0; }
2063 inline int IsATTY(
int fd) {
return _isatty(fd); }
2064 # endif // GTEST_OS_WINDOWS_MOBILE 2065 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2066 return _stricmp(s1, s2);
2068 inline char* StrDup(
const char* src) {
return _strdup(src); }
2069 # endif // __BORLANDC__ 2071 # if GTEST_OS_WINDOWS_MOBILE 2072 inline int FileNo(FILE* file) {
return reinterpret_cast<int>(_fileno(file)); }
2076 inline int FileNo(FILE* file) {
return _fileno(file); }
2077 inline int Stat(
const char* path, StatStruct* buf) {
return _stat(path, buf); }
2078 inline int RmDir(
const char* dir) {
return _rmdir(dir); }
2079 inline bool IsDir(
const StatStruct& st) {
2080 return (_S_IFDIR & st.st_mode) != 0;
2082 # endif // GTEST_OS_WINDOWS_MOBILE 2086 typedef struct stat StatStruct;
2088 inline int FileNo(FILE* file) {
return fileno(file); }
2089 inline int IsATTY(
int fd) {
return isatty(fd); }
2090 inline int Stat(
const char* path, StatStruct* buf) {
return stat(path, buf); }
2091 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2092 return strcasecmp(s1, s2);
2094 inline char* StrDup(
const char* src) {
return strdup(src); }
2095 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2096 inline bool IsDir(
const StatStruct& st) {
return S_ISDIR(st.st_mode); }
2098 #endif // GTEST_OS_WINDOWS 2102 GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
2104 inline const char* StrNCpy(
char* dest,
const char* src,
size_t n) {
2105 return strncpy(dest, src, n);
2112 #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 2113 inline int ChDir(
const char* dir) {
return chdir(dir); }
2115 inline FILE* FOpen(
const char* path,
const char* mode) {
2116 return fopen(path, mode);
2118 #if !GTEST_OS_WINDOWS_MOBILE 2119 inline FILE *FReopen(
const char* path,
const char* mode, FILE* stream) {
2120 return freopen(path, mode, stream);
2122 inline FILE* FDOpen(
int fd,
const char* mode) {
return fdopen(fd, mode); }
2124 inline int FClose(FILE* fp) {
return fclose(fp); }
2125 #if !GTEST_OS_WINDOWS_MOBILE 2126 inline int Read(
int fd,
void* buf,
unsigned int count) {
2127 return static_cast<int>(read(fd, buf, count));
2129 inline int Write(
int fd,
const void* buf,
unsigned int count) {
2130 return static_cast<int>(write(fd, buf, count));
2132 inline int Close(
int fd) {
return close(fd); }
2133 inline const char* StrError(
int errnum) {
return strerror(errnum); }
2135 inline const char* GetEnv(
const char* name) {
2136 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT 2138 static_cast<void>(name);
2140 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) 2143 const char*
const env = getenv(name);
2144 return (env !=
nullptr && env[0] !=
'\0') ? env :
nullptr;
2146 return getenv(name);
2150 GTEST_DISABLE_MSC_DEPRECATED_POP_()
2152 #if GTEST_OS_WINDOWS_MOBILE 2156 [[noreturn]]
void Abort();
2158 [[noreturn]]
inline void Abort() { abort(); }
2159 #endif // GTEST_OS_WINDOWS_MOBILE 2168 #if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE 2170 # define GTEST_SNPRINTF_(buffer, size, format, ...) \ 2171 _snprintf_s(buffer, size, size, format, __VA_ARGS__) 2172 #elif defined(_MSC_VER) 2174 # define GTEST_SNPRINTF_ _snprintf 2176 # define GTEST_SNPRINTF_ snprintf 2186 const BiggestInt kMaxBiggestInt =
2187 ~(
static_cast<BiggestInt
>(1) << (8*
sizeof(BiggestInt) - 1));
2207 template <
size_t size>
2224 typedef unsigned int UInt;
2231 #if GTEST_OS_WINDOWS 2232 typedef __int64 Int;
2233 typedef unsigned __int64 UInt;
2235 typedef long long Int;
2236 typedef unsigned long long UInt;
2237 #endif // GTEST_OS_WINDOWS 2242 typedef TypeWithSize<4>::UInt UInt32;
2244 typedef TypeWithSize<8>::UInt UInt64;
2250 #if !defined(GTEST_FLAG) 2251 # define GTEST_FLAG(name) FLAGS_gtest_##name 2252 #endif // !defined(GTEST_FLAG) 2254 #if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) 2255 # define GTEST_USE_OWN_FLAGFILE_FLAG_ 1 2256 #endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) 2258 #if !defined(GTEST_DECLARE_bool_) 2259 # define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver 2262 # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) 2263 # define GTEST_DECLARE_int32_(name) \ 2264 GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) 2265 # define GTEST_DECLARE_string_(name) \ 2266 GTEST_API_ extern ::std::string GTEST_FLAG(name) 2269 # define GTEST_DEFINE_bool_(name, default_val, doc) \ 2270 GTEST_API_ bool GTEST_FLAG(name) = (default_val) 2271 # define GTEST_DEFINE_int32_(name, default_val, doc) \ 2272 GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) 2273 # define GTEST_DEFINE_string_(name, default_val, doc) \ 2274 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) 2276 #endif // !defined(GTEST_DECLARE_bool_) 2279 #if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) 2280 # define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) 2281 # define GTEST_LOCK_EXCLUDED_(locks) 2282 #endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) 2287 bool ParseInt32(
const Message& src_text,
const char* str, Int32* value);
2291 bool BoolFromGTestEnv(
const char* flag,
bool default_val);
2292 GTEST_API_ Int32 Int32FromGTestEnv(
const char* flag, Int32 default_val);
2293 std::string OutputFlagAlsoCheckEnvVar();
2294 const char* StringFromGTestEnv(
const char* flag,
const char* default_val);
2307 #if defined(_MSC_VER) 2308 #define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message)) 2309 #elif defined(__GNUC__) 2310 #define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message))) 2312 #define GTEST_INTERNAL_DEPRECATED(message) 2315 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ Definition: gmock-actions.h:59
Definition: gtest-port.h:1931
Definition: googletest-port-test.cc:192
Definition: gtest-port.h:1079
Definition: gtest-port.h:2208
Definition: gtest-message.h:90
Definition: gtest-port.h:867
Definition: gtest-port.h:995
Definition: gtest-port.h:1923
Definition: gtest-port.h:858
Definition: gtest-port.h:1950
Definition: gtest-port.h:1058
Definition: gtest-port.h:1960
Definition: gtest-port.h:902
Definition: gtest-port.h:2045
Definition: gtest-port.h:1966