45 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
46 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
274 #include <type_traits>
278 # include <sys/types.h>
279 # include <sys/stat.h>
280 #endif // !_WIN32_WCE
282 #if defined __APPLE__
283 # include <AvailabilityMacros.h>
284 # include <TargetConditionals.h>
287 #include "gtest/internal/custom/gtest-port.h"
288 #include "gtest/internal/gtest-port-arch.h"
290 #if !defined(GTEST_DEV_EMAIL_)
291 # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
292 # define GTEST_FLAG_PREFIX_ "gtest_"
293 # define GTEST_FLAG_PREFIX_DASH_ "gtest-"
294 # define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
295 # define GTEST_NAME_ "Google Test"
296 # define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"
297 #endif // !defined(GTEST_DEV_EMAIL_)
299 #if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
300 # define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest"
301 #endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
306 # define GTEST_GCC_VER_ \
307 (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
315 #if defined(_MSC_VER)
316 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
317 __pragma(warning(push)) \
318 __pragma(warning(disable: warnings))
319 # define GTEST_DISABLE_MSC_WARNINGS_POP_() \
320 __pragma(warning(pop))
323 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
324 # define GTEST_DISABLE_MSC_WARNINGS_POP_()
330 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \
331 _Pragma("clang diagnostic push") \
332 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \
333 _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"")
334 #define GTEST_DISABLE_MSC_DEPRECATED_POP_() \
335 _Pragma("clang diagnostic pop")
337 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \
338 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)
339 # define GTEST_DISABLE_MSC_DEPRECATED_POP_() \
340 GTEST_DISABLE_MSC_WARNINGS_POP_()
347 # if !GTEST_OS_WINDOWS_MOBILE
352 #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)
355 typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
360 typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
362 #elif GTEST_OS_XTENSA
371 # include <strings.h>
372 #endif // GTEST_OS_WINDOWS
374 #if GTEST_OS_LINUX_ANDROID
376 # include <android/api-level.h>
381 #ifndef GTEST_HAS_POSIX_RE
382 # if GTEST_OS_LINUX_ANDROID
384 # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
386 #define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS && !GTEST_OS_XTENSA)
393 #elif GTEST_HAS_POSIX_RE
401 # define GTEST_USES_POSIX_RE 1
403 #elif GTEST_OS_WINDOWS
407 # define GTEST_USES_SIMPLE_RE 1
413 # define GTEST_USES_SIMPLE_RE 1
415 #endif // GTEST_USES_PCRE
417 #ifndef GTEST_HAS_EXCEPTIONS
420 # if defined(_MSC_VER) && defined(_CPPUNWIND)
422 # define GTEST_HAS_EXCEPTIONS 1
423 # elif defined(__BORLANDC__)
427 # ifndef _HAS_EXCEPTIONS
428 # define _HAS_EXCEPTIONS 1
429 # endif // _HAS_EXCEPTIONS
430 # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
431 # elif defined(__clang__)
440 # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
441 # elif defined(__GNUC__) && __EXCEPTIONS
443 # define GTEST_HAS_EXCEPTIONS 1
444 # elif defined(__SUNPRO_CC)
448 # define GTEST_HAS_EXCEPTIONS 1
449 # elif defined(__IBMCPP__) && __EXCEPTIONS
451 # define GTEST_HAS_EXCEPTIONS 1
452 # elif defined(__HP_aCC)
455 # define GTEST_HAS_EXCEPTIONS 1
459 # define GTEST_HAS_EXCEPTIONS 0
460 # endif // defined(_MSC_VER) || defined(__BORLANDC__)
461 #endif // GTEST_HAS_EXCEPTIONS
463 #ifndef GTEST_HAS_STD_WSTRING
469 #define GTEST_HAS_STD_WSTRING \
470 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
471 GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || GTEST_OS_XTENSA))
473 #endif // GTEST_HAS_STD_WSTRING
476 #ifndef GTEST_HAS_RTTI
482 #ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled.
483 # define GTEST_HAS_RTTI 1
485 # 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 GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \
550 GTEST_OS_HAIKU || GTEST_OS_GNU_HURD)
551 #endif // GTEST_HAS_PTHREAD
553 #if GTEST_HAS_PTHREAD
556 # include <pthread.h>
566 #ifndef GTEST_HAS_CLONE
569 # if GTEST_OS_LINUX && !defined(__ia64__)
570 # if GTEST_OS_LINUX_ANDROID
573 # if defined(__LP64__) || \
574 (defined(__arm__) && __ANDROID_API__ >= 9) || \
575 (defined(__mips__) && __ANDROID_API__ >= 12) || \
576 (defined(__i386__) && __ANDROID_API__ >= 17)
577 # define GTEST_HAS_CLONE 1
579 # define GTEST_HAS_CLONE 0
582 # define GTEST_HAS_CLONE 1
585 # define GTEST_HAS_CLONE 0
586 # endif // GTEST_OS_LINUX && !defined(__ia64__)
588 #endif // GTEST_HAS_CLONE
592 #ifndef GTEST_HAS_STREAM_REDIRECTION
595 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
596 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA
597 # define GTEST_HAS_STREAM_REDIRECTION 0
599 # define GTEST_HAS_STREAM_REDIRECTION 1
600 # endif // !GTEST_OS_WINDOWS_MOBILE
601 #endif // GTEST_HAS_STREAM_REDIRECTION
605 #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
606 (GTEST_OS_MAC && !GTEST_OS_IOS) || \
607 (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \
608 GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \
609 GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
610 GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU || \
612 # define GTEST_HAS_DEATH_TEST 1
619 #if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \
620 defined(__IBMCPP__) || defined(__HP_aCC)
621 # define GTEST_HAS_TYPED_TEST 1
622 # define GTEST_HAS_TYPED_TEST_P 1
626 #define GTEST_WIDE_STRING_USES_UTF16_ \
627 (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)
630 #if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \
631 GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD || \
633 # define GTEST_CAN_STREAM_RESULTS_ 1
646 #ifdef __INTEL_COMPILER
647 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_
649 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
663 #if defined(__GNUC__) && !defined(COMPILER_ICC)
664 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
665 #elif defined(__clang__)
666 # if __has_attribute(unused)
667 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
670 #ifndef GTEST_ATTRIBUTE_UNUSED_
671 # define GTEST_ATTRIBUTE_UNUSED_
675 #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)
676 # if defined(__MINGW_PRINTF_FORMAT)
680 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
681 __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \
684 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
685 __attribute__((__format__(__printf__, string_index, first_to_check)))
688 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)
694 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
695 type(type const&) = delete; \
696 type& operator=(type const&) = delete
701 #define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \
702 type(type&&) noexcept = delete; \
703 type& operator=(type&&) noexcept = delete
710 #if defined(__GNUC__) && !defined(COMPILER_ICC)
711 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
713 # define GTEST_MUST_USE_RESULT_
714 #endif // __GNUC__ && !COMPILER_ICC
724 # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \
725 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)
726 # define GTEST_INTENTIONAL_CONST_COND_POP_() \
727 GTEST_DISABLE_MSC_WARNINGS_POP_()
732 #ifndef GTEST_HAS_SEH
735 # if defined(_MSC_VER) || defined(__BORLANDC__)
737 # define GTEST_HAS_SEH 1
740 # define GTEST_HAS_SEH 0
743 #endif // GTEST_HAS_SEH
745 #ifndef GTEST_IS_THREADSAFE
747 #define GTEST_IS_THREADSAFE \
748 (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \
749 (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \
752 #endif // GTEST_IS_THREADSAFE
754 #if GTEST_IS_THREADSAFE
756 #include <condition_variable>
758 #endif // GTEST_IS_THREADSAFE
766 # if GTEST_LINKED_AS_SHARED_LIBRARY
767 # define GTEST_API_ __declspec(dllimport)
768 # elif GTEST_CREATE_SHARED_LIBRARY
769 # define GTEST_API_ __declspec(dllexport)
771 #elif __GNUC__ >= 4 || defined(__clang__)
772 # define GTEST_API_ __attribute__((visibility ("default")))
781 #ifndef GTEST_DEFAULT_DEATH_TEST_STYLE
782 # define GTEST_DEFAULT_DEATH_TEST_STYLE "fast"
783 #endif // GTEST_DEFAULT_DEATH_TEST_STYLE
787 # define GTEST_NO_INLINE_ __attribute__((noinline))
789 # define GTEST_NO_INLINE_
792 #if defined(__clang__)
794 #if __has_attribute(disable_tail_calls)
797 #define GTEST_NO_TAIL_CALL_ __attribute__((disable_tail_calls))
800 #define GTEST_NO_TAIL_CALL_ \
801 __attribute__((optimize("no-optimize-sibling-calls")))
803 #define GTEST_NO_TAIL_CALL_
807 #if !defined(GTEST_HAS_CXXABI_H_)
808 # if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER))
809 # define GTEST_HAS_CXXABI_H_ 1
811 # define GTEST_HAS_CXXABI_H_ 0
817 #if defined(__clang__)
818 # if __has_feature(memory_sanitizer)
819 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \
820 __attribute__((no_sanitize_memory))
822 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
823 # endif // __has_feature(memory_sanitizer)
825 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
829 #if defined(__clang__)
830 # if __has_feature(address_sanitizer)
831 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \
832 __attribute__((no_sanitize_address))
834 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
835 # endif // __has_feature(address_sanitizer)
837 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
841 #if defined(__clang__)
842 # if __has_feature(hwaddress_sanitizer)
843 # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \
844 __attribute__((no_sanitize("hwaddress")))
846 # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
847 # endif // __has_feature(hwaddress_sanitizer)
849 # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
853 #if defined(__clang__)
854 # if __has_feature(thread_sanitizer)
855 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \
856 __attribute__((no_sanitize_thread))
858 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
859 # endif // __has_feature(thread_sanitizer)
861 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
873 using std::tuple_element;
874 using std::tuple_size;
892 #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
902 #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE
919 const char*
pattern()
const {
return pattern_; }
926 return FullMatch(
str.c_str(), re);
929 return PartialMatch(
str.c_str(), re);
932 static bool FullMatch(
const char*
str,
const RE& re);
933 static bool PartialMatch(
const char*
str,
const RE& re);
936 void Init(
const char* regex);
937 const char* pattern_;
940 # if GTEST_USES_POSIX_RE
943 regex_t partial_regex_;
945 # else // GTEST_USES_SIMPLE_RE
947 const char* full_pattern_;
952 #endif // GTEST_USES_PCRE
995 #if !defined(GTEST_LOG_)
997 # define GTEST_LOG_(severity) \
998 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
999 __FILE__, __LINE__).GetStream()
1004 #endif // !defined(GTEST_LOG_)
1006 #if !defined(GTEST_CHECK_)
1021 # define GTEST_CHECK_(condition) \
1022 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
1023 if (::testing::internal::IsTrue(condition)) \
1026 GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
1027 #endif // !defined(GTEST_CHECK_)
1034 #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
1035 if (const int gtest_error = (posix_call)) \
1036 GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
1050 template <
typename T>
1051 struct ConstRef {
typedef const T&
type; };
1052 template <
typename T>
1056 #define GTEST_REFERENCE_TO_CONST_(T) \
1057 typename ::testing::internal::ConstRef<T>::type
1079 template<
typename To>
1103 template<
typename To,
typename From>
1120 return static_cast<To
>(
f);
1128 template <
class Derived,
class Base>
1134 #if GTEST_HAS_DOWNCAST_
1135 return ::down_cast<Derived*>(
base);
1136 #elif GTEST_HAS_RTTI
1137 return dynamic_cast<Derived*
>(
base);
1139 return static_cast<Derived*
>(
base);
1143 #if GTEST_HAS_STREAM_REDIRECTION
1156 #endif // GTEST_HAS_STREAM_REDIRECTION
1166 #if GTEST_HAS_DEATH_TEST
1168 std::vector<std::string> GetInjectableArgvs();
1170 void SetInjectableArgvs(
const std::vector<std::string>* new_argvs);
1171 void SetInjectableArgvs(
const std::vector<std::string>& new_argvs);
1172 void ClearInjectableArgvs();
1174 #endif // GTEST_HAS_DEATH_TEST
1177 #if GTEST_IS_THREADSAFE
1179 # if GTEST_OS_WINDOWS
1189 typedef void* Handle;
1191 explicit AutoHandle(Handle
handle);
1202 bool IsCloseable()
const;
1210 # if GTEST_HAS_NOTIFICATION_
1224 Notification() : notified_(
false) {}
1225 Notification(
const Notification&) =
delete;
1226 Notification& operator=(
const Notification&) =
delete;
1231 std::lock_guard<std::mutex> lock(
mu_);
1238 void WaitForNotification() {
1239 std::unique_lock<std::mutex> lock(
mu_);
1240 cv_.wait(lock, [
this]() {
return notified_; });
1245 std::condition_variable
cv_;
1248 # endif // GTEST_HAS_NOTIFICATION_
1253 # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
1260 class ThreadWithParamBase {
1262 virtual ~ThreadWithParamBase() {}
1263 virtual void Run() = 0;
1272 extern "C" inline void* ThreadFuncWithCLinkage(
void*
thread) {
1273 static_cast<ThreadWithParamBase*
>(
thread)->
Run();
1289 template <
typename T>
1290 class ThreadWithParam :
public ThreadWithParamBase {
1292 typedef void UserThreadFunc(
T);
1294 ThreadWithParam(UserThreadFunc*
func,
T param, Notification* thread_can_start)
1297 thread_can_start_(thread_can_start),
1299 ThreadWithParamBase*
const base =
this;
1303 pthread_create(&
thread_,
nullptr, &ThreadFuncWithCLinkage,
base));
1305 ~ThreadWithParam()
override {
Join(); }
1314 void Run()
override {
1315 if (thread_can_start_ !=
nullptr) thread_can_start_->WaitForNotification();
1320 UserThreadFunc*
const func_;
1324 Notification*
const thread_can_start_;
1331 # endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||
1334 # if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
1338 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
1356 enum MutexType { kStatic = 0, kDynamic = 1 };
1360 enum StaticConstructorSelector { kStaticMutex = 0 };
1365 explicit Mutex(StaticConstructorSelector ) {}
1380 void ThreadSafeLazyInit();
1384 unsigned int owner_thread_id_;
1389 long critical_section_init_phase_;
1390 GTEST_CRITICAL_SECTION* critical_section_;
1395 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1396 extern ::testing::internal::Mutex mutex
1398 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
1399 ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)
1406 class GTestMutexLock {
1423 class ThreadLocalValueHolderBase {
1425 virtual ~ThreadLocalValueHolderBase() {}
1430 class ThreadLocalBase {
1436 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const = 0;
1439 ThreadLocalBase() {}
1440 virtual ~ThreadLocalBase() {}
1453 static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
1454 const ThreadLocalBase* thread_local_instance);
1457 static void OnThreadLocalDestroyed(
1458 const ThreadLocalBase* thread_local_instance);
1468 virtual ~Runnable() {}
1469 virtual void Run() = 0;
1472 ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
1473 virtual ~ThreadWithParamBase();
1480 template <
typename T>
1481 class ThreadWithParam :
public ThreadWithParamBase {
1483 typedef void UserThreadFunc(
T);
1485 ThreadWithParam(UserThreadFunc*
func,
T param, Notification* thread_can_start)
1486 : ThreadWithParamBase(
new RunnableImpl(
func, param), thread_can_start) {
1488 virtual ~ThreadWithParam() {}
1491 class RunnableImpl :
public Runnable {
1493 RunnableImpl(UserThreadFunc*
func,
T param)
1497 virtual ~RunnableImpl() {}
1498 virtual void Run() {
1503 UserThreadFunc*
const func_;
1539 template <
typename T>
1540 class ThreadLocal :
public ThreadLocalBase {
1542 ThreadLocal() : default_factory_(
new DefaultValueHolderFactory()) {}
1544 : default_factory_(
new InstanceValueHolderFactory(
value)) {}
1546 ~
ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(
this); }
1548 T*
pointer() {
return GetOrCreateValue(); }
1549 const T*
pointer()
const {
return GetOrCreateValue(); }
1556 class ValueHolder :
public ThreadLocalValueHolderBase {
1558 ValueHolder() :
value_() {}
1569 T* GetOrCreateValue()
const {
1570 return static_cast<ValueHolder*
>(
1571 ThreadLocalRegistry::GetValueOnCurrentThread(
this))->
pointer();
1574 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const {
1575 return default_factory_->MakeNewHolder();
1578 class ValueHolderFactory {
1580 ValueHolderFactory() {}
1581 virtual ~ValueHolderFactory() {}
1582 virtual ValueHolder* MakeNewHolder()
const = 0;
1588 class DefaultValueHolderFactory :
public ValueHolderFactory {
1590 DefaultValueHolderFactory() {}
1591 ValueHolder* MakeNewHolder()
const override {
return new ValueHolder(); }
1597 class InstanceValueHolderFactory :
public ValueHolderFactory {
1600 ValueHolder* MakeNewHolder()
const override {
1601 return new ValueHolder(
value_);
1610 std::unique_ptr<ValueHolderFactory> default_factory_;
1615 # elif GTEST_HAS_PTHREAD
1623 owner_ = pthread_self();
1639 void AssertHeld()
const {
1640 GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
1641 <<
"The current thread is not holding the mutex @" <<
this;
1662 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1663 extern ::testing::internal::MutexBase mutex
1671 #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
1672 ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0}
1676 class Mutex :
public MutexBase {
1695 class GTestMutexLock {
1716 class ThreadLocalValueHolderBase {
1718 virtual ~ThreadLocalValueHolderBase() {}
1723 extern "C" inline void DeleteThreadLocalValue(
void* value_holder) {
1724 delete static_cast<ThreadLocalValueHolderBase*
>(value_holder);
1728 template <
typename T>
1732 :
key_(CreateKey()), default_factory_(
new DefaultValueHolderFactory()) {}
1733 explicit ThreadLocal(
const T&
value)
1734 :
key_(CreateKey()),
1735 default_factory_(
new InstanceValueHolderFactory(
value)) {}
1739 DeleteThreadLocalValue(pthread_getspecific(
key_));
1746 T* pointer() {
return GetOrCreateValue(); }
1747 const T* pointer()
const {
return GetOrCreateValue(); }
1748 const T&
get()
const {
return *pointer(); }
1753 class ValueHolder :
public ThreadLocalValueHolderBase {
1755 ValueHolder() :
value_() {}
1758 T* pointer() {
return &
value_; }
1765 static pthread_key_t CreateKey() {
1770 pthread_key_create(&
key, &DeleteThreadLocalValue));
1774 T* GetOrCreateValue()
const {
1775 ThreadLocalValueHolderBase*
const holder =
1776 static_cast<ThreadLocalValueHolderBase*
>(pthread_getspecific(
key_));
1777 if (holder !=
nullptr) {
1778 return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
1781 ValueHolder*
const new_holder = default_factory_->MakeNewHolder();
1782 ThreadLocalValueHolderBase*
const holder_base = new_holder;
1784 return new_holder->pointer();
1787 class ValueHolderFactory {
1789 ValueHolderFactory() {}
1790 virtual ~ValueHolderFactory() {}
1791 virtual ValueHolder* MakeNewHolder()
const = 0;
1797 class DefaultValueHolderFactory :
public ValueHolderFactory {
1799 DefaultValueHolderFactory() {}
1800 ValueHolder* MakeNewHolder()
const override {
return new ValueHolder(); }
1806 class InstanceValueHolderFactory :
public ValueHolderFactory {
1809 ValueHolder* MakeNewHolder()
const override {
1810 return new ValueHolder(
value_);
1820 const pthread_key_t
key_;
1821 std::unique_ptr<ValueHolderFactory> default_factory_;
1826 # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
1828 #else // GTEST_IS_THREADSAFE
1843 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1844 extern ::testing::internal::Mutex mutex
1846 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
1853 class GTestMutexLock {
1860 template <
typename T>
1873 #endif // GTEST_IS_THREADSAFE
1879 #if GTEST_OS_WINDOWS
1880 # define GTEST_PATH_SEP_ "\\"
1881 # define GTEST_HAS_ALT_PATH_SEP_ 1
1883 # define GTEST_PATH_SEP_ "/"
1884 # define GTEST_HAS_ALT_PATH_SEP_ 0
1885 #endif // GTEST_OS_WINDOWS
1895 return isalpha(
static_cast<unsigned char>(
ch)) != 0;
1898 return isalnum(
static_cast<unsigned char>(
ch)) != 0;
1901 return isdigit(
static_cast<unsigned char>(
ch)) != 0;
1904 return islower(
static_cast<unsigned char>(
ch)) != 0;
1907 return isspace(
static_cast<unsigned char>(
ch)) != 0;
1910 return isupper(
static_cast<unsigned char>(
ch)) != 0;
1913 return isxdigit(
static_cast<unsigned char>(
ch)) != 0;
1915 #ifdef __cpp_char8_t
1917 return isxdigit(
static_cast<unsigned char>(
ch)) != 0;
1921 const unsigned char low_byte =
static_cast<unsigned char>(
ch);
1922 return ch == low_byte &&
isxdigit(low_byte) != 0;
1925 const unsigned char low_byte =
static_cast<unsigned char>(
ch);
1926 return ch == low_byte &&
isxdigit(low_byte) != 0;
1929 const unsigned char low_byte =
static_cast<unsigned char>(
ch);
1930 return ch == low_byte &&
isxdigit(low_byte) != 0;
1934 return static_cast<char>(tolower(
static_cast<unsigned char>(
ch)));
1937 return static_cast<char>(toupper(
static_cast<unsigned char>(
ch)));
1957 #if GTEST_OS_WINDOWS
1961 # ifdef __BORLANDC__
1962 inline int DoIsATTY(
int fd) {
return isatty(fd); }
1963 inline int StrCaseCmp(
const char* s1,
const char* s2) {
1964 return stricmp(s1, s2);
1966 inline char*
StrDup(
const char* src) {
return strdup(src); }
1967 # else // !__BORLANDC__
1968 # if GTEST_OS_WINDOWS_MOBILE
1969 inline int DoIsATTY(
int ) {
return 0; }
1971 inline int DoIsATTY(
int fd) {
return _isatty(fd); }
1972 # endif // GTEST_OS_WINDOWS_MOBILE
1973 inline int StrCaseCmp(
const char* s1,
const char* s2) {
1974 return _stricmp(s1, s2);
1976 inline char*
StrDup(
const char* src) {
return _strdup(src); }
1977 # endif // __BORLANDC__
1979 # if GTEST_OS_WINDOWS_MOBILE
1986 inline int RmDir(
const char* dir) {
return _rmdir(dir); }
1988 return (_S_IFDIR & st.st_mode) != 0;
1990 # endif // GTEST_OS_WINDOWS_MOBILE
1992 #elif GTEST_OS_ESP8266
1996 inline int DoIsATTY(
int fd) {
return isatty(fd); }
2001 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2004 inline char*
StrDup(
const char* src) {
return strdup(src); }
2005 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2006 inline bool IsDir(
const StatStruct& st) {
return S_ISDIR(st.st_mode); }
2013 inline int DoIsATTY(
int fd) {
return isatty(fd); }
2015 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2018 inline char*
StrDup(
const char* src) {
return strdup(src); }
2019 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2020 inline bool IsDir(
const StatStruct& st) {
return S_ISDIR(st.st_mode); }
2022 #endif // GTEST_OS_WINDOWS
2024 inline int IsATTY(
int fd) {
2028 int savedErrno = errno;
2043 #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \
2044 !GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 && !GTEST_OS_XTENSA
2045 inline int ChDir(
const char* dir) {
return chdir(dir); }
2048 #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
2049 struct wchar_codecvt :
public std::codecvt<wchar_t, char, std::mbstate_t> {};
2050 std::wstring_convert<wchar_codecvt>
converter;
2053 return _wfopen(wide_path.c_str(), wide_mode.c_str());
2054 #else // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
2056 #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
2058 #if !GTEST_OS_WINDOWS_MOBILE
2065 #if !GTEST_OS_WINDOWS_MOBILE
2066 inline int Read(
int fd,
void*
buf,
unsigned int count) {
2069 inline int Write(
int fd,
const void*
buf,
unsigned int count) {
2072 inline int Close(
int fd) {
return close(fd); }
2073 inline const char*
StrError(
int errnum) {
return strerror(errnum); }
2075 inline const char*
GetEnv(
const char*
name) {
2076 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
2077 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA
2079 static_cast<void>(
name);
2081 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
2085 return (
env !=
nullptr &&
env[0] !=
'\0') ?
env :
nullptr;
2093 #if GTEST_OS_WINDOWS_MOBILE
2097 [[noreturn]]
void Abort();
2099 [[noreturn]]
inline void Abort() { abort(); }
2100 #endif // GTEST_OS_WINDOWS_MOBILE
2109 #if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE
2111 # define GTEST_SNPRINTF_(buffer, size, format, ...) \
2112 _snprintf_s(buffer, size, size, format, __VA_ARGS__)
2113 #elif defined(_MSC_VER)
2115 # define GTEST_SNPRINTF_ _snprintf
2117 # define GTEST_SNPRINTF_ snprintf
2146 template <
size_t size>
2147 class TypeWithSize {
2176 #if !defined(GTEST_FLAG)
2177 # define GTEST_FLAG(name) FLAGS_gtest_##name
2178 #endif // !defined(GTEST_FLAG)
2180 #if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
2181 # define GTEST_USE_OWN_FLAGFILE_FLAG_ 1
2182 #endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
2184 #if !defined(GTEST_DECLARE_bool_)
2185 # define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver
2188 #define GTEST_DECLARE_bool_(name) \
2189 namespace testing { \
2190 GTEST_API_ extern bool GTEST_FLAG(name); \
2191 } static_assert(true, "no-op to require trailing semicolon")
2192 #define GTEST_DECLARE_int32_(name) \
2193 namespace testing { \
2194 GTEST_API_ extern std::int32_t GTEST_FLAG(name); \
2195 } static_assert(true, "no-op to require trailing semicolon")
2196 #define GTEST_DECLARE_string_(name) \
2197 namespace testing { \
2198 GTEST_API_ extern ::std::string GTEST_FLAG(name); \
2199 } static_assert(true, "no-op to require trailing semicolon")
2202 #define GTEST_DEFINE_bool_(name, default_val, doc) \
2203 namespace testing { \
2204 GTEST_API_ bool GTEST_FLAG(name) = (default_val); \
2205 } static_assert(true, "no-op to require trailing semicolon")
2206 #define GTEST_DEFINE_int32_(name, default_val, doc) \
2207 namespace testing { \
2208 GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val); \
2209 } static_assert(true, "no-op to require trailing semicolon")
2210 #define GTEST_DEFINE_string_(name, default_val, doc) \
2211 namespace testing { \
2212 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val); \
2213 } static_assert(true, "no-op to require trailing semicolon")
2215 #endif // !defined(GTEST_DECLARE_bool_)
2217 #if !defined(GTEST_FLAG_GET)
2218 #define GTEST_FLAG_GET(name) ::testing::GTEST_FLAG(name)
2219 #define GTEST_FLAG_SET(name, value) (void)(::testing::GTEST_FLAG(name) = value)
2220 #endif // !defined(GTEST_FLAG_GET)
2223 #if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
2224 # define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
2225 # define GTEST_LOCK_EXCLUDED_(locks)
2226 #endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
2244 #if !defined(GTEST_INTERNAL_DEPRECATED)
2254 #if defined(_MSC_VER)
2255 #define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message))
2256 #elif defined(__GNUC__)
2257 #define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message)))
2259 #define GTEST_INTERNAL_DEPRECATED(message)
2262 #endif // !defined(GTEST_INTERNAL_DEPRECATED)
2267 #define GTEST_INTERNAL_HAS_ANY 1
2268 #include "absl/types/any.h"
2275 #ifdef __has_include
2276 #if __has_include(<any>) && __cplusplus >= 201703L
2279 #define GTEST_INTERNAL_HAS_ANY 1
2283 using Any = ::std::any;
2288 #endif // __has_include(<any>) && __cplusplus >= 201703L
2289 #endif // __has_include
2290 #endif // GTEST_HAS_ABSL
2295 #define GTEST_INTERNAL_HAS_OPTIONAL 1
2296 #include "absl/types/optional.h"
2299 template <
typename T>
2301 inline ::absl::nullopt_t Nullopt() { return ::absl::nullopt; }
2305 #ifdef __has_include
2306 #if __has_include(<optional>) && __cplusplus >= 201703L
2309 #define GTEST_INTERNAL_HAS_OPTIONAL 1
2313 template <
typename T>
2314 using Optional = ::std::optional<T>;
2315 inline ::std::nullopt_t Nullopt() { return ::std::nullopt; }
2320 #endif // __has_include(<optional>) && __cplusplus >= 201703L
2321 #endif // __has_include
2322 #endif // GTEST_HAS_ABSL
2327 # define GTEST_INTERNAL_HAS_STRING_VIEW 1
2328 #include "absl/strings/string_view.h"
2335 # ifdef __has_include
2336 # if __has_include(<string_view>) && __cplusplus >= 201703L
2339 # define GTEST_INTERNAL_HAS_STRING_VIEW 1
2340 #include <string_view>
2348 # endif // __has_include(<string_view>) && __cplusplus >= 201703L
2349 # endif // __has_include
2350 #endif // GTEST_HAS_ABSL
2355 #define GTEST_INTERNAL_HAS_VARIANT 1
2356 #include "absl/types/variant.h"
2359 template <
typename...
T>
2364 #ifdef __has_include
2365 #if __has_include(<variant>) && __cplusplus >= 201703L
2368 #define GTEST_INTERNAL_HAS_VARIANT 1
2372 template <
typename...
T>
2373 using Variant = ::std::variant<
T...>;
2377 #endif // __has_include(<variant>) && __cplusplus >= 201703L
2378 #endif // __has_include
2379 #endif // GTEST_HAS_ABSL
2381 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_