1aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc. 2aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved. 3aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 4aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without 5aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are 6aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met: 7aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 8aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Redistributions of source code must retain the above copyright 9aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer. 10aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Redistributions in binary form must reproduce the above 11aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer 12aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the 13aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution. 14aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Neither the name of Google Inc. nor the names of its 15aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from 16aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission. 17aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 18aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 30aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: wan@google.com (Zhanyong Wan) 31aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 32aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Low-level types and utilities for porting Google Test to various 33aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms. They are subject to change without notice. DO NOT USE 34aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEM IN USER CODE. 35aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 36aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file is fundamental to Google Test. All other Google Test source 37aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// files are expected to #include this. Therefore, it cannot #include 38aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// any other Google Test header. 39aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 40aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 41aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 42aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 43aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user can define the following macros in the build script to 44aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// control Google Test's behavior. If the user doesn't define a macro 45aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in this list, Google Test will define it. 46aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 47aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) 48aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is/isn't available. 49aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions 50aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are enabled. 51aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string 52aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is/isn't available (some systems define 53aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::string, which is different to std::string). 54aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string 55aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is/isn't available (some systems define 56aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::wstring, which is different to std::wstring). 57aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular 58aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expressions are/aren't available. 59aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h> 60aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is/isn't available. 61aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't 62aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// enabled. 63aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that 64aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// std::wstring does/doesn't work (Google Test can 65aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// be used where std::wstring is unavailable). 66aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple 67aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is/isn't available. 68aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the 69aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler supports Microsoft's "Structured 70aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Exception Handling". 71aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_STREAM_REDIRECTION 72aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - Define it to 1/0 to indicate whether the 73aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platform supports I/O stream redirection using 74aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// dup() and dup2(). 75aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google 76aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Test's own tr1 tuple implementation should be 77aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// used. Unused when the user sets 78aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_TR1_TUPLE to 0. 79aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test 80aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is building in C++11/C++98 mode. 81aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_LINKED_AS_SHARED_LIBRARY 82aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - Define to 1 when compiling tests that use 83aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test as a shared library (known as 84aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DLL on Windows). 85aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_CREATE_SHARED_LIBRARY 86aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - Define to 1 when compiling Google Test itself 87aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as a shared library. 88aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 89aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header defines the following utilities: 90aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 91aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros indicating the current platform (defined to 1 if compiled on 92aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the given platform; otherwise undefined): 93aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_AIX - IBM AIX 94aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_CYGWIN - Cygwin 95aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_HPUX - HP-UX 96aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_LINUX - Linux 97aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_LINUX_ANDROID - Google Android 98aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_MAC - Mac OS X 99aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_IOS - iOS 100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_IOS_SIMULATOR - iOS simulator 101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_NACL - Google Native Client (NaCl) 102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_OPENBSD - OpenBSD 103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_QNX - QNX 104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_SOLARIS - Sun Solaris 105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_SYMBIAN - Symbian 106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) 107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop 108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_WINDOWS_MINGW - MinGW 109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_WINDOWS_MOBILE - Windows Mobile 110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_OS_ZOS - z/OS 111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the 113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// most stable support. Since core members of the Google Test project 114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// don't have access to other platforms, support for them may be less 115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// stable. If you notice any problems on your platform, please notify 116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// googletestframework@googlegroups.com (patches for fixing them are 117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// even more welcome!). 118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note that it is possible that none of the GTEST_OS_* macros are defined. 120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros indicating available Google Test features (defined to 1 if 122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the corresponding feature is supported; otherwise undefined): 123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized 124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tests) 125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_DEATH_TEST - death tests 126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_PARAM_TEST - value-parameterized tests 127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_TYPED_TEST - typed tests 128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_TYPED_TEST_P - type-parameterized tests 129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with 130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_POSIX_RE (see above) which users can 131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// define themselves. 132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_USES_SIMPLE_RE - our own simple regex is used; 133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the above two are mutually exclusive. 134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ(). 135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for basic C++ coding: 137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. 138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a 139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// variable don't have to be used. 140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DISALLOW_ASSIGN_ - disables operator=. 141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. 142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. 143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synchronization: 145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Mutex, MutexLock, ThreadLocal, GetThreadCount() 146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - synchronization primitives. 147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above 148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// synchronization primitives have real implementations 149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and Google Test is thread-safe; or 0 otherwise. 150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Template meta programming: 152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. 153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IteratorTraits - partial implementation of std::iterator_traits, which 154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is not available in libCstd when compiled with Sun C++. 155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Smart pointers: 157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// scoped_ptr - as in TR2. 158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Regular expressions: 160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// RE - a simple regular expression class using the POSIX 161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Extended Regular Expression syntax on UNIX-like 162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms, or a reduced regular exception syntax on 163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// other platforms, including Windows. 164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Logging: 166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_LOG_() - logs messages at the specified severity level. 167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LogToStderr() - directs all log messages to stderr. 168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FlushInfoLog() - flushes informational log messages. 169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Stdout and stderr capturing: 171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CaptureStdout() - starts capturing stdout. 172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetCapturedStdout() - stops capturing stdout and returns the captured 173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// string. 174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CaptureStderr() - starts capturing stderr. 175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetCapturedStderr() - stops capturing stderr and returns the captured 176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// string. 177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Integer types: 179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TypeWithSize - maps an integer to a int type. 180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Int32, UInt32, Int64, UInt64, TimeInMillis 181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - integers of known sizes. 182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// BiggestInt - the biggest signed integer type. 183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Command-line utilities: 185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_FLAG() - references a flag. 186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DECLARE_*() - declares a flag. 187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DEFINE_*() - defines a flag. 188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetInjectableArgvs() - returns the command line as a vector of strings. 189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Environment variable utilities: 191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetEnv() - gets the value of an environment variable. 192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// BoolFromGTestEnv() - parses a bool environment variable. 193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Int32FromGTestEnv() - parses an Int32 environment variable. 194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StringFromGTestEnv() - parses a string environment variable. 195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <ctype.h> // for isspace, etc 197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stddef.h> // for ptrdiff_t 198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdlib.h> 199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdio.h> 200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string.h> 201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef _WIN32_WCE 202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <sys/types.h> 203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <sys/stat.h> 204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // !_WIN32_WCE 205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined __APPLE__ 207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <AvailabilityMacros.h> 208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <TargetConditionals.h> 209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <iostream> // NOLINT 212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <sstream> // NOLINT 213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string> // NOLINT 214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" 216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG_PREFIX_ "gtest_" 217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG_PREFIX_DASH_ "gtest-" 218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" 219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_NAME_ "Google Test" 220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" 221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines the version of gcc that is used to compile this. 223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __GNUC__ 224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 40302 means version 4.3.2. 225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_GCC_VER_ \ 226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) 227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // __GNUC__ 228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines the platform on which Google Test is compiled. 230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __CYGWIN__ 231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_CYGWIN 1 232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __SYMBIAN32__ 233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_SYMBIAN 1 234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined _WIN32 235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_WINDOWS 1 236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef _WIN32_WCE 237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_WINDOWS_MOBILE 1 238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__MINGW__) || defined(__MINGW32__) 239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_WINDOWS_MINGW 1 240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_WINDOWS_DESKTOP 1 242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // _WIN32_WCE 243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __APPLE__ 244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_MAC 1 245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if TARGET_OS_IPHONE 246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_IOS 1 247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if TARGET_IPHONE_SIMULATOR 248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_IOS_SIMULATOR 1 249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __linux__ 252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_LINUX 1 253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined __ANDROID__ 254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_LINUX_ANDROID 1 255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __MVS__ 257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_ZOS 1 258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__sun) && defined(__SVR4) 259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_SOLARIS 1 260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(_AIX) 261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_AIX 1 262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__hpux) 263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_HPUX 1 264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __native_client__ 265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_NACL 1 266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __OpenBSD__ 267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_OPENBSD 1 268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __QNX__ 269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_QNX 1 270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // __CYGWIN__ 271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_LANG_CXX11 273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when 274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a 275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value for __cplusplus, and recent versions of clang, gcc, and 276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// probably other compilers set that too in C++11 mode. 277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L 278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Compiling in at least C++11 mode. 279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_LANG_CXX11 1 280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_LANG_CXX11 0 282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Brings in definitions for functions used in the testing::internal::posix 286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace (read, write, close, chdir, isatty, stat). We do not currently 287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use them on Windows Mobile. 2887f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#if GTEST_OS_WINDOWS 2897f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# if !GTEST_OS_WINDOWS_MOBILE 2907f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# include <direct.h> 2917f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# include <io.h> 2927f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# endif 2937f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// In order to avoid having to include <windows.h>, use forward declaration 2947f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// assuming CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION. 2957f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// This assumption is verified by 2967f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION. 2977f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanstruct _RTL_CRITICAL_SECTION; 2987f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#else 299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This assumes that non-Windows OSes provide unistd.h. For OSes where this 300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is not the case, we need to include headers that provide the functions 301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// mentioned above. 302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <unistd.h> 303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <strings.h> 3047f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#endif // GTEST_OS_WINDOWS 305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_LINUX_ANDROID 307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used to define __ANDROID_API__ matching the target NDK API level. 308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <android/api-level.h> // NOLINT 309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines this to true iff Google Test can use POSIX regular expressions. 312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_POSIX_RE 313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX_ANDROID 314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Android, <regex.h> is only available starting with Gingerbread. 315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) 316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) 318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_POSIX_RE 322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On some platforms, <regex.h> needs someone to define size_t, and 324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// won't compile otherwise. We can #include it here as we already 325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// included <stdlib.h>, which is guaranteed to define size_t through 326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <stddef.h>. 327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <regex.h> // NOLINT 328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USES_POSIX_RE 1 330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif GTEST_OS_WINDOWS 332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <regex.h> is not available on Windows. Use our own simple regex 334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation instead. 335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USES_SIMPLE_RE 1 336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <regex.h> may not be available on this platform. Use our own 340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// simple regex implementation instead. 341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USES_SIMPLE_RE 1 342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_POSIX_RE 344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_EXCEPTIONS 346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether exceptions are enabled, so we need 347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out. 348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined(_MSC_VER) || defined(__BORLANDC__) 349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS 350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macro to enable exceptions, so we'll do the same. 351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Assumes that exceptions are enabled by default. 352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifndef _HAS_EXCEPTIONS 353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define _HAS_EXCEPTIONS 1 354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // _HAS_EXCEPTIONS 355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS 356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__GNUC__) && __EXCEPTIONS 357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. 358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_EXCEPTIONS 1 359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__SUNPRO_CC) 360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sun Pro CC supports exceptions. However, there is no compile-time way of 361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// detecting whether they are enabled or not. Therefore, we assume that 362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// they are enabled unless the user tells us otherwise. 363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_EXCEPTIONS 1 364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__IBMCPP__) && __EXCEPTIONS 365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled. 366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_EXCEPTIONS 1 367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__HP_aCC) 368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Exception handling is in effect by default in HP aCC compiler. It has to 369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// be turned of by +noeh compiler option if desired. 370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_EXCEPTIONS 1 371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For other compilers, we assume exceptions are disabled to be 373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// conservative. 374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_EXCEPTIONS 0 375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // defined(_MSC_VER) || defined(__BORLANDC__) 376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_EXCEPTIONS 377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !defined(GTEST_HAS_STD_STRING) 379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Even though we don't use this macro any longer, we keep it in case 380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// some clients still depend on it. 381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_STD_STRING 1 382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif !GTEST_HAS_STD_STRING 383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user told us that ::std::string isn't available. 384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# error "Google Test cannot be used where ::std::string isn't available." 385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // !defined(GTEST_HAS_STD_STRING) 386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_GLOBAL_STRING 388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether ::string is available, so we need 389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out. 390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_GLOBAL_STRING 0 392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_GLOBAL_STRING 394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_STD_WSTRING 396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether ::std::wstring is available, so we need 397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out. 398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring 399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is available. 400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Cygwin 1.7 and below doesn't support ::std::wstring. 402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Solaris' libc++ doesn't support it either. Android has 403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// no support for it at least as recent as Froyo (2.2). 404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_STD_WSTRING \ 405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) 406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_STD_WSTRING 408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_GLOBAL_WSTRING 410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether ::wstring is available, so we need 411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out. 412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_GLOBAL_WSTRING \ 413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) 414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_GLOBAL_WSTRING 415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether RTTI is available. 417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_RTTI 418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether RTTI is enabled, so we need to 419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// figure it out. 420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef _MSC_VER 422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. 424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 1 425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 0 427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. 430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) 431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef __GXX_RTTI 433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When building against STLport with the Android NDK and with 434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// -frtti -fno-exceptions, the build fails at link time with undefined 435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// references to __cxa_bad_typeid. Note sure if STL or toolchain bug, 436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// so disable RTTI when detected. 437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ 438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter !defined(__EXCEPTIONS) 439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 0 440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 1 442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS 443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 0 445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // __GXX_RTTI 446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends 448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the 449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// first version with C++ support. 450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__clang__) 451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI __has_feature(cxx_rtti) 453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if 455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// both the typeid and dynamic_cast features are present. 456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) 457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef __RTTI_ALL__ 459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 1 460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 0 462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For all other compilers, we assume RTTI is enabled. 467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_RTTI 1 468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // _MSC_VER 470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_RTTI 472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// It's this header's responsibility to #include <typeinfo> when RTTI 474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is enabled. 475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_RTTI 476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <typeinfo> 477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether Google Test can use the pthreads library. 480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_PTHREAD 481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us explicitly, so we assume pthreads support is 482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// available on Linux and Mac. 483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to your compiler flags. 486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \ 487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter || GTEST_OS_QNX) 488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_PTHREAD 489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PTHREAD 491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is 492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// true. 493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <pthread.h> // NOLINT 494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For timespec and nanosleep, used below. 496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <time.h> // NOLINT 497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether Google Test can use tr1/tuple. You can define 500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this macro to 0 to prevent Google Test from using tuple (any 501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// feature depending on tuple with be disabled in this mode). 502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_TR1_TUPLE 503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) 504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>. 505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_TR1_TUPLE 0 506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us not to do it, so we assume it's OK. 508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_TR1_TUPLE 1 509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_TR1_TUPLE 511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether Google Test's own tr1 tuple implementation 513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// should be used. 514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_USE_OWN_TR1_TUPLE 515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us, so we need to figure it out. 516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We use our own TR1 tuple if we aren't sure the user has an 518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation of it already. At this time, libstdc++ 4.0.0+ and 519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC 2010 are the only mainstream standard libraries that come 520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler 521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pretends to be GCC by defining __GNUC__ and friends, but cannot 522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1 523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tuple in a 323 MB Feature Pack download, which we cannot assume the 524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// user has. QNX's QCC compiler is a modified GCC but it doesn't 525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// support TR1 tuple. libc++ only provides std::tuple, in C++11 mode, 526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and it can be used with some compilers that define __GNUC__. 527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \ 528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600 529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ENV_HAS_TR1_TUPLE_ 1 530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used 533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6 534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can build with clang but need to use gcc4.2's libstdc++). 535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325) 536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ENV_HAS_STD_TUPLE_ 1 537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_ 540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USE_OWN_TR1_TUPLE 0 541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USE_OWN_TR1_TUPLE 1 543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_USE_OWN_TR1_TUPLE 546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To avoid conditional compilation everywhere, we make it 548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gtest-port.h's responsibility to #include the header implementing 549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tr1/tuple. 550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TR1_TUPLE 551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_USE_OWN_TR1_TUPLE 553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include "gtest/internal/gtest-tuple.h" 554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif GTEST_ENV_HAS_STD_TUPLE_ 555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <tuple> 556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C++11 puts its tuple into the ::std namespace rather than 557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::std::tr1. gtest expects tuple to live in ::std::tr1, so put it there. 558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This causes undefined behavior, but supported compilers react in 559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the way we intend. 560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace std { 561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace tr1 { 562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::get; 563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::make_tuple; 564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::tuple; 565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::tuple_element; 566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::tuple_size; 567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif GTEST_OS_SYMBIAN 571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to 573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use STLport's tuple implementation, which unfortunately doesn't 574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// work as the copy of STLport distributed with Symbian is incomplete. 575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to 576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use its own tuple implementation. 577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef BOOST_HAS_TR1_TUPLE 578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# undef BOOST_HAS_TR1_TUPLE 579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // BOOST_HAS_TR1_TUPLE 580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This prevents <boost/tr1/detail/config.hpp>, which defines 582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>. 583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED 584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <tuple> 585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) 587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does 588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// not conform to the TR1 spec, which requires the header to be <tuple>. 589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Until version 4.3.2, gcc has a bug that causes <tr1/functional>, 592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// which is #included by <tr1/tuple>, to not compile when RTTI is 593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// disabled. _TR1_FUNCTIONAL is the header guard for 594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <tr1/functional>. Hence the following #define is a hack to prevent 595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <tr1/functional> from being included. 596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define _TR1_FUNCTIONAL 1 597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <tr1/tuple> 598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# undef _TR1_FUNCTIONAL // Allows the user to #include 599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // <tr1/functional> if he chooses to. 600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <tr1/tuple> // NOLINT 602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the compiler is not GCC 4.0+, we assume the user is using a 606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// spec-conforming TR1 implementation. 607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <tuple> // NOLINT 608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // GTEST_USE_OWN_TR1_TUPLE 609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_TR1_TUPLE 611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether clone(2) is supported. 613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Usually it will only be available on Linux, excluding 614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Linux on the Itanium architecture. 615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Also see http://linux.die.net/man/2/clone. 616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_CLONE 617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us, so we need to figure it out. 618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX && !defined(__ia64__) 620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX_ANDROID 621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Android, clone() is only available on ARM starting with Gingerbread. 622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined(__arm__) && __ANDROID_API__ >= 9 623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CLONE 1 624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CLONE 0 626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CLONE 1 629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CLONE 0 632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // GTEST_OS_LINUX && !defined(__ia64__) 633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_CLONE 635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support stream redirection. This is used to test 637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// output correctness and to implement death tests. 638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_STREAM_REDIRECTION 639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// By default, we assume that stream redirection is supported on all 640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms except known mobile ones. 641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN 642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_STREAM_REDIRECTION 0 643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_STREAM_REDIRECTION 1 645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN 646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_STREAM_REDIRECTION 647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support death tests. 649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test does not support death tests for VC 7.1 and earlier as 650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// abort() in a VC 7.1 application compiled as GUI in debug config 651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pops up a dialog window that cannot be suppressed programmatically. 652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ 653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \ 654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ 655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \ 656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_OS_OPENBSD || GTEST_OS_QNX) 657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_DEATH_TEST 1 658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <vector> // NOLINT 659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We don't support MSVC 7.1 with exceptions disabled now. Therefore 662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// all the compilers we care about are adequate for supporting 663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value-parameterized tests. 664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_HAS_PARAM_TEST 1 665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support type-driven tests. 667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0, 669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sun Pro CC, IBM Visual Age, and HP aCC support. 670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ 671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter defined(__IBMCPP__) || defined(__HP_aCC) 672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_TYPED_TEST 1 673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_TYPED_TEST_P 1 674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support Combine(). This only makes sense when 677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value-parameterized tests are enabled. The implementation doesn't 678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// work on Sun Studio since it doesn't understand templated conversion 679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operators. 680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) 681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_COMBINE 1 682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether the system compiler uses UTF-16 for encoding wide strings. 685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_WIDE_STRING_USES_UTF16_ \ 686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) 687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether test results can be streamed to a socket. 689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_LINUX 690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_CAN_STREAM_RESULTS_ 1 691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines some utility macros. 694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The GNU compiler emits a warning if nested "if" statements are followed by 696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// an "else" statement and braces are not used to explicitly disambiguate the 697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "else" binding. This leads to problems with code like: 698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if (gate) 700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ASSERT_*(condition) << "Some message"; 701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The "switch (0) case 0:" idiom is used to suppress this. 703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __INTEL_COMPILER 704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ 705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT 707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Use this annotation at the end of a struct/class definition to 710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// prevent the compiler from optimizing away instances that are never 711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// used. This is useful when all interesting logic happens inside the 712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// c'tor and / or d'tor. Example: 713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// struct Foo { 715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Foo() { ... } 716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// } GTEST_ATTRIBUTE_UNUSED_; 717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Also use it after a variable or parameter declaration to tell the 719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler the variable/parameter does not have to be used. 720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GNUC__) && !defined(COMPILER_ICC) 721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ATTRIBUTE_UNUSED_ 724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A macro to disallow operator= 727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This should be used in the private: declarations for a class. 728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DISALLOW_ASSIGN_(type)\ 729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void operator=(type const &) 730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A macro to disallow copy constructor and operator= 732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This should be used in the private: declarations for a class. 733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ 734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter type(type const &);\ 735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_ASSIGN_(type) 736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tell the compiler to warn about unused return values for functions declared 738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with this macro. The macro should be used on function declarations 739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// following the argument list: 740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; 742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) 743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) 744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_MUST_USE_RESULT_ 746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC 747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determine whether the compiler supports Microsoft's Structured Exception 749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Handling. This is supported by several Windows compilers but generally 750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// does not exist on any other system. 751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_SEH 752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us, so we need to figure it out. 753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined(_MSC_VER) || defined(__BORLANDC__) 755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// These two compilers are known to support SEH. 756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_SEH 1 757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Assume no SEH. 759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_SEH 0 760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 7627f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#define GTEST_IS_THREADSAFE \ 7637f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan (GTEST_OS_WINDOWS || GTEST_HAS_PTHREAD) 7647f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_SEH 766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER 768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_LINKED_AS_SHARED_LIBRARY 770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_API_ __declspec(dllimport) 771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif GTEST_CREATE_SHARED_LIBRARY 772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_API_ __declspec(dllexport) 773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // _MSC_VER 776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 777cb5f2e62d9d7ab37bcd15a8dfdb1b0d585bd7f26Chia-I Wu#if defined(__GNUC__) && __GNUC__ >= 4 && GTEST_CREATE_SHARED_LIBRARY 778cb5f2e62d9d7ab37bcd15a8dfdb1b0d585bd7f26Chia-I Wu# define GTEST_API_ __attribute__((visibility("default"))) 779cb5f2e62d9d7ab37bcd15a8dfdb1b0d585bd7f26Chia-I Wu#endif 780cb5f2e62d9d7ab37bcd15a8dfdb1b0d585bd7f26Chia-I Wu 781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_API_ 782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_API_ 783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __GNUC__ 786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Ask the compiler to never inline a given function. 787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_NO_INLINE_ __attribute__((noinline)) 788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_NO_INLINE_ 790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project. 793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION) 794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CXXABI_H_ 1 795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CXXABI_H_ 0 797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing { 800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Message; 802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal { 804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A secret type that Google Test users don't know about. It has no 806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// definition on purpose. Therefore it's impossible to create a 807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Secret object, which is what we want. 808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Secret; 809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time 811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expression is true. For example, you could use it to verify the 812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// size of a static array: 813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, 815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// content_type_names_incorrect_size); 816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or to make sure a struct is smaller than a certain size: 818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large); 820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The second argument to the macro is the name of the variable. If 822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the expression is false, most compilers will issue a warning/error 823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// containing the name of the variable. 824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool> 826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct CompileAssert { 827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_COMPILE_ASSERT_(expr, msg) \ 830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \ 831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_ 832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implementation details of GTEST_COMPILE_ASSERT_: 834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1 836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// elements (and thus is invalid) when the expression is false. 837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - The simpler definition 839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1] 841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// does not work, as gcc supports variable-length arrays whose sizes 843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are determined at run-time (this is gcc's extension and not part 844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of the C++ standard). As a result, gcc fails to reject the 845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// following code with the simple definition: 846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// int foo; 848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is 849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// // not a compile-time constant. 850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - By using the type CompileAssert<(bool(expr))>, we ensures that 852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expr is a compile-time constant. (Template arguments must be 853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// determined at compile-time.) 854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - The outter parentheses in CompileAssert<(bool(expr))> are necessary 856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written 857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CompileAssert<bool(expr)> 859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead, these compilers will refuse to compile 861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_COMPILE_ASSERT_(5 > 0, some_message); 863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (They seem to think the ">" in "5 > 0" marks the end of the 865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// template argument list.) 866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - The array size is (bool(expr) ? 1 : -1), instead of simply 868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ((expr) ? 1 : -1). 870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is to avoid running into a bug in MS VC 7.1, which 872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. 873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h. 875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This template is declared, but intentionally undefined. 877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2> 878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct StaticAssertTypeEqHelper; 879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct StaticAssertTypeEqHelper<T, T> {}; 882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING 884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::string string; 885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::std::string string; 887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_GLOBAL_STRING 888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_WSTRING 890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::wstring wstring; 891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif GTEST_HAS_STD_WSTRING 892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::std::wstring wstring; 893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_GLOBAL_WSTRING 894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A helper for suppressing warnings on constant condition. It just 896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns 'condition'. 897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsTrue(bool condition); 898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines scoped_ptr. 900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This implementation of scoped_ptr is PARTIAL - it only contains 902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// enough stuff to satisfy Google Test's need. 903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass scoped_ptr { 905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef T element_type; 907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit scoped_ptr(T* p = NULL) : ptr_(p) {} 909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~scoped_ptr() { reset(); } 910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T& operator*() const { return *ptr_; } 912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* operator->() const { return ptr_; } 913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* get() const { return ptr_; } 914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* release() { 916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* const ptr = ptr_; 917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ptr_ = NULL; 918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return ptr; 919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void reset(T* p = NULL) { 922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (p != ptr_) { 923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. 924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter delete ptr_; 925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ptr_ = p; 927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* ptr_; 932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); 934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines RE. 937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended 939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Regular Expression syntax. 940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ RE { 941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // A copy constructor is required by the Standard to initialize object 943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // references from r-values. 944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter RE(const RE& other) { Init(other.pattern()); } 945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Constructs an RE from a string. 947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT 948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING 950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT 952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_GLOBAL_STRING 954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter RE(const char* regex) { Init(regex); } // NOLINT 956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~RE(); 957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the string representation of the regex. 959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* pattern() const { return pattern_; } 960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // FullMatch(str, re) returns true iff regular expression re matches 962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the entire str. 963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // PartialMatch(str, re) returns true iff regular expression re 964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // matches a substring of str (including str itself). 965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // TODO(wan@google.com): make FullMatch() and PartialMatch() work 967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // when str contains NUL characters. 968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool FullMatch(const ::std::string& str, const RE& re) { 969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return FullMatch(str.c_str(), re); 970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool PartialMatch(const ::std::string& str, const RE& re) { 972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return PartialMatch(str.c_str(), re); 973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING 976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool FullMatch(const ::string& str, const RE& re) { 978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return FullMatch(str.c_str(), re); 979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool PartialMatch(const ::string& str, const RE& re) { 981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return PartialMatch(str.c_str(), re); 982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_GLOBAL_STRING 985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool FullMatch(const char* str, const RE& re); 987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool PartialMatch(const char* str, const RE& re); 988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Init(const char* regex); 991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // We use a const char* instead of an std::string, as Google Test used to be 993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // used where std::string is not available. TODO(wan@google.com): change to 994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // std::string. 995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* pattern_; 996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool is_valid_; 997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_USES_POSIX_RE 999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter regex_t full_regex_; // For FullMatch(). 1001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter regex_t partial_regex_; // For PartialMatch(). 1002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else // GTEST_USES_SIMPLE_RE 1004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* full_pattern_; // For FullMatch(); 1006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 1008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_ASSIGN_(RE); 1010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats a source file path and a line number as they would appear 1013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in an error message from the compiler used to compile this code. 1014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ ::std::string FormatFileLocation(const char* file, int line); 1015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats a file location for compiler-independent XML output. 1017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Although this function is not platform dependent, we put it next to 1018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FormatFileLocation in order to contrast the two functions. 1019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, 1020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int line); 1021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines logging utilities: 1023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_LOG_(severity) - logs messages at the specified severity level. The 1024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// message itself is streamed into the macro. 1025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LogToStderr() - directs all log messages to stderr. 1026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FlushInfoLog() - flushes informational log messages. 1027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterenum GTestLogSeverity { 1029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_INFO, 1030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_WARNING, 1031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_ERROR, 1032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FATAL 1033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats log entry severity, provides a stream object for streaming the 1036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// log message, and terminates the message with a newline when going out of 1037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// scope. 1038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ GTestLog { 1039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTestLog(GTestLogSeverity severity, const char* file, int line); 1041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. 1043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~GTestLog(); 1044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::std::ostream& GetStream() { return ::std::cerr; } 1046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const GTestLogSeverity severity_; 1049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); 1051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_LOG_(severity) \ 1054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ 1055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter __FILE__, __LINE__).GetStream() 1056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void LogToStderr() {} 1058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void FlushInfoLog() { fflush(NULL); } 1059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE. 1061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition 1063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is not satisfied. 1064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synopsys: 1065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_CHECK_(boolean_condition); 1066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or 1067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_CHECK_(boolean_condition) << "Additional message"; 1068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This checks the condition and if the condition is not satisfied 1070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it prints message about the condition violation, including the 1071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// condition itself, plus additional message streamed into it, if any, 1072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and then it aborts the program. It aborts the program irrespective of 1073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// whether it is built in the debug mode or not. 1074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CHECK_(condition) \ 1075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (::testing::internal::IsTrue(condition)) \ 1077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ; \ 1078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter else \ 1079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_LOG_(FATAL) << "Condition " #condition " failed. " 1080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// An all-mode assert to verify that the given POSIX-style function 1082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// call returns 0 (indicating success). Known limitation: this 1083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// doesn't expand to a balanced 'if' statement, so enclose the macro 1084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in {} if you need to use it as the only statement in an 'if' 1085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// branch. 1086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ 1087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (const int gtest_error = (posix_call)) \ 1088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ 1089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << gtest_error 1090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. 1092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Use ImplicitCast_ as a safe version of static_cast for upcasting in 1094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a 1095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const Foo*). When you use ImplicitCast_, the compiler checks that 1096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the cast is safe. Such explicit ImplicitCast_s are necessary in 1097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// surprisingly many situations where C++ demands an exact type match 1098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead of an argument type convertable to a target type. 1099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The syntax for using ImplicitCast_ is the same as for static_cast: 1101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ImplicitCast_<ToType>(expr) 1103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ImplicitCast_ would have been part of the C++ standard library, 1105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// but the proposal was submitted too late. It will probably make 1106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// its way into the language in the future. 1107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This relatively ugly name is intentional. It prevents clashes with 1109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// similar functions users may have (e.g., implicit_cast). The internal 1110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace alone is not enough because the function can be found by ADL. 1111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename To> 1112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline To ImplicitCast_(To x) { return x; } 1113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When you upcast (that is, cast a pointer from type Foo to type 1115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts 1116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// always succeed. When you downcast (that is, cast a pointer from 1117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because 1118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// how do you know the pointer is really of type SubclassOfFoo? It 1119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, 1120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// when you downcast, you should use this macro. In debug mode, we 1121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use dynamic_cast<> to double-check the downcast is legal (we die 1122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if it's not). In normal mode, we do the efficient static_cast<> 1123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead. Thus, it's important to test in debug mode to make sure 1124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the cast is legal! 1125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is the only place in the code we should use dynamic_cast<>. 1126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In particular, you SHOULDN'T be using dynamic_cast<> in order to 1127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// do RTTI (eg code like this: 1128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo); 1129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo); 1130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You should design the code some other way not to need this. 1131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This relatively ugly name is intentional. It prevents clashes with 1133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// similar functions users may have (e.g., down_cast). The internal 1134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace alone is not enough because the function can be found by ADL. 1135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename To, typename From> // use like this: DownCast_<T*>(foo); 1136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline To DownCast_(From* f) { // so we only accept pointers 1137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Ensures that To is a sub-type of From *. This test is here only 1138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // for compile-time type checking, and has no overhead in an 1139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // optimized build at run-time, as it will be optimized away 1140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // completely. 1141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (false) { 1142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const To to = NULL; 1143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::ImplicitCast_<From*>(to); 1144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_RTTI 1147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // RTTI: debug mode only! 1148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL); 1149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 1150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return static_cast<To>(f); 1151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Downcasts the pointer of type Base to Derived. 1154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Derived must be a subclass of Base. The parameter MUST 1155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// point to a class of type Derived, not any subclass of it. 1156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When RTTI is available, the function performs a runtime 1157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// check to enforce this. 1158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Derived, class Base> 1159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterDerived* CheckedDowncastToActualType(Base* base) { 1160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_RTTI 1161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(typeid(*base) == typeid(Derived)); 1162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return dynamic_cast<Derived*>(base); // NOLINT 1163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 1164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return static_cast<Derived*>(base); // Poor man's downcast. 1165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 1166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STREAM_REDIRECTION 1169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines the stderr capturer: 1171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CaptureStdout - starts capturing stdout. 1172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetCapturedStdout - stops capturing stdout and returns the captured string. 1173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CaptureStderr - starts capturing stderr. 1174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetCapturedStderr - stops capturing stderr and returns the captured string. 1175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void CaptureStdout(); 1177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetCapturedStdout(); 1178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void CaptureStderr(); 1179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetCapturedStderr(); 1180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_STREAM_REDIRECTION 1182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST 1185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst ::std::vector<testing::internal::string>& GetInjectableArgvs(); 1187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid SetInjectableArgvs(const ::std::vector<testing::internal::string>* 1188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter new_argvs); 1189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A copy of all command line arguments. Set by InitGoogleTest(). 1191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterextern ::std::vector<testing::internal::string> g_argvs; 1192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_DEATH_TEST 1194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines synchronization primitives. 11967f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#if GTEST_IS_THREADSAFE 11977f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# if GTEST_HAS_PTHREAD 11987f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Sleeps for (roughly) n milliseconds. This function is only for testing 11997f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Google Test's own constructs. Don't use it in user tests, either 12007f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// directly or indirectly. 1201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void SleepMilliseconds(int n) { 1202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const timespec time = { 1203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 0, // 0 seconds. 1204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter n * 1000L * 1000L, // And n ms. 1205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter }; 1206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter nanosleep(&time, NULL); 1207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 12087f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# endif // GTEST_HAS_PTHREAD 1209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 12107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# if 0 // OS detection 12117f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# elif GTEST_HAS_PTHREAD 1212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Allows a controller thread to pause execution of newly created 1213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// threads until notified. Instances of this class must be created 1214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and destroyed in the controller thread. 1215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class is only for testing Google Test's own constructs. Do not 1217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use it in user tests, either directly or indirectly. 1218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Notification { 1219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Notification() : notified_(false) { 1221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); 1222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~Notification() { 1224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_destroy(&mutex_); 1225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Notifies all threads created with this notification to start. Must 1228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // be called from the controller thread. 1229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Notify() { 1230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_lock(&mutex_); 1231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter notified_ = true; 1232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_unlock(&mutex_); 1233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Blocks until the controller thread notifies. Must be called from a test 1236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // thread. 1237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void WaitForNotification() { 1238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter for (;;) { 1239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_lock(&mutex_); 1240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const bool notified = notified_; 1241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_unlock(&mutex_); 1242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (notified) 1243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter break; 1244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SleepMilliseconds(10); 1245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_t mutex_; 1250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool notified_; 1251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); 1253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 12557f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# elif GTEST_OS_WINDOWS 12567f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12577f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike StroyanGTEST_API_ void SleepMilliseconds(int n); 12587f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12597f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Provides leak-safe Windows kernel handle ownership. 12607f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Used in death tests and in threading support. 12617f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass GTEST_API_ AutoHandle { 12627f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 12637f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to 12647f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // avoid including <windows.h> in this header file. Including <windows.h> is 12657f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // undesirable because it defines a lot of symbols and macros that tend to 12667f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // conflict with client code. This assumption is verified by 12677f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // WindowsTypesTest.HANDLEIsVoidStar. 12687f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan typedef void* Handle; 12697f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan AutoHandle(); 12707f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan explicit AutoHandle(Handle handle); 12717f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12727f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ~AutoHandle(); 12737f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12747f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan Handle Get() const; 12757f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void Reset(); 12767f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void Reset(Handle handle); 12777f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12787f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 12797f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Returns true iff the handle is a valid handle object that can be closed. 12807f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan bool IsCloseable() const; 12817f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12827f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan Handle handle_; 12837f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12847f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); 12857f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 12867f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12877f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Allows a controller thread to pause execution of newly created 12887f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// threads until notified. Instances of this class must be created 12897f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// and destroyed in the controller thread. 12907f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// 12917f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// This class is only for testing Google Test's own constructs. Do not 12927f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// use it in user tests, either directly or indirectly. 12937f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass GTEST_API_ Notification { 12947f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 12957f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan Notification(); 12967f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void Notify(); 12977f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void WaitForNotification(); 12987f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 12997f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 13007f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan AutoHandle event_; 13017f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 13027f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); 13037f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 13047f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# endif // OS detection 13057f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 13067f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD 13077f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// defined, but we don't want to use MinGW's pthreads implementation, which 13087f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// has conformance problems with some versions of the POSIX standard. 13097f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW 13107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 1311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// As a C-function, ThreadFuncWithCLinkage cannot be templated itself. 1312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Consequently, it cannot select a correct instantiation of ThreadWithParam 1313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in order to call its Run(). Introducing ThreadWithParamBase as a 1314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// non-templated base class for ThreadWithParam allows us to bypass this 1315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// problem. 1316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadWithParamBase { 1317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~ThreadWithParamBase() {} 1319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void Run() = 0; 1320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pthread_create() accepts a pointer to a function type with the C linkage. 1323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// According to the Standard (7.5/1), function types with different linkages 1324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are different even if they are otherwise identical. Some compilers (for 1325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// example, SunStudio) treat them as different types. Since class methods 1326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// cannot be defined with C-linkage we need to define a free C-function to 1327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pass into pthread_create(). 1328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterextern "C" inline void* ThreadFuncWithCLinkage(void* thread) { 1329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static_cast<ThreadWithParamBase*>(thread)->Run(); 1330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return NULL; 1331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper class for testing Google Test's multi-threading constructs. 1334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To use it, write: 1335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// void ThreadFunc(int param) { /* Do things with param */ } 1337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Notification thread_can_start; 1338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ... 1339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// // The thread_can_start parameter is optional; you can supply NULL. 1340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start); 1341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// thread_can_start.Notify(); 1342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// These classes are only for testing Google Test's own constructs. Do 1344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// not use them in user tests, either directly or indirectly. 1345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadWithParam : public ThreadWithParamBase { 1347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 13487f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan typedef void UserThreadFunc(T); 1349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 13507f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) 1351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : func_(func), 1352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter param_(param), 1353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter thread_can_start_(thread_can_start), 1354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter finished_(false) { 1355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ThreadWithParamBase* const base = this; 1356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The thread can be created only after all fields except thread_ 1357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // have been initialized. 1358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_( 1359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base)); 1360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~ThreadWithParam() { Join(); } 1362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Join() { 1364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (!finished_) { 1365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0)); 1366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter finished_ = true; 1367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void Run() { 1371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (thread_can_start_ != NULL) 1372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter thread_can_start_->WaitForNotification(); 1373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter func_(param_); 1374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 13777f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan UserThreadFunc* const func_; // User-supplied thread function. 1378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const T param_; // User-supplied parameter to the thread function. 1379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // When non-NULL, used to block execution until the controller thread 1380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // notifies. 1381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Notification* const thread_can_start_; 1382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool finished_; // true iff we know that the thread function has finished. 1383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_t thread_; // The native thread object. 1384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); 1386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 13877f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# endif // GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW 13887f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 13897f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# if 0 // OS detection 13907f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# elif GTEST_OS_WINDOWS 1391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 13927f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Mutex implements mutex on Windows platforms. It is used in conjunction 13937f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// with class MutexLock: 1394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Mutex mutex; 1396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ... 13977f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// MutexLock lock(&mutex); // Acquires the mutex and releases it at the 13987f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// // end of the current scope. 1399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 14007f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// A static Mutex *must* be defined or declared using one of the following 14017f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// macros: 1402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); 14037f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); 14047f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// 14057f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// (A non-static Mutex is defined/declared in the usual way). 14067f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass GTEST_API_ Mutex { 14077f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 14087f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan enum MutexType { kStatic = 0, kDynamic = 1 }; 14097f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // We rely on kStaticMutex being 0 as it is to what the linker initializes 14107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // type_ in static mutexes. critical_section_ will be initialized lazily 14117f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // in ThreadSafeLazyInit(). 14127f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan enum StaticConstructorSelector { kStaticMutex = 0 }; 14137f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14147f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // This constructor intentionally does nothing. It relies on type_ being 14157f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // statically initialized to 0 (effectively setting it to kStatic) and on 14167f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // ThreadSafeLazyInit() to lazily initialize the rest of the members. 14177f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan explicit Mutex(StaticConstructorSelector /*dummy*/) {} 14187f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14197f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan Mutex(); 14207f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ~Mutex(); 14217f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14227f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void Lock(); 14237f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14247f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void Unlock(); 14257f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14267f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Does nothing if the current thread holds the mutex. Otherwise, crashes 14277f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // with high probability. 14287f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void AssertHeld(); 14297f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14307f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 14317f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Initializes owner_thread_id_ and critical_section_ in static mutexes. 14327f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void ThreadSafeLazyInit(); 14337f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14347f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Per http://blogs.msdn.com/b/oldnewthing/archive/2004/02/23/78395.aspx, 14357f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // we assume that 0 is an invalid value for thread IDs. 14367f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan unsigned int owner_thread_id_; 14377f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14387f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // For static mutexes, we rely on these members being initialized to zeros 14397f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // by the linker. 14407f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan MutexType type_; 14417f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan long critical_section_init_phase_; // NOLINT 14427f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan _RTL_CRITICAL_SECTION* critical_section_; 14437f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14447f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); 14457f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 14467f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14477f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 14487f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan extern ::testing::internal::Mutex mutex 14497f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14507f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 14517f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) 14527f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14537f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// We cannot name this class MutexLock because the ctor declaration would 14547f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// conflict with a macro named MutexLock, which is defined on some 14557f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// platforms. That macro is used as a defensive measure to prevent against 14567f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than 14577f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// "MutexLock l(&mu)". Hence the typedef trick below. 14587f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass GTestMutexLock { 14597f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 14607f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan explicit GTestMutexLock(Mutex* mutex) 14617f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan : mutex_(mutex) { mutex_->Lock(); } 14627f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14637f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ~GTestMutexLock() { mutex_->Unlock(); } 14647f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14657f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 14667f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan Mutex* const mutex_; 14677f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14687f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); 14697f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 14707f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14717f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyantypedef GTestMutexLock MutexLock; 14727f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14737f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Base class for ValueHolder<T>. Allows a caller to hold and delete a value 14747f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// without knowing its type. 14757f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass ThreadLocalValueHolderBase { 14767f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 14777f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ~ThreadLocalValueHolderBase() {} 14787f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 14797f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14807f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Provides a way for a thread to send notifications to a ThreadLocal 14817f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// regardless of its parameter type. 14827f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass ThreadLocalBase { 14837f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 14847f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Creates a new ValueHolder<T> object holding a default value passed to 14857f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // this ThreadLocal<T>'s constructor and returns it. It is the caller's 14867f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // responsibility not to call this when the ThreadLocal<T> instance already 14877f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // has a value on the current thread. 14887f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0; 14897f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14907f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan protected: 14917f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ThreadLocalBase() {} 14927f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ~ThreadLocalBase() {} 14937f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14947f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 14957f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase); 14967f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 14977f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 14987f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Maps a thread to a set of ThreadLocals that have values instantiated on that 14997f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// thread and notifies them when the thread exits. A ThreadLocal instance is 15007f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// expected to persist until all threads it has values on have terminated. 15017f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass GTEST_API_ ThreadLocalRegistry { 15027f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 15037f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Registers thread_local_instance as having value on the current thread. 15047f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Returns a value that can be used to identify the thread from other threads. 15057f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan static ThreadLocalValueHolderBase* GetValueOnCurrentThread( 15067f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan const ThreadLocalBase* thread_local_instance); 15077f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15087f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Invoked when a ThreadLocal instance is destroyed. 15097f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan static void OnThreadLocalDestroyed( 15107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan const ThreadLocalBase* thread_local_instance); 15117f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 15127f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15137f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass GTEST_API_ ThreadWithParamBase { 15147f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 15157f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void Join(); 15167f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15177f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan protected: 15187f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan class Runnable { 15197f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 15207f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ~Runnable() {} 15217f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual void Run() = 0; 15227f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan }; 15237f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15247f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start); 15257f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ~ThreadWithParamBase(); 15267f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15277f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 15287f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan AutoHandle thread_; 15297f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 15307f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15317f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Helper class for testing Google Test's multi-threading constructs. 15327f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyantemplate <typename T> 15337f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass ThreadWithParam : public ThreadWithParamBase { 15347f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 15357f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan typedef void UserThreadFunc(T); 15367f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15377f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) 15387f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) { 15397f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan } 15407f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ~ThreadWithParam() {} 15417f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15427f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 15437f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan class RunnableImpl : public Runnable { 15447f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 15457f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan RunnableImpl(UserThreadFunc* func, T param) 15467f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan : func_(func), 15477f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan param_(param) { 15487f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan } 15497f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ~RunnableImpl() {} 15507f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual void Run() { 15517f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan func_(param_); 15527f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan } 15537f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15547f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 15557f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan UserThreadFunc* const func_; 15567f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan const T param_; 15577f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15587f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl); 15597f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan }; 15607f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15617f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); 15627f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 15637f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15647f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Implements thread-local storage on Windows systems. 15657f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// 15667f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// // Thread 1 15677f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// ThreadLocal<int> tl(100); // 100 is the default value for each thread. 1568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 15697f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// // Thread 2 15707f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// tl.set(150); // Changes the value for thread 2 only. 15717f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// EXPECT_EQ(150, tl.get()); 1572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 15737f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// // Thread 1 15747f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. 15757f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// tl.set(200); 15767f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// EXPECT_EQ(200, tl.get()); 15777f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// 15787f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// The template type argument T must have a public copy constructor. 15797f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// In addition, the default ThreadLocal constructor requires T to have 15807f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// a public default constructor. 15817f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// 15827f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// The users of a TheadLocal instance have to make sure that all but one 15837f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// threads (including the main one) using that instance have exited before 15847f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// destroying it. Otherwise, the per-thread objects managed for them by the 15857f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// ThreadLocal instance are not guaranteed to be destroyed on all platforms. 1586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 15877f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// Google Test only uses global ThreadLocal objects. That means they 15887f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// will die after main() has returned. Therefore, no per-thread 15897f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// object managed by Google Test will be leaked as long as all threads 15907f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// using Google Test have exited when main() returns. 15917f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyantemplate <typename T> 15927f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyanclass ThreadLocal : public ThreadLocalBase { 15937f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 15947f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ThreadLocal() : default_() {} 15957f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan explicit ThreadLocal(const T& value) : default_(value) {} 15967f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15977f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); } 15987f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 15997f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan T* pointer() { return GetOrCreateValue(); } 16007f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan const T* pointer() const { return GetOrCreateValue(); } 16017f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan const T& get() const { return *pointer(); } 16027f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan void set(const T& value) { *pointer() = value; } 16037f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16047f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 16057f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // Holds a value of T. Can be deleted via its base class without the caller 16067f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan // knowing the type of T. 16077f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan class ValueHolder : public ThreadLocalValueHolderBase { 16087f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan public: 16097f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan explicit ValueHolder(const T& value) : value_(value) {} 16107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16117f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan T* pointer() { return &value_; } 16127f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16137f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan private: 16147f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan T value_; 16157f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); 16167f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan }; 16177f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16187f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16197f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan T* GetOrCreateValue() const { 16207f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan return static_cast<ValueHolder*>( 16217f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer(); 16227f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan } 16237f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16247f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const { 16257f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan return new ValueHolder(default_); 16267f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan } 16277f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16287f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan const T default_; // The default value for each thread. 16297f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16307f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); 16317f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan}; 16327f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16337f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# elif GTEST_HAS_PTHREAD 16347f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan 16357f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// MutexBase and Mutex implement mutex on pthreads-based platforms. 1636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass MutexBase { 1637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Acquires this mutex. 1639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Lock() { 1640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); 1641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter owner_ = pthread_self(); 1642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter has_owner_ = true; 1643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Releases this mutex. 1646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Unlock() { 1647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Since the lock is being released the owner_ field should no longer be 1648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // considered valid. We don't protect writing to has_owner_ here, as it's 1649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the caller's responsibility to ensure that the current thread holds the 1650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // mutex when this is called. 1651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter has_owner_ = false; 1652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); 1653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Does nothing if the current thread holds the mutex. Otherwise, crashes 1656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // with high probability. 1657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void AssertHeld() const { 1658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self())) 1659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "The current thread is not holding the mutex @" << this; 1660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // A static mutex may be used before main() is entered. It may even 1663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // be used before the dynamic initialization stage. Therefore we 1664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // must be able to initialize a static mutex object at link time. 1665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This means MutexBase has to be a POD and its member variables 1666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // have to be public. 1667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_mutex_t mutex_; // The underlying pthread mutex. 1669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // has_owner_ indicates whether the owner_ field below contains a valid thread 1670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All 1671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // accesses to the owner_ field should be protected by a check of this field. 1672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // An alternative might be to memset() owner_ to all zeros, but there's no 1673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // guarantee that a zero'd pthread_t is necessarily invalid or even different 1674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // from pthread_self(). 1675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool has_owner_; 1676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_t owner_; // The thread holding the mutex. 1677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Forward-declares a static mutex. 16807f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 16817f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan extern ::testing::internal::MutexBase mutex 1682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines and statically (i.e. at link time) initializes a static mutex. 1684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The initialization list here does not explicitly initialize each field, 1685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead relying on default initialization for the unspecified fields. In 1686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// particular, the owner_ field (a pthread_t) is not explicitly initialized. 1687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This allows initialization to work whether pthread_t is a scalar or struct. 1688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The flag -Wmissing-field-initializers must not be specified for this to work. 16897f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 16907f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false } 1691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Mutex class can only be used for mutexes created at runtime. It 1693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// shares its API with MutexBase otherwise. 1694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Mutex : public MutexBase { 1695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Mutex() { 1697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); 1698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter has_owner_ = false; 1699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~Mutex() { 1701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); 1702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); 1706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 17087f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// We cannot name this class MutexLock because the ctor declaration would 1709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// conflict with a macro named MutexLock, which is defined on some 17107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// platforms. That macro is used as a defensive measure to prevent against 17117f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than 17127f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// "MutexLock l(&mu)". Hence the typedef trick below. 1713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTestMutexLock { 1714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit GTestMutexLock(MutexBase* mutex) 1716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : mutex_(mutex) { mutex_->Lock(); } 1717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~GTestMutexLock() { mutex_->Unlock(); } 1719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter MutexBase* const mutex_; 1722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); 1724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef GTestMutexLock MutexLock; 1727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helpers for ThreadLocal. 1729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pthread_key_create() requires DeleteThreadLocalValue() to have 1731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C-linkage. Therefore it cannot be templatized to access 1732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ThreadLocal<T>. Hence the need for class 1733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ThreadLocalValueHolderBase. 1734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadLocalValueHolderBase { 1735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~ThreadLocalValueHolderBase() {} 1737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Called by pthread to delete thread-local data stored by 1740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pthread_setspecific(). 1741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterextern "C" inline void DeleteThreadLocalValue(void* value_holder) { 1742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter delete static_cast<ThreadLocalValueHolderBase*>(value_holder); 1743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements thread-local storage on pthreads-based systems. 1746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadLocal { 1748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ThreadLocal() : key_(CreateKey()), 1750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter default_() {} 1751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit ThreadLocal(const T& value) : key_(CreateKey()), 1752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter default_(value) {} 1753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~ThreadLocal() { 1755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Destroys the managed object for the current thread, if any. 1756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter DeleteThreadLocalValue(pthread_getspecific(key_)); 1757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Releases resources associated with the key. This will *not* 1759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // delete managed objects for other threads. 1760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); 1761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* pointer() { return GetOrCreateValue(); } 1764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const T* pointer() const { return GetOrCreateValue(); } 1765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const T& get() const { return *pointer(); } 1766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void set(const T& value) { *pointer() = value; } 1767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Holds a value of type T. 1770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter class ValueHolder : public ThreadLocalValueHolderBase { 1771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit ValueHolder(const T& value) : value_(value) {} 1773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* pointer() { return &value_; } 1775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T value_; 1778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); 1779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter }; 1780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static pthread_key_t CreateKey() { 1782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_key_t key; 1783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // When a thread exits, DeleteThreadLocalValue() will be called on 1784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the object managed for that thread. 1785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_( 1786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter pthread_key_create(&key, &DeleteThreadLocalValue)); 1787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return key; 1788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* GetOrCreateValue() const { 1791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ThreadLocalValueHolderBase* const holder = 1792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_)); 1793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (holder != NULL) { 1794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return CheckedDowncastToActualType<ValueHolder>(holder)->pointer(); 1795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ValueHolder* const new_holder = new ValueHolder(default_); 1798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ThreadLocalValueHolderBase* const holder_base = new_holder; 1799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); 1800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return new_holder->pointer(); 1801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // A key pthreads uses for looking up per-thread values. 1804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const pthread_key_t key_; 1805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const T default_; // The default value for each thread. 1806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); 1808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 18107f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan# endif // OS detection 1811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 18127f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#else // GTEST_IS_THREADSAFE 1813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A dummy implementation of synchronization primitives (mutex, lock, 1815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and thread-local variable). Necessary for compiling Google Test where 1816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// mutex is not supported - using Google Test in multiple threads is not 1817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// supported on such platforms. 1818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Mutex { 1820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Mutex() {} 1822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Lock() {} 1823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Unlock() {} 1824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void AssertHeld() const {} 1825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter extern ::testing::internal::Mutex mutex 1829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex 1831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 18327f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// We cannot name this class MutexLock because the ctor declaration would 18337f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// conflict with a macro named MutexLock, which is defined on some 18347f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// platforms. That macro is used as a defensive measure to prevent against 18357f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than 18367f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan// "MutexLock l(&mu)". Hence the typedef trick below. 1837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTestMutexLock { 1838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit GTestMutexLock(Mutex*) {} // NOLINT 1840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef GTestMutexLock MutexLock; 1843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadLocal { 1846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ThreadLocal() : value_() {} 1848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit ThreadLocal(const T& value) : value_(value) {} 1849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T* pointer() { return &value_; } 1850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const T* pointer() const { return &value_; } 1851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const T& get() const { return value_; } 1852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void set(const T& value) { value_ = value; } 1853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter T value_; 1855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 18577f8dbdff67f33b8e6259342f0bda6bdaeabb93dcMike Stroyan#endif // GTEST_IS_THREADSAFE 1858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the number of threads running in the process, or 0 to indicate that 1860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// we cannot detect it. 1861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ size_t GetThreadCount(); 1862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Passing non-POD classes through ellipsis (...) crashes the ARM 1864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler and generates a warning in Sun Studio. The Nokia Symbian 1865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and the IBM XL C/C++ compiler try to instantiate a copy constructor 1866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for objects passed through ellipsis (...), failing for uncopyable 1867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// objects. We define this to ensure that only POD is passed through 1868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ellipsis on these systems. 1869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) 1870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We lose support for NULL detection where the compiler doesn't like 1871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// passing non-POD classes through ellipsis (...). 1872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ELLIPSIS_NEEDS_POD_ 1 1873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 1874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_CAN_COMPARE_NULL 1 1875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 1876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between 1878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const T& and const T* in a function template. These compilers 1879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// _can_ decide between class template specializations for T and T*, 1880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// so a tr1::type_traits-like is_pointer works. 1881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__SYMBIAN32__) || defined(__IBMCPP__) 1882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_NEEDS_IS_POINTER_ 1 1883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 1884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool bool_value> 1886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct bool_constant { 1887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef bool_constant<bool_value> type; 1888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static const bool value = bool_value; 1889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool bool_value> const bool bool_constant<bool_value>::value; 1891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef bool_constant<false> false_type; 1893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef bool_constant<true> true_type; 1894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct is_pointer : public false_type {}; 1897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct is_pointer<T*> : public true_type {}; 1900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Iterator> 1902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IteratorTraits { 1903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef typename Iterator::value_type value_type; 1904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IteratorTraits<T*> { 1908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef T value_type; 1909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 1912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IteratorTraits<const T*> { 1913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef T value_type; 1914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS 1917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_PATH_SEP_ "\\" 1918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_ALT_PATH_SEP_ 1 1919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The biggest signed integer type the compiler supports. 1920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef __int64 BiggestInt; 1921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 1922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_PATH_SEP_ "/" 1923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_ALT_PATH_SEP_ 0 1924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef long long BiggestInt; // NOLINT 1925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_OS_WINDOWS 1926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Utilities for char. 1928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// isspace(int ch) and friends accept an unsigned char or EOF. char 1930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// may be signed, depending on the compiler (or compiler flags). 1931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Therefore we need to cast a char to unsigned char before calling 1932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// isspace(), etc. 1933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsAlpha(char ch) { 1935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return isalpha(static_cast<unsigned char>(ch)) != 0; 1936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsAlNum(char ch) { 1938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return isalnum(static_cast<unsigned char>(ch)) != 0; 1939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsDigit(char ch) { 1941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return isdigit(static_cast<unsigned char>(ch)) != 0; 1942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsLower(char ch) { 1944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return islower(static_cast<unsigned char>(ch)) != 0; 1945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsSpace(char ch) { 1947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return isspace(static_cast<unsigned char>(ch)) != 0; 1948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsUpper(char ch) { 1950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return isupper(static_cast<unsigned char>(ch)) != 0; 1951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsXDigit(char ch) { 1953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return isxdigit(static_cast<unsigned char>(ch)) != 0; 1954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsXDigit(wchar_t ch) { 1956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const unsigned char low_byte = static_cast<unsigned char>(ch); 1957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return ch == low_byte && isxdigit(low_byte) != 0; 1958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char ToLower(char ch) { 1961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return static_cast<char>(tolower(static_cast<unsigned char>(ch))); 1962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char ToUpper(char ch) { 1964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return static_cast<char>(toupper(static_cast<unsigned char>(ch))); 1965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The testing::internal::posix namespace holds wrappers for common 1968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// POSIX functions. These wrappers hide the differences between 1969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Windows/MSVC and POSIX systems. Since some compilers define these 1970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// standard functions as macros, the wrapper cannot have the same name 1971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as the wrapped function. 1972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace posix { 1974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Functions with a different name on Windows. 1976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS 1978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef struct _stat StatStruct; 1980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef __BORLANDC__ 1982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int fd) { return isatty(fd); } 1983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int StrCaseCmp(const char* s1, const char* s2) { 1984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return stricmp(s1, s2); 1985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char* StrDup(const char* src) { return strdup(src); } 1987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else // !__BORLANDC__ 1988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_WINDOWS_MOBILE 1989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int /* fd */) { return 0; } 1990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 1991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int fd) { return _isatty(fd); } 1992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // GTEST_OS_WINDOWS_MOBILE 1993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int StrCaseCmp(const char* s1, const char* s2) { 1994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return _stricmp(s1, s2); 1995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char* StrDup(const char* src) { return _strdup(src); } 1997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // __BORLANDC__ 1998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_WINDOWS_MOBILE 2000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); } 2001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this 2002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// time and thus not defined there. 2003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 2004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FileNo(FILE* file) { return _fileno(file); } 2005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } 2006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int RmDir(const char* dir) { return _rmdir(dir); } 2007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsDir(const StatStruct& st) { 2008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return (_S_IFDIR & st.st_mode) != 0; 2009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // GTEST_OS_WINDOWS_MOBILE 2011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 2013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef struct stat StatStruct; 2015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FileNo(FILE* file) { return fileno(file); } 2017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int fd) { return isatty(fd); } 2018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } 2019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int StrCaseCmp(const char* s1, const char* s2) { 2020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return strcasecmp(s1, s2); 2021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char* StrDup(const char* src) { return strdup(src); } 2023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int RmDir(const char* dir) { return rmdir(dir); } 2024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } 2025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_OS_WINDOWS 2027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Functions deprecated by MSVC 8.0. 2029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER 2031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Temporarily disable warning 4996 (deprecated function). 2032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(push) 2033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(disable:4996) 2034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* StrNCpy(char* dest, const char* src, size_t n) { 2037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return strncpy(dest, src, n); 2038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and 2041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StrError() aren't needed on Windows CE at this time and thus not 2042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defined there. 2043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS_MOBILE 2045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int ChDir(const char* dir) { return chdir(dir); } 2046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline FILE* FOpen(const char* path, const char* mode) { 2048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return fopen(path, mode); 2049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS_MOBILE 2051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline FILE *FReopen(const char* path, const char* mode, FILE* stream) { 2052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return freopen(path, mode, stream); 2053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } 2055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FClose(FILE* fp) { return fclose(fp); } 2057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS_MOBILE 2058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Read(int fd, void* buf, unsigned int count) { 2059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return static_cast<int>(read(fd, buf, count)); 2060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Write(int fd, const void* buf, unsigned int count) { 2062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return static_cast<int>(write(fd, buf, count)); 2063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Close(int fd) { return close(fd); } 2065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* StrError(int errnum) { return strerror(errnum); } 2066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* GetEnv(const char* name) { 2068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS_MOBILE 2069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // We are on Windows CE, which has no environment variables. 2070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return NULL; 2071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) 2072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Environment variables which we programmatically clear will be set to the 2073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // empty string rather than unset (NULL). Handle that case. 2074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* const env = getenv(name); 2075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return (env != NULL && env[0] != '\0') ? env : NULL; 2076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 2077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return getenv(name); 2078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 2080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER 2082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(pop) // Restores the warning state. 2083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS_MOBILE 2086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Windows CE has no C library. The abort() function is used in 2087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// several places in Google Test. This implementation provides a reasonable 2088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// imitation of standard behaviour. 2089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid Abort(); 2090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 2091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void Abort() { abort(); } 2092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_OS_WINDOWS_MOBILE 2093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace posix 2095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC "deprecates" snprintf and issues warnings wherever it is used. In 2097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// order to avoid these warnings, we need to use _snprintf or _snprintf_s on 2098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate 2099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function in order to achieve that. We use macro definition here because 2100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// snprintf is a variadic function. 2101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE 2102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC 2005 and above support variadic macros. 2103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_SNPRINTF_(buffer, size, format, ...) \ 2104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter _snprintf_s(buffer, size, size, format, __VA_ARGS__) 2105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(_MSC_VER) 2106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't 2107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// complain about _snprintf. 2108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_SNPRINTF_ _snprintf 2109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 2110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_SNPRINTF_ snprintf 2111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 2112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The maximum number a BiggestInt can represent. This definition 2114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// works no matter BiggestInt is represented in one's complement or 2115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// two's complement. 2116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 2117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We cannot rely on numeric_limits in STL, as __int64 and long long 2118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are not part of standard C++ and numeric_limits doesn't need to be 2119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defined for them. 2120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst BiggestInt kMaxBiggestInt = 2121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1)); 2122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This template class serves as a compile-time function from size to 2124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type. It maps a size in bytes to a primitive type with that 2125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// size. e.g. 2126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 2127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TypeWithSize<4>::UInt 2128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 2129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is typedef-ed to be unsigned int (unsigned integer made up of 4 2130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// bytes). 2131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 2132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Such functionality should belong to STL, but I cannot find it 2133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// there. 2134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 2135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test uses this class in the implementation of floating-point 2136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// comparison. 2137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 2138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For now it only handles UInt (unsigned int) as that's all Google Test 2139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// needs. Other types can be easily added in the future if need 2140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// arises. 2141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <size_t size> 2142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithSize { 2143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 2144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This prevents the user from using TypeWithSize<N> with incorrect 2145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // values of N. 2146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef void UInt; 2147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 2148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The specialization for size 4. 2150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <> 2151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithSize<4> { 2152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 2153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // unsigned int has size 4 in both gcc and MSVC. 2154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 2155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // As base/basictypes.h doesn't compile on Windows, we cannot use 2156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // uint32, uint64, and etc here. 2157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef int Int; 2158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef unsigned int UInt; 2159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 2160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The specialization for size 8. 2162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <> 2163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithSize<8> { 2164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 2165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS 2166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef __int64 Int; 2167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef unsigned __int64 UInt; 2168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else 2169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef long long Int; // NOLINT 2170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef unsigned long long UInt; // NOLINT 2171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_OS_WINDOWS 2172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 2173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Integer types of known sizes. 2175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<4>::Int Int32; 2176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<4>::UInt UInt32; 2177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<8>::Int Int64; 2178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<8>::UInt UInt64; 2179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. 2180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Utilities for command line flags and environment variables. 2182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macro for referencing flags. 2184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG(name) FLAGS_gtest_##name 2185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for declaring flags. 2187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) 2188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DECLARE_int32_(name) \ 2189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) 2190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DECLARE_string_(name) \ 2191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_API_ extern ::std::string GTEST_FLAG(name) 2192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for defining flags. 2194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEFINE_bool_(name, default_val, doc) \ 2195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_API_ bool GTEST_FLAG(name) = (default_val) 2196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEFINE_int32_(name, default_val, doc) \ 2197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) 2198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEFINE_string_(name, default_val, doc) \ 2199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) 2200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Thread annotations 2202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) 2203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_LOCK_EXCLUDED_(locks) 2204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses 'str' for a 32-bit signed integer. If successful, writes the result 2206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to *value and returns true; otherwise leaves *value unchanged and returns 2207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// false. 2208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TODO(chandlerc): Find a better way to refactor flag and environment parsing 2209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// out of both gtest-port.cc and gtest.cc to avoid exporting this utility 2210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function. 2211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool ParseInt32(const Message& src_text, const char* str, Int32* value); 2212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses a bool/Int32/string from the environment variable 2214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// corresponding to the given Google Test flag. 2215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool BoolFromGTestEnv(const char* flag, bool default_val); 2216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); 2217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char* StringFromGTestEnv(const char* flag, const char* default_val); 2218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace internal 2220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace testing 2221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 2222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 2223