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>
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>
866 template <
typename T,
typename U>
870 template <
typename T>
876 #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
878 #if GTEST_HAS_GLOBAL_STRING
882 #endif // GTEST_HAS_GLOBAL_STRING
884 #if GTEST_HAS_GLOBAL_WSTRING
886 #elif GTEST_HAS_STD_WSTRING
888 #endif // GTEST_HAS_GLOBAL_WSTRING
898 #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE
911 # if GTEST_HAS_GLOBAL_STRING
915 # endif // GTEST_HAS_GLOBAL_STRING
921 const char*
pattern()
const {
return pattern_; }
928 return FullMatch(
str.c_str(), re);
931 return PartialMatch(
str.c_str(), re);
934 # if GTEST_HAS_GLOBAL_STRING
937 return FullMatch(
str.c_str(), 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);
953 # if GTEST_USES_POSIX_RE
958 # else // GTEST_USES_SIMPLE_RE
960 const char* full_pattern_;
967 #endif // GTEST_USES_PCRE
1010 #if !defined(GTEST_LOG_)
1012 # define GTEST_LOG_(severity) \
1013 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
1014 __FILE__, __LINE__).GetStream()
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>
1131 template<
typename To,
typename From>
1140 const To to =
nullptr;
1141 ::testing::internal::ImplicitCast_<From*>(to);
1148 return static_cast<To>(
f);
1156 template <
class Derived,
class Base>
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
1184 #endif // GTEST_HAS_STREAM_REDIRECTION
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) {
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);
1270 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
1283 typedef void* Handle;
1285 explicit AutoHandle(Handle handle);
1291 void Reset(Handle handle);
1295 bool IsCloseable()
const;
1312 void WaitForNotification();
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;
1374 pthread_create(&thread_,
nullptr, &ThreadFuncWithCLinkage,
base));
1376 ~ThreadWithParam()
override {
Join(); }
1385 void Run()
override {
1386 if (thread_can_start_ !=
nullptr) thread_can_start_->WaitForNotification();
1391 UserThreadFunc*
const func_;
1395 Notification*
const thread_can_start_;
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
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_;
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)
1476 class GTestMutexLock {
1493 class ThreadLocalValueHolderBase {
1495 virtual ~ThreadLocalValueHolderBase() {}
1500 class ThreadLocalBase {
1506 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const = 0;
1509 ThreadLocalBase() {}
1510 virtual ~ThreadLocalBase() {}
1523 static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
1524 const ThreadLocalBase* thread_local_instance);
1527 static void OnThreadLocalDestroyed(
1528 const ThreadLocalBase* thread_local_instance);
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 {
1567 virtual ~RunnableImpl() {}
1568 virtual void Run() {
1573 UserThreadFunc*
const func_;
1609 template <
typename T>
1610 class ThreadLocal :
public ThreadLocalBase {
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(); }
1626 class ValueHolder :
public ThreadLocalValueHolderBase {
1628 ValueHolder() :
value_() {}
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;
1658 class DefaultValueHolderFactory :
public ValueHolderFactory {
1660 DefaultValueHolderFactory() {}
1661 virtual ValueHolder* MakeNewHolder()
const {
return new ValueHolder(); }
1667 class InstanceValueHolderFactory :
public ValueHolderFactory {
1670 virtual ValueHolder* MakeNewHolder()
const {
1671 return new ValueHolder(
value_);
1680 std::unique_ptr<ValueHolderFactory> default_factory_;
1685 # elif GTEST_HAS_PTHREAD
1693 owner_ = pthread_self();
1709 void AssertHeld()
const {
1710 GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
1711 <<
"The current thread is not holding the mutex @" <<
this;
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 {
1765 class GTestMutexLock {
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>
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_));
1816 T*
pointer() {
return GetOrCreateValue(); }
1817 const T*
pointer()
const {
return GetOrCreateValue(); }
1823 class ValueHolder :
public ThreadLocalValueHolderBase {
1825 ValueHolder() :
value_() {}
1835 static pthread_key_t CreateKey() {
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;
1854 return new_holder->pointer();
1857 class ValueHolderFactory {
1859 ValueHolderFactory() {}
1860 virtual ~ValueHolderFactory() {}
1861 virtual ValueHolder* MakeNewHolder()
const = 0;
1867 class DefaultValueHolderFactory :
public ValueHolderFactory {
1869 DefaultValueHolderFactory() {}
1870 virtual ValueHolder* MakeNewHolder()
const {
return new ValueHolder(); }
1876 class InstanceValueHolderFactory :
public ValueHolderFactory {
1879 virtual ValueHolder* MakeNewHolder()
const {
1880 return new ValueHolder(
value_);
1890 const pthread_key_t key_;
1891 std::unique_ptr<ValueHolderFactory> default_factory_;
1896 # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
1898 #else // GTEST_IS_THREADSAFE
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>
1943 #endif // GTEST_IS_THREADSAFE
1949 template <
bool bool_value>
1959 template <
typename T,
typename U>
1962 template <
typename T>
1965 template <
typename Iterator>
1971 template <
typename T>
1976 template <
typename T>
1981 #if GTEST_OS_WINDOWS
1982 # define GTEST_PATH_SEP_ "\\"
1983 # define GTEST_HAS_ALT_PATH_SEP_ 1
1987 # define GTEST_PATH_SEP_ "/"
1988 # define GTEST_HAS_ALT_PATH_SEP_ 0
1990 #endif // GTEST_OS_WINDOWS
2000 return isalpha(
static_cast<unsigned char>(
ch)) != 0;
2003 return isalnum(
static_cast<unsigned char>(
ch)) != 0;
2006 return isdigit(
static_cast<unsigned char>(
ch)) != 0;
2009 return islower(
static_cast<unsigned char>(
ch)) != 0;
2012 return isspace(
static_cast<unsigned char>(
ch)) != 0;
2015 return isupper(
static_cast<unsigned char>(
ch)) != 0;
2018 return isxdigit(
static_cast<unsigned char>(
ch)) != 0;
2021 const unsigned char low_byte =
static_cast<unsigned char>(
ch);
2022 return ch == low_byte &&
isxdigit(low_byte) != 0;
2026 return static_cast<char>(tolower(
static_cast<unsigned char>(
ch)));
2029 return static_cast<char>(toupper(
static_cast<unsigned char>(
ch)));
2033 std::string::iterator
it =
str.end();
2049 #if GTEST_OS_WINDOWS
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); }
2078 inline int RmDir(
const char* dir) {
return _rmdir(dir); }
2080 return (_S_IFDIR & st.st_mode) != 0;
2082 # endif // GTEST_OS_WINDOWS_MOBILE
2088 inline int FileNo(FILE* file) {
return fileno(file); }
2089 inline int IsATTY(
int fd) {
return isatty(fd); }
2092 return strcasecmp(s1, s2);
2095 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2098 #endif // GTEST_OS_WINDOWS
2112 #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
2113 inline int ChDir(
const char* dir) {
return chdir(dir); }
2118 #if !GTEST_OS_WINDOWS_MOBILE
2124 inline int FClose(FILE* fp) {
return fclose(fp); }
2125 #if !GTEST_OS_WINDOWS_MOBILE
2127 return static_cast<int>(read(fd,
buf,
count));
2130 return static_cast<int>(write(fd,
buf,
count));
2132 inline int Close(
int fd) {
return close(fd); }
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);
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
2207 template <
size_t size>
2231 #if GTEST_OS_WINDOWS
2232 typedef __int64
Int;
2233 typedef unsigned __int64
UInt;
2237 #endif // GTEST_OS_WINDOWS
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_)
2299 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_