11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2005, Google Inc. 21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved. 31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without 51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are 61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met: 71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Redistributions of source code must retain the above copyright 91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer. 101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Redistributions in binary form must reproduce the above 111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer 121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the 131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution. 141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Neither the name of Google Inc. nor the names of its 151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from 161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission. 171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Authors: wan@google.com (Zhanyong Wan) 311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Low-level types and utilities for porting Google Test to various 331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// platforms. They are subject to change without notice. DO NOT USE 341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEM IN USER CODE. 351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user can define the following macros in the build script to 401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// control Google Test's behavior. If the user doesn't define a macro 411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in this list, Google Test will define it. 421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) 441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is/isn't available. 4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions 4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// are enabled. 471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string 481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is/isn't available (some systems define 491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ::string, which is different to std::string). 501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string 511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is/isn't available (some systems define 521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ::wstring, which is different to std::wstring). 5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular 5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// expressions are/aren't available. 551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h> 561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is/isn't available. 571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't 581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// enabled. 591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that 601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// std::wstring does/doesn't work (Google Test can 611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// be used where std::wstring is unavailable). 6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple 631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is/isn't available. 6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the 6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// compiler supports Microsoft's "Structured 6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Exception Handling". 6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_STREAM_REDIRECTION 6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - Define it to 1/0 to indicate whether the 6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// platform supports I/O stream redirection using 7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// dup() and dup2(). 7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google 7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Test's own tr1 tuple implementation should be 7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// used. Unused when the user sets 7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_TR1_TUPLE to 0. 7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_LINKED_AS_SHARED_LIBRARY 7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - Define to 1 when compiling tests that use 7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Google Test as a shared library (known as 7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DLL on Windows). 7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_CREATE_SHARED_LIBRARY 8041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - Define to 1 when compiling Google Test itself 8141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// as a shared library. 821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This header defines the following utilities: 841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros indicating the current platform (defined to 1 if compiled on 861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the given platform; otherwise undefined): 8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_AIX - IBM AIX 881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_OS_CYGWIN - Cygwin 8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_HPUX - HP-UX 901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_OS_LINUX - Linux 9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_LINUX_ANDROID - Google Android 921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_OS_MAC - Mac OS X 9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_NACL - Google Native Client (NaCl) 941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_OS_SOLARIS - Sun Solaris 951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_OS_SYMBIAN - Symbian 9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) 9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop 9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_WINDOWS_MINGW - MinGW 9941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_OS_WINDOWS_MOBILE - Windows Mobile 1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_OS_ZOS - z/OS 1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the 1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// most stable support. Since core members of the Google Test project 1041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// don't have access to other platforms, support for them may be less 1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// stable. If you notice any problems on your platform, please notify 1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// googletestframework@googlegroups.com (patches for fixing them are 1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// even more welcome!). 1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Note that it is possible that none of the GTEST_OS_* macros are defined. 1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros indicating available Google Test features (defined to 1 if 1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the corresponding feature is supported; otherwise undefined): 1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized 1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// tests) 1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_DEATH_TEST - death tests 1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_PARAM_TEST - value-parameterized tests 1171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_TYPED_TEST - typed tests 1181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_TYPED_TEST_P - type-parameterized tests 11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with 12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_HAS_POSIX_RE (see above) which users can 12141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// define themselves. 1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_USES_SIMPLE_RE - our own simple regex is used; 1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the above two are mutually exclusive. 12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ(). 1251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros for basic C++ coding: 1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. 12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a 12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// variable don't have to be used. 13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_DISALLOW_ASSIGN_ - disables operator=. 1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. 1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. 1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synchronization: 1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Mutex, MutexLock, ThreadLocal, GetThreadCount() 1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// - synchronization primitives. 1371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above 1381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// synchronization primitives have real implementations 1391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// and Google Test is thread-safe; or 0 otherwise. 1401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Template meta programming: 1421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. 14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// IteratorTraits - partial implementation of std::iterator_traits, which 14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// is not available in libCstd when compiled with Sun C++. 1451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Smart pointers: 1471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// scoped_ptr - as in TR2. 1481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Regular expressions: 1501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// RE - a simple regular expression class using the POSIX 15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Extended Regular Expression syntax on UNIX-like 15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// platforms, or a reduced regular exception syntax on 15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// other platforms, including Windows. 1541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Logging: 1561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_LOG_() - logs messages at the specified severity level. 1571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LogToStderr() - directs all log messages to stderr. 1581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// FlushInfoLog() - flushes informational log messages. 1591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Stdout and stderr capturing: 16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// CaptureStdout() - starts capturing stdout. 16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GetCapturedStdout() - stops capturing stdout and returns the captured 16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// string. 1641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// CaptureStderr() - starts capturing stderr. 1651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GetCapturedStderr() - stops capturing stderr and returns the captured 1661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// string. 1671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Integer types: 1691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TypeWithSize - maps an integer to a int type. 1701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Int32, UInt32, Int64, UInt64, TimeInMillis 1711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// - integers of known sizes. 1721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// BiggestInt - the biggest signed integer type. 1731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Command-line utilities: 1751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_FLAG() - references a flag. 1761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_DECLARE_*() - declares a flag. 1771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_DEFINE_*() - defines a flag. 1781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GetArgvs() - returns the command line as a vector of strings. 1791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 1801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Environment variable utilities: 1811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GetEnv() - gets the value of an environment variable. 1821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// BoolFromGTestEnv() - parses a bool environment variable. 1831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Int32FromGTestEnv() - parses an Int32 environment variable. 1841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// StringFromGTestEnv() - parses a string environment variable. 1851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <ctype.h> // for isspace, etc 18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <stddef.h> // for ptrdiff_t 1881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <stdlib.h> 1891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <stdio.h> 19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <string.h> 19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef _WIN32_WCE 19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <sys/types.h> 19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <sys/stat.h> 19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // !_WIN32_WCE 19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <iostream> // NOLINT 19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <sstream> // NOLINT 19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <string> // NOLINT 1991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" 2011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_FLAG_PREFIX_ "gtest_" 20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_FLAG_PREFIX_DASH_ "gtest-" 2031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" 2041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_NAME_ "Google Test" 2051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" 2061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines the version of gcc that is used to compile this. 2081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __GNUC__ 2091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 40302 means version 4.3.2. 21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_GCC_VER_ \ 2111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) 2121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // __GNUC__ 2131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines the platform on which Google Test is compiled. 2151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __CYGWIN__ 21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_CYGWIN 1 21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif defined __SYMBIAN32__ 21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_SYMBIAN 1 21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif defined _WIN32 22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_WINDOWS 1 22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef _WIN32_WCE 22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_WINDOWS_MOBILE 1 22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__MINGW__) || defined(__MINGW32__) 22441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_WINDOWS_MINGW 1 22541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 22641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_WINDOWS_DESKTOP 1 22741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // _WIN32_WCE 2281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined __APPLE__ 22941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_MAC 1 230f6071db8c6f4192253a3c544379ad35dcb64dab0Nicolas Catania#elif defined ANDROID 23141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_LINUX_ANDROID 1 2321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined __linux__ 23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_LINUX 1 2341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined __MVS__ 23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_ZOS 1 2361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined(__sun) && defined(__SVR4) 23741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_SOLARIS 1 23841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif defined(_AIX) 23941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_AIX 1 24041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif defined(__hpux) 24141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_HPUX 1 24241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif defined __native_client__ 24341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_OS_NACL 1 24441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // __CYGWIN__ 24541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 24641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Brings in definitions for functions used in the testing::internal::posix 24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// namespace (read, write, close, chdir, isatty, stat). We do not currently 24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// use them on Windows Mobile. 24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !GTEST_OS_WINDOWS 25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This assumes that non-Windows OSes provide unistd.h. For OSes where this 25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// is not the case, we need to include headers that provide the functions 25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// mentioned above. 25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <unistd.h> 25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if !GTEST_OS_NACL 25541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TODO(vladl@google.com): Remove this condition when Native Client SDK adds 25641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// strings.h (tracked in 25741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// http://code.google.com/p/nativeclient/issues/detail?id=1175). 25841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <strings.h> // Native Client doesn't provide strings.h. 25941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif 26041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif !GTEST_OS_WINDOWS_MOBILE 26141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <direct.h> 26241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <io.h> 26341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 2641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 26541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Defines this to true iff Google Test can use POSIX regular expressions. 26641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_HAS_POSIX_RE 26741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) 26841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_POSIX_RE 2711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// On some platforms, <regex.h> needs someone to define size_t, and 2731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// won't compile otherwise. We can #include it here as we already 2741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// included <stdlib.h>, which is guaranteed to define size_t through 2751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// <stddef.h>. 27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <regex.h> // NOLINT 27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 27841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_USES_POSIX_RE 1 27941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif GTEST_OS_WINDOWS 28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// <regex.h> is not available on Windows. Use our own simple regex 28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// implementation instead. 28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_USES_SIMPLE_RE 1 2851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 2871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// <regex.h> may not be available on this platform. Use our own 2891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// simple regex implementation instead. 29041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_USES_SIMPLE_RE 1 2911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_POSIX_RE 2931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_HAS_EXCEPTIONS 29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The user didn't tell us whether exceptions are enabled, so we need 29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// to figure it out. 29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if defined(_MSC_VER) || defined(__BORLANDC__) 29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS 29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// macro to enable exceptions, so we'll do the same. 3001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Assumes that exceptions are enabled by default. 30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifndef _HAS_EXCEPTIONS 30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define _HAS_EXCEPTIONS 1 30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // _HAS_EXCEPTIONS 30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS 30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__GNUC__) && __EXCEPTIONS 30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. 30741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_EXCEPTIONS 1 30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__SUNPRO_CC) 30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Sun Pro CC supports exceptions. However, there is no compile-time way of 31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// detecting whether they are enabled or not. Therefore, we assume that 31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// they are enabled unless the user tells us otherwise. 31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_EXCEPTIONS 1 31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__IBMCPP__) && __EXCEPTIONS 31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled. 31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_EXCEPTIONS 1 31641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__HP_aCC) 31741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Exception handling is in effect by default in HP aCC compiler. It has to 31841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// be turned of by +noeh compiler option if desired. 31941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_EXCEPTIONS 1 32041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 32141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// For other compilers, we assume exceptions are disabled to be 3221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// conservative. 32341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_EXCEPTIONS 0 32441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // defined(_MSC_VER) || defined(__BORLANDC__) 32541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_EXCEPTIONS 32641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 32741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !defined(GTEST_HAS_STD_STRING) 32841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Even though we don't use this macro any longer, we keep it in case 32941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// some clients still depend on it. 33041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_STD_STRING 1 33141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif !GTEST_HAS_STD_STRING 33241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The user told us that ::std::string isn't available. 33341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# error "Google Test cannot be used where ::std::string isn't available." 33441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // !defined(GTEST_HAS_STD_STRING) 3351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_GLOBAL_STRING 3371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::string is available, so we need 3381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to figure it out. 3391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 34041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_GLOBAL_STRING 0 3411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_GLOBAL_STRING 3431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_STD_WSTRING 3451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::std::wstring is available, so we need 3461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to figure it out. 3471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring 3481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is available. 3491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 35041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Cygwin 1.7 and below doesn't support ::std::wstring. 35141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Solaris' libc++ doesn't support it either. Android has 35241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// no support for it at least as recent as Froyo (2.2). 35341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_STD_WSTRING \ 35441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) 3551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_STD_WSTRING 3571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_GLOBAL_WSTRING 3591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::wstring is available, so we need 3601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to figure it out. 36141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_GLOBAL_WSTRING \ 3621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) 3631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_GLOBAL_WSTRING 3641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether RTTI is available. 3661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_RTTI 3671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether RTTI is enabled, so we need to 3681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// figure it out. 3691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 37041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef _MSC_VER 3711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 37241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. 37341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 1 37441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 37541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 0 37641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif 3771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 37841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. 37941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) 3801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 38141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ANDROID 38284190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania// Android uses GCC but does not support RTTI 38341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_OS_LINUX_ANDROID 3841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 0 3851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 38641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef __GXX_RTTI 38741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 1 38841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 38941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 0 39041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // __GXX_RTTI 39141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif //ANDROID 3921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 39341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if 39441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// both the typeid and dynamic_cast features are present. 39541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) 3961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 39741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef __RTTI_ALL__ 39841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 1 39941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 40041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 0 40141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif 4021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 403cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov# elif defined(__clang__) 404cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov 405cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov// Android does not support RTTI 406cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov#if GTEST_OS_LINUX_ANDROID 407cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov#define GTEST_HAS_RTTI 0 408cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov#else 409cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov#define GTEST_HAS_RTTI 1 410cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov#endif //ANDROID 411cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov 41241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 41341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 41441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// For all other compilers, we assume RTTI is enabled. 41541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_RTTI 1 41641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 41741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // _MSC_VER 4181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_RTTI 4201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 42141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// It's this header's responsibility to #include <typeinfo> when RTTI 42241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// is enabled. 42341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_RTTI 42441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <typeinfo> 42541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 42641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 42741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Determines whether Google Test can use the pthreads library. 4281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_PTHREAD 42941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The user didn't tell us explicitly, so we assume pthreads support is 43041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// available on Linux and Mac. 43141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 43241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 43341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// to your compiler flags. 43441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX) 4351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_PTHREAD 4361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 43741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_PTHREAD 43841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is 43941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// true. 44041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <pthread.h> // NOLINT 44141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 44241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// For timespec and nanosleep, used below. 44341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <time.h> // NOLINT 44441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 44541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 44641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Determines whether Google Test can use tr1/tuple. You can define 44741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// this macro to 0 to prevent Google Test from using tuple (any 44841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// feature depending on tuple with be disabled in this mode). 4491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_TR1_TUPLE 45041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The user didn't tell us not to do it, so we assume it's OK. 45141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_TR1_TUPLE 1 45241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_TR1_TUPLE 45341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 45441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Determines whether Google Test's own tr1 tuple implementation 45541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// should be used. 45641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_USE_OWN_TR1_TUPLE 4571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us, so we need to figure it out. 4581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 45941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We use our own TR1 tuple if we aren't sure the user has an 46041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// implementation of it already. At this time, GCC 4.0.0+ and MSVC 46141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 2010 are the only mainstream compilers that come with a TR1 tuple 46241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by 46341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// defining __GNUC__ and friends, but cannot compile GCC's tuple 46441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB 46541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Feature Pack download, which we cannot assume the user has. 46641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ANDROID: added !GTEST_OS_LINUX_ANDROID 46741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) && !GTEST_OS_LINUX_ANDROID) \ 46841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot || _MSC_VER >= 1600 46941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_USE_OWN_TR1_TUPLE 0 47041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 47141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_USE_OWN_TR1_TUPLE 1 47241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif 47341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 47441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_USE_OWN_TR1_TUPLE 4751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// To avoid conditional compilation everywhere, we make it 4771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// gtest-port.h's responsibility to #include the header implementing 4781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// tr1/tuple. 4791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_TR1_TUPLE 48041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 48141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_USE_OWN_TR1_TUPLE 48241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include "gtest/internal/gtest-tuple.h" 48341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif GTEST_OS_SYMBIAN 48441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 48541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to 48641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// use STLport's tuple implementation, which unfortunately doesn't 48741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// work as the copy of STLport distributed with Symbian is incomplete. 48841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to 48941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// use its own tuple implementation. 49041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef BOOST_HAS_TR1_TUPLE 49141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# undef BOOST_HAS_TR1_TUPLE 49241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // BOOST_HAS_TR1_TUPLE 49341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 49441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This prevents <boost/tr1/detail/config.hpp>, which defines 49541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>. 49641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED 49741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <tuple> 49841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 49941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) 50041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does 50141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// not conform to the TR1 spec, which requires the header to be <tuple>. 50241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 50341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 50441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Until version 4.3.2, gcc has a bug that causes <tr1/functional>, 50541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// which is #included by <tr1/tuple>, to not compile when RTTI is 50641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// disabled. _TR1_FUNCTIONAL is the header guard for 50741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// <tr1/functional>. Hence the following #define is a hack to prevent 50841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// <tr1/functional> from being included. 50941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define _TR1_FUNCTIONAL 1 51041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <tr1/tuple> 51141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# undef _TR1_FUNCTIONAL // Allows the user to #include 51241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // <tr1/functional> if he chooses to. 51341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 51441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <tr1/tuple> // NOLINT 51541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 51641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 51741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 51841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// If the compiler is not GCC 4.0+, we assume the user is using a 5191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// spec-conforming TR1 implementation. 52041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <tuple> // NOLINT 52141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // GTEST_USE_OWN_TR1_TUPLE 52241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 5231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_TR1_TUPLE 5241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether clone(2) is supported. 5261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Usually it will only be available on Linux, excluding 5271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Linux on the Itanium architecture. 5281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Also see http://linux.die.net/man/2/clone. 5291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_CLONE 5301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us, so we need to figure it out. 5311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 53241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_OS_LINUX && !defined(__ia64__) 53341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_CLONE 1 53441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 53541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_CLONE 0 53641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // GTEST_OS_LINUX && !defined(__ia64__) 5371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_CLONE 5391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 54041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Determines whether to support stream redirection. This is used to test 54141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// output correctness and to implement death tests. 54241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_HAS_STREAM_REDIRECTION 54341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// By default, we assume that stream redirection is supported on all 54441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// platforms except known mobile ones. 54541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN 54641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_STREAM_REDIRECTION 0 54741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 54841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_STREAM_REDIRECTION 1 54941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN 55041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_STREAM_REDIRECTION 55141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 5521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support death tests. 55341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Google Test does not support death tests for VC 7.1 and earlier as 55441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// abort() in a VC 7.1 application compiled as GUI in debug config 55541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pops up a dialog window that cannot be suppressed programmatically. 55641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ 55741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ 558cfee58b45a11221732c58582988d6bb47fb4de04Evgeniy Stepanov GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_LINUX_ANDROID) 55941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_DEATH_TEST 1 56041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <vector> // NOLINT 5611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif 5621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 56341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We don't support MSVC 7.1 with exceptions disabled now. Therefore 56441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// all the compilers we care about are adequate for supporting 56541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value-parameterized tests. 5661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_PARAM_TEST 1 5671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support type-driven tests. 5691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 57041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0, 57141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Sun Pro CC, IBM Visual Age, and HP aCC support. 57284190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania// TODO: We should be able to support these on Android but we don't 57384190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania// have cxxabi.h when building for the target but we have it for the host. 57441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ANDROID: added !defined(GTEST_OS_LINUX_ANDROID) 57541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if (defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ 57641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot defined(__IBMCPP__) || defined(__HP_aCC)) && !defined(GTEST_OS_LINUX_ANDROID) 57741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_TYPED_TEST 1 57841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_TYPED_TEST_P 1 57941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 5801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support Combine(). This only makes sense when 58241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value-parameterized tests are enabled. The implementation doesn't 58341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// work on Sun Studio since it doesn't understand templated conversion 58441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// operators. 58541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) 58641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_COMBINE 1 58741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 5881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether the system compiler uses UTF-16 for encoding wide strings. 5901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_WIDE_STRING_USES_UTF16_ \ 59141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) 59241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 59341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Determines whether test results can be streamed to a socket. 59441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_OS_LINUX 59541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_CAN_STREAM_RESULTS_ 1 59641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 5971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines some utility macros. 5991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The GNU compiler emits a warning if nested "if" statements are followed by 6011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// an "else" statement and braces are not used to explicitly disambiguate the 6021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "else" binding. This leads to problems with code like: 6031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 6041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// if (gate) 6051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ASSERT_*(condition) << "Some message"; 6061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 6071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The "switch (0) case 0:" idiom is used to suppress this. 6081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __INTEL_COMPILER 60941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ 6101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 61141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT 6121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif 6131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 61441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Use this annotation at the end of a struct/class definition to 6151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// prevent the compiler from optimizing away instances that are never 6161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// used. This is useful when all interesting logic happens inside the 6171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// c'tor and / or d'tor. Example: 6181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 6191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// struct Foo { 6201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Foo() { ... } 6211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// } GTEST_ATTRIBUTE_UNUSED_; 62241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 62341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Also use it after a variable or parameter declaration to tell the 62441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// compiler the variable/parameter does not have to be used. 6251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__) && !defined(COMPILER_ICC) 62641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 6271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 62841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_ATTRIBUTE_UNUSED_ 6291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif 6301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 63141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A macro to disallow operator= 63241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This should be used in the private: declarations for a class. 63341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_DISALLOW_ASSIGN_(type)\ 63441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void operator=(type const &) 63541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 63641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A macro to disallow copy constructor and operator= 6371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This should be used in the private: declarations for a class. 6381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ 63941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot type(type const &);\ 64041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_ASSIGN_(type) 6411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tell the compiler to warn about unused return values for functions declared 6431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// with this macro. The macro should be used on function declarations 6441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// following the argument list: 6451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 6461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; 6471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) 64841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) 6491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 65041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_MUST_USE_RESULT_ 6511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC 6521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 65341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Determine whether the compiler supports Microsoft's Structured Exception 65441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Handling. This is supported by several Windows compilers but generally 65541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// does not exist on any other system. 65641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_HAS_SEH 65741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The user didn't tell us, so we need to figure it out. 65841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 65941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if defined(_MSC_VER) || defined(__BORLANDC__) 66041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// These two compilers are known to support SEH. 66141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_SEH 1 66241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 66341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Assume no SEH. 66441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_SEH 0 66541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif 66641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 66741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_SEH 66841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 66941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER 67041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 67141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_LINKED_AS_SHARED_LIBRARY 67241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_API_ __declspec(dllimport) 67341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# elif GTEST_CREATE_SHARED_LIBRARY 67441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_API_ __declspec(dllexport) 67541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif 67641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 67741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // _MSC_VER 67841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 67941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_API_ 68041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_API_ 68141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 68241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 68341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef __GNUC__ 68441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Ask the compiler to never inline a given function. 68541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_NO_INLINE_ __attribute__((noinline)) 68641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 68741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_NO_INLINE_ 68841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 68941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 6901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace testing { 6911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass Message; 6931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace internal { 6951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass String; 6971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 69841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time 69941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// expression is true. For example, you could use it to verify the 70041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// size of a static array: 70141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 70241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, 70341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// content_type_names_incorrect_size); 70441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 70541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// or to make sure a struct is smaller than a certain size: 70641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 70741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large); 70841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 70941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The second argument to the macro is the name of the variable. If 71041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the expression is false, most compilers will issue a warning/error 71141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// containing the name of the variable. 71241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 71341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <bool> 71441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct CompileAssert { 71541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 71641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 71741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_COMPILE_ASSERT_(expr, msg) \ 71841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef ::testing::internal::CompileAssert<(bool(expr))> \ 71941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot msg[bool(expr) ? 1 : -1] 72041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 72141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Implementation details of GTEST_COMPILE_ASSERT_: 72241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 72341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1 72441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// elements (and thus is invalid) when the expression is false. 72541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 72641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - The simpler definition 72741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 72841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1] 72941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 73041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// does not work, as gcc supports variable-length arrays whose sizes 73141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// are determined at run-time (this is gcc's extension and not part 73241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// of the C++ standard). As a result, gcc fails to reject the 73341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// following code with the simple definition: 73441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 73541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// int foo; 73641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is 73741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// // not a compile-time constant. 73841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 73941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - By using the type CompileAssert<(bool(expr))>, we ensures that 74041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// expr is a compile-time constant. (Template arguments must be 74141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// determined at compile-time.) 74241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 74341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - The outter parentheses in CompileAssert<(bool(expr))> are necessary 74441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written 74541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 74641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// CompileAssert<bool(expr)> 74741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 74841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// instead, these compilers will refuse to compile 74941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 75041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_COMPILE_ASSERT_(5 > 0, some_message); 75141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 75241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (They seem to think the ">" in "5 > 0" marks the end of the 75341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// template argument list.) 75441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 75541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// - The array size is (bool(expr) ? 1 : -1), instead of simply 75641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 75741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ((expr) ? 1 : -1). 75841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 75941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This is to avoid running into a bug in MS VC 7.1, which 76041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. 76141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 76241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h. 76341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 76441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This template is declared, but intentionally undefined. 76541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2> 76641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct StaticAssertTypeEqHelper; 76741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 76841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> 76941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct StaticAssertTypeEqHelper<T, T> {}; 77041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 77141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_GLOBAL_STRING 77241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef ::string string; 7731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 77441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef ::std::string string; 77541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_GLOBAL_STRING 77641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 77741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_GLOBAL_WSTRING 77841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef ::wstring wstring; 77941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif GTEST_HAS_STD_WSTRING 78041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef ::std::wstring wstring; 78141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_GLOBAL_WSTRING 78241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 78341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A helper for suppressing warnings on constant condition. It just 78441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// returns 'condition'. 78541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ bool IsTrue(bool condition); 7861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines scoped_ptr. 7881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This implementation of scoped_ptr is PARTIAL - it only contains 7901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// enough stuff to satisfy Google Test's need. 7911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T> 7921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass scoped_ptr { 7931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 79441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef T element_type; 79541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 7961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania explicit scoped_ptr(T* p = NULL) : ptr_(p) {} 7971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ~scoped_ptr() { reset(); } 7981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T& operator*() const { return *ptr_; } 8001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T* operator->() const { return ptr_; } 8011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T* get() const { return ptr_; } 8021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T* release() { 8041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T* const ptr = ptr_; 8051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ptr_ = NULL; 8061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return ptr; 8071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania void reset(T* p = NULL) { 8101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania if (p != ptr_) { 81141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. 8121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania delete ptr_; 8131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ptr_ = p; 8151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private: 8181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T* ptr_; 8191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); 8211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 8221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines RE. 8241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 82541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended 8261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Regular Expression syntax. 82741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass GTEST_API_ RE { 8281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 82941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // A copy constructor is required by the Standard to initialize object 83041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // references from r-values. 83141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot RE(const RE& other) { Init(other.pattern()); } 83241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Constructs an RE from a string. 8341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT 8351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_GLOBAL_STRING 83741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT 83941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_GLOBAL_STRING 8411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania RE(const char* regex) { Init(regex); } // NOLINT 8431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ~RE(); 8441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns the string representation of the regex. 8461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char* pattern() const { return pattern_; } 8471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // FullMatch(str, re) returns true iff regular expression re matches 8491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // the entire str. 8501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // PartialMatch(str, re) returns true iff regular expression re 8511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // matches a substring of str (including str itself). 8521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // 8531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // TODO(wan@google.com): make FullMatch() and PartialMatch() work 8541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // when str contains NUL characters. 8551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static bool FullMatch(const ::std::string& str, const RE& re) { 8561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return FullMatch(str.c_str(), re); 8571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static bool PartialMatch(const ::std::string& str, const RE& re) { 8591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return PartialMatch(str.c_str(), re); 8601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_GLOBAL_STRING 86341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static bool FullMatch(const ::string& str, const RE& re) { 8651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return FullMatch(str.c_str(), re); 8661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 8671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static bool PartialMatch(const ::string& str, const RE& re) { 8681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return PartialMatch(str.c_str(), re); 8691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 87041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_GLOBAL_STRING 8721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static bool FullMatch(const char* str, const RE& re); 8741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static bool PartialMatch(const char* str, const RE& re); 8751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private: 8771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania void Init(const char* regex); 8781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // We use a const char* instead of a string, as Google Test may be used 8801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // where string is not available. We also do not use Google Test's own 8811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // String type here, in order to simplify dependencies between the 8821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // files. 8831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char* pattern_; 8841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool is_valid_; 88541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_USES_POSIX_RE 88741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania regex_t full_regex_; // For FullMatch(). 8891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania regex_t partial_regex_; // For PartialMatch(). 89041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else // GTEST_USES_SIMPLE_RE 89241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char* full_pattern_; // For FullMatch(); 89441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 8951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif 8961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 89741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_ASSIGN_(RE); 8981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 8991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 90041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Formats a source file path and a line number as they would appear 90141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in an error message from the compiler used to compile this code. 90241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ ::std::string FormatFileLocation(const char* file, int line); 90341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 90441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Formats a file location for compiler-independent XML output. 90541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Although this function is not platform dependent, we put it next to 90641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// FormatFileLocation in order to contrast the two functions. 90741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, 90841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int line); 90941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 9101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines logging utilities: 91141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_LOG_(severity) - logs messages at the specified severity level. The 91241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// message itself is streamed into the macro. 9131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LogToStderr() - directs all log messages to stderr. 9141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// FlushInfoLog() - flushes informational log messages. 9151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaenum GTestLogSeverity { 9171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_INFO, 9181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_WARNING, 9191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_ERROR, 9201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_FATAL 9211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 9221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 92341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Formats log entry severity, provides a stream object for streaming the 92441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// log message, and terminates the message with a newline when going out of 92541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// scope. 92641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass GTEST_API_ GTestLog { 92741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 92841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTestLog(GTestLogSeverity severity, const char* file, int line); 92941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 93041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. 93141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ~GTestLog(); 93241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 93341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ::std::ostream& GetStream() { return ::std::cerr; } 93441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 93541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 93641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const GTestLogSeverity severity_; 93741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 93841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); 93941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 9401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 94141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_LOG_(severity) \ 94241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ 94341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot __FILE__, __LINE__).GetStream() 9441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline void LogToStderr() {} 9461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline void FlushInfoLog() { fflush(NULL); } 9471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 94841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// INTERNAL IMPLEMENTATION - DO NOT USE. 94941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 95041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition 95141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// is not satisfied. 95241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Synopsys: 95341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_CHECK_(boolean_condition); 95441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// or 95541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_CHECK_(boolean_condition) << "Additional message"; 95641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 95741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This checks the condition and if the condition is not satisfied 95841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// it prints message about the condition violation, including the 95941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// condition itself, plus additional message streamed into it, if any, 96041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// and then it aborts the program. It aborts the program irrespective of 96141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// whether it is built in the debug mode or not. 96241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_CHECK_(condition) \ 96341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 96441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (::testing::internal::IsTrue(condition)) \ 96541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ; \ 96641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot else \ 96741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_LOG_(FATAL) << "Condition " #condition " failed. " 96841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 96941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// An all-mode assert to verify that the given POSIX-style function 97041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// call returns 0 (indicating success). Known limitation: this 97141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// doesn't expand to a balanced 'if' statement, so enclose the macro 97241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in {} if you need to use it as the only statement in an 'if' 97341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// branch. 97441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ 97541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (const int gtest_error = (posix_call)) \ 97641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ 97741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot << gtest_error 97841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 97941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. 98041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 98141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Use ImplicitCast_ as a safe version of static_cast for upcasting in 98241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a 98341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// const Foo*). When you use ImplicitCast_, the compiler checks that 98441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the cast is safe. Such explicit ImplicitCast_s are necessary in 98541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// surprisingly many situations where C++ demands an exact type match 98641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// instead of an argument type convertable to a target type. 98741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 98841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The syntax for using ImplicitCast_ is the same as for static_cast: 98941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 99041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ImplicitCast_<ToType>(expr) 99141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 99241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ImplicitCast_ would have been part of the C++ standard library, 99341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// but the proposal was submitted too late. It will probably make 99441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// its way into the language in the future. 99541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 99641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This relatively ugly name is intentional. It prevents clashes with 99741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// similar functions users may have (e.g., implicit_cast). The internal 99841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// namespace alone is not enough because the function can be found by ADL. 99941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate<typename To> 100041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline To ImplicitCast_(To x) { return x; } 100141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 100241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// When you upcast (that is, cast a pointer from type Foo to type 100341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts 100441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// always succeed. When you downcast (that is, cast a pointer from 100541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because 100641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// how do you know the pointer is really of type SubclassOfFoo? It 100741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, 100841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// when you downcast, you should use this macro. In debug mode, we 100941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// use dynamic_cast<> to double-check the downcast is legal (we die 101041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// if it's not). In normal mode, we do the efficient static_cast<> 101141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// instead. Thus, it's important to test in debug mode to make sure 101241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the cast is legal! 101341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This is the only place in the code we should use dynamic_cast<>. 101441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// In particular, you SHOULDN'T be using dynamic_cast<> in order to 101541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// do RTTI (eg code like this: 101641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo); 101741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo); 101841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// You should design the code some other way not to need this. 101941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 102041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This relatively ugly name is intentional. It prevents clashes with 102141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// similar functions users may have (e.g., down_cast). The internal 102241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// namespace alone is not enough because the function can be found by ADL. 102341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate<typename To, typename From> // use like this: DownCast_<T*>(foo); 102441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline To DownCast_(From* f) { // so we only accept pointers 102541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Ensures that To is a sub-type of From *. This test is here only 102641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // for compile-time type checking, and has no overhead in an 102741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // optimized build at run-time, as it will be optimized away 102841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // completely. 102941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (false) { 103041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const To to = NULL; 103141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ::testing::internal::ImplicitCast_<From*>(to); 103241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 103341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 103441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_RTTI 103541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // RTTI: debug mode only! 103641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL); 103741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 103841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return static_cast<To>(f); 103941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 104041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 104141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Downcasts the pointer of type Base to Derived. 104241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Derived must be a subclass of Base. The parameter MUST 104341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// point to a class of type Derived, not any subclass of it. 104441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// When RTTI is available, the function performs a runtime 104541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// check to enforce this. 104641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <class Derived, class Base> 104741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotDerived* CheckedDowncastToActualType(Base* base) { 104841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_RTTI 104941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_(typeid(*base) == typeid(Derived)); 105041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return dynamic_cast<Derived*>(base); // NOLINT 105141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 105241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return static_cast<Derived*>(base); // Poor man's downcast. 105341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 105441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 105541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 105641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_STREAM_REDIRECTION 105741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 10581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines the stderr capturer: 105941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// CaptureStdout - starts capturing stdout. 106041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GetCapturedStdout - stops capturing stdout and returns the captured string. 10611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// CaptureStderr - starts capturing stderr. 10621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GetCapturedStderr - stops capturing stderr and returns the captured string. 106341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 106441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void CaptureStdout(); 106541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ String GetCapturedStdout(); 106641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void CaptureStderr(); 106741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ String GetCapturedStderr(); 106841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 106941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_STREAM_REDIRECTION 10701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_DEATH_TEST 10731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A copy of all command line arguments. Set by InitGoogleTest(). 10751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaextern ::std::vector<String> g_argvs; 10761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_DEATH_TEST implies we have ::std::string. 10781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst ::std::vector<String>& GetArgvs(); 10791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_DEATH_TEST 10811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines synchronization primitives. 10831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 108441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_PTHREAD 108541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 108641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Sleeps for (roughly) n milli-seconds. This function is only for 108741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// testing Google Test's own constructs. Don't use it in user tests, 108841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// either directly or indirectly. 108941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void SleepMilliseconds(int n) { 109041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const timespec time = { 109141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 0, // 0 seconds. 109241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot n * 1000L * 1000L, // And n ms. 109341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot }; 109441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot nanosleep(&time, NULL); 109541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 109641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 109741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Allows a controller thread to pause execution of newly created 109841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// threads until notified. Instances of this class must be created 109941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// and destroyed in the controller thread. 110041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 110141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This class is only for testing Google Test's own constructs. Do not 110241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// use it in user tests, either directly or indirectly. 110341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass Notification { 110441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 110541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Notification() : notified_(false) {} 110641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 110741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Notifies all threads created with this notification to start. Must 110841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // be called from the controller thread. 110941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void Notify() { notified_ = true; } 111041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 111141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Blocks until the controller thread notifies. Must be called from a test 111241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // thread. 111341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void WaitForNotification() { 111441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot while(!notified_) { 111541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot SleepMilliseconds(10); 111641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 111741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 111841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 111941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 112041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot volatile bool notified_; 112141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 112241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); 112341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 112441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 112541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// As a C-function, ThreadFuncWithCLinkage cannot be templated itself. 112641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Consequently, it cannot select a correct instantiation of ThreadWithParam 112741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in order to call its Run(). Introducing ThreadWithParamBase as a 112841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// non-templated base class for ThreadWithParam allows us to bypass this 112941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// problem. 113041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ThreadWithParamBase { 113141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 113241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot virtual ~ThreadWithParamBase() {} 113341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot virtual void Run() = 0; 113441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 113541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 113641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pthread_create() accepts a pointer to a function type with the C linkage. 113741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// According to the Standard (7.5/1), function types with different linkages 113841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// are different even if they are otherwise identical. Some compilers (for 113941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// example, SunStudio) treat them as different types. Since class methods 114041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// cannot be defined with C-linkage we need to define a free C-function to 114141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pass into pthread_create(). 114241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotextern "C" inline void* ThreadFuncWithCLinkage(void* thread) { 114341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot static_cast<ThreadWithParamBase*>(thread)->Run(); 114441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return NULL; 114541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 114641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 114741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Helper class for testing Google Test's multi-threading constructs. 114841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// To use it, write: 114941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 115041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// void ThreadFunc(int param) { /* Do things with param */ } 115141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Notification thread_can_start; 115241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ... 115341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// // The thread_can_start parameter is optional; you can supply NULL. 115441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start); 115541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// thread_can_start.Notify(); 115641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 115741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// These classes are only for testing Google Test's own constructs. Do 115841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// not use them in user tests, either directly or indirectly. 115941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> 116041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ThreadWithParam : public ThreadWithParamBase { 116141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 116241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef void (*UserThreadFunc)(T); 116341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 116441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadWithParam( 116541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot UserThreadFunc func, T param, Notification* thread_can_start) 116641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot : func_(func), 116741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot param_(param), 116841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot thread_can_start_(thread_can_start), 116941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot finished_(false) { 117041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadWithParamBase* const base = this; 117141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // The thread can be created only after all fields except thread_ 117241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // have been initialized. 117341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_( 117441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base)); 117541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 117641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ~ThreadWithParam() { Join(); } 117741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 117841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void Join() { 117941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (!finished_) { 118041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0)); 118141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot finished_ = true; 118241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 118341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 118441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 118541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot virtual void Run() { 118641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (thread_can_start_ != NULL) 118741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot thread_can_start_->WaitForNotification(); 118841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot func_(param_); 118941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 119041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 119141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 119241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const UserThreadFunc func_; // User-supplied thread function. 119341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const T param_; // User-supplied parameter to the thread function. 119441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // When non-NULL, used to block execution until the controller thread 119541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // notifies. 119641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Notification* const thread_can_start_; 119741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool finished_; // true iff we know that the thread function has finished. 119841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_t thread_; // The native thread object. 119941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 120041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); 120141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 120241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 120341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// MutexBase and Mutex implement mutex on pthreads-based platforms. They 120441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// are used in conjunction with class MutexLock: 120541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 120641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Mutex mutex; 120741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ... 120841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// MutexLock lock(&mutex); // Acquires the mutex and releases it at the end 120941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// // of the current scope. 121041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 121141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// MutexBase implements behavior for both statically and dynamically 121241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// allocated mutexes. Do not use MutexBase directly. Instead, write 121341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the following to define a static mutex: 121441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 121541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); 121641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 121741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// You can forward declare a static mutex like this: 121841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 121941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); 122041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 122141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// To create a dynamic mutex, just define an object of type Mutex. 122241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass MutexBase { 122341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 122441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Acquires this mutex. 122541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void Lock() { 122641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); 122741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot owner_ = pthread_self(); 122841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 122941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 123041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Releases this mutex. 123141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void Unlock() { 123241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // We don't protect writing to owner_ here, as it's the caller's 123341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // responsibility to ensure that the current thread holds the 123441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // mutex when this is called. 123541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot owner_ = 0; 123641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); 123741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 123841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 123941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Does nothing if the current thread holds the mutex. Otherwise, crashes 124041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // with high probability. 124141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void AssertHeld() const { 124241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_(owner_ == pthread_self()) 124341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot << "The current thread is not holding the mutex @" << this; 124441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 124541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 124641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // A static mutex may be used before main() is entered. It may even 124741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // be used before the dynamic initialization stage. Therefore we 124841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // must be able to initialize a static mutex object at link time. 124941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // This means MutexBase has to be a POD and its member variables 125041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // have to be public. 125141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 125241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_t mutex_; // The underlying pthread mutex. 125341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_t owner_; // The thread holding the mutex; 0 means no one holds it. 125441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 125541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 125641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Forward-declares a static mutex. 125741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 125841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot extern ::testing::internal::MutexBase mutex 125941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 126041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Defines and statically (i.e. at link time) initializes a static mutex. 126141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 126241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 } 126341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 126441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The Mutex class can only be used for mutexes created at runtime. It 126541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// shares its API with MutexBase otherwise. 126641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass Mutex : public MutexBase { 126741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 126841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Mutex() { 126941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); 127041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot owner_ = 0; 127141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 127241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ~Mutex() { 127341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); 127441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 127541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 127641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 127741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); 127841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 127941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 128041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We cannot name this class MutexLock as the ctor declaration would 128141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// conflict with a macro named MutexLock, which is defined on some 128241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// platforms. Hence the typedef trick below. 128341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass GTestMutexLock { 128441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 128541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit GTestMutexLock(MutexBase* mutex) 128641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot : mutex_(mutex) { mutex_->Lock(); } 128741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 128841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ~GTestMutexLock() { mutex_->Unlock(); } 128941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 129041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 129141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot MutexBase* const mutex_; 129241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 129341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); 129441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 129541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 129641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef GTestMutexLock MutexLock; 129741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 129841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Helpers for ThreadLocal. 129941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 130041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pthread_key_create() requires DeleteThreadLocalValue() to have 130141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// C-linkage. Therefore it cannot be templatized to access 130241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ThreadLocal<T>. Hence the need for class 130341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ThreadLocalValueHolderBase. 130441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ThreadLocalValueHolderBase { 130541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 130641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot virtual ~ThreadLocalValueHolderBase() {} 130741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 130841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 130941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Called by pthread to delete thread-local data stored by 131041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pthread_setspecific(). 131141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotextern "C" inline void DeleteThreadLocalValue(void* value_holder) { 131241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot delete static_cast<ThreadLocalValueHolderBase*>(value_holder); 131341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 131441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 131541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Implements thread-local storage on pthreads-based systems. 131641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 131741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// // Thread 1 131841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ThreadLocal<int> tl(100); // 100 is the default value for each thread. 131941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 132041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// // Thread 2 132141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// tl.set(150); // Changes the value for thread 2 only. 132241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// EXPECT_EQ(150, tl.get()); 132341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 132441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// // Thread 1 132541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. 132641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// tl.set(200); 132741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// EXPECT_EQ(200, tl.get()); 132841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 132941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The template type argument T must have a public copy constructor. 133041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// In addition, the default ThreadLocal constructor requires T to have 133141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// a public default constructor. 133241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 133341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// An object managed for a thread by a ThreadLocal instance is deleted 133441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// when the thread exits. Or, if the ThreadLocal instance dies in 133541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// that thread, when the ThreadLocal dies. It's the user's 133641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// responsibility to ensure that all other threads using a ThreadLocal 133741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// have exited when it dies, or the per-thread objects for those 133841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// threads will not be deleted. 133941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 134041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Google Test only uses global ThreadLocal objects. That means they 134141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// will die after main() has returned. Therefore, no per-thread 134241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// object managed by Google Test will be leaked as long as all threads 134341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// using Google Test have exited when main() returns. 134441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> 134541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ThreadLocal { 134641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 134741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocal() : key_(CreateKey()), 134841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot default_() {} 134941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit ThreadLocal(const T& value) : key_(CreateKey()), 135041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot default_(value) {} 135141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 135241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ~ThreadLocal() { 135341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Destroys the managed object for the current thread, if any. 135441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot DeleteThreadLocalValue(pthread_getspecific(key_)); 135541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 135641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Releases resources associated with the key. This will *not* 135741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // delete managed objects for other threads. 135841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); 135941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 136041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 136141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot T* pointer() { return GetOrCreateValue(); } 136241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const T* pointer() const { return GetOrCreateValue(); } 136341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const T& get() const { return *pointer(); } 136441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void set(const T& value) { *pointer() = value; } 136541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 136641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 136741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Holds a value of type T. 136841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot class ValueHolder : public ThreadLocalValueHolderBase { 136941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 137041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit ValueHolder(const T& value) : value_(value) {} 137141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 137241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot T* pointer() { return &value_; } 137341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 137441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 137541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot T value_; 137641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); 137741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot }; 137841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 137941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot static pthread_key_t CreateKey() { 138041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_key_t key; 138141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // When a thread exits, DeleteThreadLocalValue() will be called on 138241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // the object managed for that thread. 138341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_( 138441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_key_create(&key, &DeleteThreadLocalValue)); 138541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return key; 138641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 138741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 138841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot T* GetOrCreateValue() const { 138941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocalValueHolderBase* const holder = 139041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_)); 139141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (holder != NULL) { 139241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return CheckedDowncastToActualType<ValueHolder>(holder)->pointer(); 139341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 139441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 139541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ValueHolder* const new_holder = new ValueHolder(default_); 139641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocalValueHolderBase* const holder_base = new_holder; 139741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); 139841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return new_holder->pointer(); 139941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 140041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 140141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // A key pthreads uses for looking up per-thread values. 140241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const pthread_key_t key_; 140341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const T default_; // The default value for each thread. 140441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 140541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); 140641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 140741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 140841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_IS_THREADSAFE 1 140941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 141041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else // GTEST_HAS_PTHREAD 141141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 14121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A dummy implementation of synchronization primitives (mutex, lock, 14131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// and thread-local variable). Necessary for compiling Google Test where 14141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// mutex is not supported - using Google Test in multiple threads is not 14151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// supported on such platforms. 14161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass Mutex { 14181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 14191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Mutex() {} 14201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania void AssertHeld() const {} 14211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 14221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 142341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 142441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot extern ::testing::internal::Mutex mutex 142541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 142641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex 142741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 14281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass GTestMutexLock { 14291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 14301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania explicit GTestMutexLock(Mutex*) {} // NOLINT 14311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 14321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef GTestMutexLock MutexLock; 14341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T> 14361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ThreadLocal { 14371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 14381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ThreadLocal() : value_() {} 14391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania explicit ThreadLocal(const T& value) : value_(value) {} 14401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T* pointer() { return &value_; } 14411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const T* pointer() const { return &value_; } 14421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const T& get() const { return value_; } 14431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania void set(const T& value) { value_ = value; } 14441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private: 14451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania T value_; 14461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 14471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The above synchronization primitives have dummy implementations. 14491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Therefore Google Test is not thread-safe. 145041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_IS_THREADSAFE 0 14511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 145241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_HAS_PTHREAD 145341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 145441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Returns the number of threads running in the process, or 0 to indicate that 145541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// we cannot detect it. 145641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ size_t GetThreadCount(); 14571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Passing non-POD classes through ellipsis (...) crashes the ARM 145941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// compiler and generates a warning in Sun Studio. The Nokia Symbian 146041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// and the IBM XL C/C++ compiler try to instantiate a copy constructor 146141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// for objects passed through ellipsis (...), failing for uncopyable 146241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// objects. We define this to ensure that only POD is passed through 146341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ellipsis on these systems. 146441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) 146541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We lose support for NULL detection where the compiler doesn't like 146641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// passing non-POD classes through ellipsis (...). 146741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_ELLIPSIS_NEEDS_POD_ 1 146841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 146941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_CAN_COMPARE_NULL 1 147041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 14711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between 14731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// const T& and const T* in a function template. These compilers 14741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// _can_ decide between class template specializations for T and T*, 14751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// so a tr1::type_traits-like is_pointer works. 147641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if defined(__SYMBIAN32__) || defined(__IBMCPP__) 147741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_NEEDS_IS_POINTER_ 1 147841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 14791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <bool bool_value> 14811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniastruct bool_constant { 14821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef bool_constant<bool_value> type; 14831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static const bool value = bool_value; 14841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 14851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <bool bool_value> const bool bool_constant<bool_value>::value; 14861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef bool_constant<false> false_type; 14881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef bool_constant<true> true_type; 14891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T> 14911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniastruct is_pointer : public false_type {}; 14921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 14931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T> 14941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniastruct is_pointer<T*> : public true_type {}; 14951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 149641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename Iterator> 149741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct IteratorTraits { 149841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef typename Iterator::value_type value_type; 149941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 150041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 150141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> 150241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct IteratorTraits<T*> { 150341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef T value_type; 150441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 150541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 150641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> 150741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct IteratorTraits<const T*> { 150841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef T value_type; 150941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 151041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 15111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_WINDOWS 151241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_PATH_SEP_ "\\" 151341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_ALT_PATH_SEP_ 1 151441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The biggest signed integer type the compiler supports. 151541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef __int64 BiggestInt; 15161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 151741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_PATH_SEP_ "/" 151841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# define GTEST_HAS_ALT_PATH_SEP_ 0 151941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef long long BiggestInt; // NOLINT 15201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_OS_WINDOWS 15211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 152241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Utilities for char. 152341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 152441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// isspace(int ch) and friends accept an unsigned char or EOF. char 152541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// may be signed, depending on the compiler (or compiler flags). 152641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Therefore we need to cast a char to unsigned char before calling 152741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// isspace(), etc. 152841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 152941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsAlpha(char ch) { 153041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return isalpha(static_cast<unsigned char>(ch)) != 0; 153141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 153241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsAlNum(char ch) { 153341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return isalnum(static_cast<unsigned char>(ch)) != 0; 153441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 153541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsDigit(char ch) { 153641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return isdigit(static_cast<unsigned char>(ch)) != 0; 153741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 153841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsLower(char ch) { 153941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return islower(static_cast<unsigned char>(ch)) != 0; 154041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 154141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsSpace(char ch) { 154241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return isspace(static_cast<unsigned char>(ch)) != 0; 154341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 154441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsUpper(char ch) { 154541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return isupper(static_cast<unsigned char>(ch)) != 0; 154641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 154741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsXDigit(char ch) { 154841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return isxdigit(static_cast<unsigned char>(ch)) != 0; 154941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 155041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 155141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline char ToLower(char ch) { 155241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return static_cast<char>(tolower(static_cast<unsigned char>(ch))); 155341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 155441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline char ToUpper(char ch) { 155541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return static_cast<char>(toupper(static_cast<unsigned char>(ch))); 155641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 155741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 155841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The testing::internal::posix namespace holds wrappers for common 155941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// POSIX functions. These wrappers hide the differences between 156041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Windows/MSVC and POSIX systems. Since some compilers define these 156141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// standard functions as macros, the wrapper cannot have the same name 156241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// as the wrapped function. 156341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 156441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace posix { 156541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 156641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Functions with a different name on Windows. 156741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 15681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_WINDOWS 156941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 157041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef struct _stat StatStruct; 157141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 157241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# ifdef __BORLANDC__ 157341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int IsATTY(int fd) { return isatty(fd); } 157441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int StrCaseCmp(const char* s1, const char* s2) { 157541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return stricmp(s1, s2); 157641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 157741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline char* StrDup(const char* src) { return strdup(src); } 157841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else // !__BORLANDC__ 157941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_OS_WINDOWS_MOBILE 158041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int IsATTY(int /* fd */) { return 0; } 158141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 158241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int IsATTY(int fd) { return _isatty(fd); } 158341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // GTEST_OS_WINDOWS_MOBILE 158441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int StrCaseCmp(const char* s1, const char* s2) { 158541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return _stricmp(s1, s2); 158641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 158741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline char* StrDup(const char* src) { return _strdup(src); } 158841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // __BORLANDC__ 158941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 159041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_OS_WINDOWS_MOBILE 159141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); } 159241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this 159341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// time and thus not defined there. 159441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# else 159541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int FileNo(FILE* file) { return _fileno(file); } 159641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } 159741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int RmDir(const char* dir) { return _rmdir(dir); } 159841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsDir(const StatStruct& st) { 159941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return (_S_IFDIR & st.st_mode) != 0; 160041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 160141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // GTEST_OS_WINDOWS_MOBILE 160241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 16031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 160441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 160541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef struct stat StatStruct; 160641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 160741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int FileNo(FILE* file) { return fileno(file); } 160841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int IsATTY(int fd) { return isatty(fd); } 160941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } 161041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int StrCaseCmp(const char* s1, const char* s2) { 161141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return strcasecmp(s1, s2); 161241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 161341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline char* StrDup(const char* src) { return strdup(src); } 161441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int RmDir(const char* dir) { return rmdir(dir); } 161541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } 161641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 16171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_OS_WINDOWS 16181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 161941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Functions deprecated by MSVC 8.0. 162041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 162141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER 162241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Temporarily disable warning 4996 (deprecated function). 162341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(push) 162441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(disable:4996) 162541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 162641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 162741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline const char* StrNCpy(char* dest, const char* src, size_t n) { 162841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return strncpy(dest, src, n); 162941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 163041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 163141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and 163241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// StrError() aren't needed on Windows CE at this time and thus not 163341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// defined there. 163441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 163541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !GTEST_OS_WINDOWS_MOBILE 163641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int ChDir(const char* dir) { return chdir(dir); } 163741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 163841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline FILE* FOpen(const char* path, const char* mode) { 163941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return fopen(path, mode); 164041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 164141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !GTEST_OS_WINDOWS_MOBILE 164241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline FILE *FReopen(const char* path, const char* mode, FILE* stream) { 164341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return freopen(path, mode, stream); 164441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 164541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } 164641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 164741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int FClose(FILE* fp) { return fclose(fp); } 164841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !GTEST_OS_WINDOWS_MOBILE 164941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int Read(int fd, void* buf, unsigned int count) { 165041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return static_cast<int>(read(fd, buf, count)); 165141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 165241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int Write(int fd, const void* buf, unsigned int count) { 165341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return static_cast<int>(write(fd, buf, count)); 165441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 165541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline int Close(int fd) { return close(fd); } 165641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline const char* StrError(int errnum) { return strerror(errnum); } 165741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 165841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline const char* GetEnv(const char* name) { 165941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_OS_WINDOWS_MOBILE 166041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // We are on Windows CE, which has no environment variables. 166141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return NULL; 166241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) 166341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Environment variables which we programmatically clear will be set to the 166441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // empty string rather than unset (NULL). Handle that case. 166541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const char* const env = getenv(name); 166641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return (env != NULL && env[0] != '\0') ? env : NULL; 166741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 166841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return getenv(name); 166941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 167041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 167141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 167241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER 167341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(pop) // Restores the warning state. 167441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 167541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 167641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_OS_WINDOWS_MOBILE 167741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Windows CE has no C library. The abort() function is used in 167841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// several places in Google Test. This implementation provides a reasonable 167941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// imitation of standard behaviour. 168041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid Abort(); 168141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 168241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void Abort() { abort(); } 168341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_OS_WINDOWS_MOBILE 168441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 168541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} // namespace posix 168641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 16871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The maximum number a BiggestInt can represent. This definition 16881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// works no matter BiggestInt is represented in one's complement or 16891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// two's complement. 16901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 16911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// We cannot rely on numeric_limits in STL, as __int64 and long long 16921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// are not part of standard C++ and numeric_limits doesn't need to be 16931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// defined for them. 16941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst BiggestInt kMaxBiggestInt = 16951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1)); 16961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 16971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This template class serves as a compile-time function from size to 16981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// type. It maps a size in bytes to a primitive type with that 16991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// size. e.g. 17001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 17011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TypeWithSize<4>::UInt 17021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 17031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is typedef-ed to be unsigned int (unsigned integer made up of 4 17041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// bytes). 17051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 17061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Such functionality should belong to STL, but I cannot find it 17071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// there. 17081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 17091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Google Test uses this class in the implementation of floating-point 17101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// comparison. 17111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 17121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// For now it only handles UInt (unsigned int) as that's all Google Test 17131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// needs. Other types can be easily added in the future if need 17141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// arises. 17151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <size_t size> 17161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass TypeWithSize { 17171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 17181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // This prevents the user from using TypeWithSize<N> with incorrect 17191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // values of N. 17201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef void UInt; 17211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 17221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The specialization for size 4. 17241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <> 17251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass TypeWithSize<4> { 17261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 17271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // unsigned int has size 4 in both gcc and MSVC. 17281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // 17291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // As base/basictypes.h doesn't compile on Windows, we cannot use 17301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // uint32, uint64, and etc here. 17311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef int Int; 17321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef unsigned int UInt; 17331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 17341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The specialization for size 8. 17361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <> 17371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass TypeWithSize<8> { 17381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 173941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 17401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_WINDOWS 17411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef __int64 Int; 17421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef unsigned __int64 UInt; 17431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else 17441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef long long Int; // NOLINT 17451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania typedef unsigned long long UInt; // NOLINT 17461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_OS_WINDOWS 17471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; 17481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Integer types of known sizes. 17501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<4>::Int Int32; 17511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<4>::UInt UInt32; 17521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<8>::Int Int64; 17531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<8>::UInt UInt64; 17541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. 17551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Utilities for command line flags and environment variables. 17571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macro for referencing flags. 17591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_FLAG(name) FLAGS_gtest_##name 17601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros for declaring flags. 176241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) 17631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DECLARE_int32_(name) \ 176441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) 17651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DECLARE_string_(name) \ 176641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name) 17671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros for defining flags. 17691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEFINE_bool_(name, default_val, doc) \ 177041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_API_ bool GTEST_FLAG(name) = (default_val) 17711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEFINE_int32_(name, default_val, doc) \ 177241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) 17731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEFINE_string_(name, default_val, doc) \ 177441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val) 17751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Parses 'str' for a 32-bit signed integer. If successful, writes the result 17771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to *value and returns true; otherwise leaves *value unchanged and returns 17781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// false. 17791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TODO(chandlerc): Find a better way to refactor flag and environment parsing 17801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// out of both gtest-port.cc and gtest.cc to avoid exporting this utility 17811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// function. 17821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniabool ParseInt32(const Message& src_text, const char* str, Int32* value); 17831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Parses a bool/Int32/string from the environment variable 17851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// corresponding to the given Google Test flag. 17861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniabool BoolFromGTestEnv(const char* flag, bool default_val); 178741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); 17881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst char* StringFromGTestEnv(const char* flag, const char* default_val); 17891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} // namespace internal 17911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} // namespace testing 17921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 1794