gtest-port.h revision 190f8ee25a6977ac6eb71b816498df42f17ad9a7
17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2005, Google Inc. 27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved. 37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without 57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are 67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met: 77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Redistributions of source code must retain the above copyright 97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer. 107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Redistributions in binary form must reproduce the above 117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer 127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the 137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution. 147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Neither the name of Google Inc. nor the names of its 157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from 167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission. 177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Authors: wan@google.com (Zhanyong Wan) 317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Low-level types and utilities for porting Google Test to various 337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// platforms. They are subject to change without notice. DO NOT USE 347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEM IN USER CODE. 357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user can define the following macros in the build script to 407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// control Google Test's behavior. If the user doesn't define a macro 417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in this list, Google Test will define it. 427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) 447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is/isn't available. 457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string 467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is/isn't available (some systems define 477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::string, which is different to std::string). 487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string 497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is/isn't available (some systems define 507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::wstring, which is different to std::wstring). 517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h> 527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is/isn't available. 537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't 547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// enabled. 557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_STD_STRING - Define it to 1/0 to indicate that 567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// std::string does/doesn't work (Google Test can 577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// be used where std::string is unavailable). 587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that 597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// std::wstring does/doesn't work (Google Test can 607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// be used where std::wstring is unavailable). 61190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple 627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is/isn't available. 63190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the 64190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// compiler supports Microsoft's "Structured 65190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Exception Handling". 66190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google 67190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Test's own tr1 tuple implementation should be 68190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// used. Unused when the user sets 69190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_HAS_TR1_TUPLE to 0. 707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This header defines the following utilities: 727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 73e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Macros indicating the current platform (defined to 1 if compiled on 74e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the given platform; otherwise undefined): 75e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_OS_CYGWIN - Cygwin 76e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_OS_LINUX - Linux 77e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_OS_MAC - Mac OS X 78e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_OS_SOLARIS - Sun Solaris 79e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_OS_SYMBIAN - Symbian 80190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) 81190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop 82190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_OS_WINDOWS_MINGW - MinGW 83190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_OS_WINODWS_MOBILE - Windows Mobile 84e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_OS_ZOS - z/OS 857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the 877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// most stable support. Since core members of the Google Test project 887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// don't have access to other platforms, support for them may be less 897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// stable. If you notice any problems on your platform, please notify 907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// googletestframework@googlegroups.com (patches for fixing them are 917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// even more welcome!). 927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 93e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Note that it is possible that none of the GTEST_OS_* macros are defined. 947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 95e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Macros indicating available Google Test features (defined to 1 if 96e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the corresponding feature is supported; otherwise undefined): 97e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized 98e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// tests) 99e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_HAS_DEATH_TEST - death tests 100e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_HAS_PARAM_TEST - value-parameterized tests 101e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_HAS_TYPED_TEST - typed tests 102e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_HAS_TYPED_TEST_P - type-parameterized tests 103e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. 104e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// GTEST_USES_SIMPLE_RE - our own simple regex is used; 105e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the above two are mutually exclusive. 1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for basic C++ coding: 1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. 109190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a 110190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// variable don't have to be used. 1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. 1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. 1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synchronization: 1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Mutex, MutexLock, ThreadLocal, GetThreadCount() 1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// - synchronization primitives. 1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above 1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// synchronization primitives have real implementations 1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// and Google Test is thread-safe; or 0 otherwise. 1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Template meta programming: 1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. 1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Smart pointers: 1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// scoped_ptr - as in TR2. 1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Regular expressions: 1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// RE - a simple regular expression class using the POSIX 1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Extended Regular Expression syntax. Not available on 1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Windows. 1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Logging: 1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_LOG_() - logs messages at the specified severity level. 1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LogToStderr() - directs all log messages to stderr. 1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FlushInfoLog() - flushes informational log messages. 1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Stderr capturing: 1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// CaptureStderr() - starts capturing stderr. 1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GetCapturedStderr() - stops capturing stderr and returns the captured 1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// string. 1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Integer types: 1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TypeWithSize - maps an integer to a int type. 1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Int32, UInt32, Int64, UInt64, TimeInMillis 1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// - integers of known sizes. 1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// BiggestInt - the biggest signed integer type. 1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Command-line utilities: 1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_FLAG() - references a flag. 1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_DECLARE_*() - declares a flag. 1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_DEFINE_*() - defines a flag. 1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GetArgvs() - returns the command line as a vector of strings. 1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Environment variable utilities: 1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GetEnv() - gets the value of an environment variable. 1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// BoolFromGTestEnv() - parses a bool environment variable. 1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Int32FromGTestEnv() - parses an Int32 environment variable. 1587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// StringFromGTestEnv() - parses a string environment variable. 1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 160190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <stddef.h> // For ptrdiff_t 1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <stdlib.h> 1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <stdio.h> 163190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <string.h> 164190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifndef _WIN32_WCE 165190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <sys/stat.h> 166190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // !_WIN32_WCE 167190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 168190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <iostream> // NOLINT 1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 170e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" 171e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_FLAG_PREFIX_ "gtest_" 172e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" 173e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_NAME_ "Google Test" 174e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" 1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines the version of gcc that is used to compile this. 1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef __GNUC__ 1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 40302 means version 4.3.2. 1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_GCC_VER_ \ 1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) 1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // __GNUC__ 1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines the platform on which Google Test is compiled. 1847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef __CYGWIN__ 185e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_CYGWIN 1 186190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif defined __SYMBIAN32__ 187e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_SYMBIAN 1 188190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif defined _WIN32 189e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_WINDOWS 1 190190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifdef _WIN32_WCE 191190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_OS_WINDOWS_MOBILE 1 192190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif defined(__MINGW__) || defined(__MINGW32__) 193190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_OS_WINDOWS_MINGW 1 194190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 195190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_OS_WINDOWS_DESKTOP 1 196190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // _WIN32_WCE 1977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#elif defined __APPLE__ 198e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_MAC 1 1997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#elif defined __linux__ 200e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_LINUX 1 2017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#elif defined __MVS__ 202e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_ZOS 1 2037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#elif defined(__sun) && defined(__SVR4) 204e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_OS_SOLARIS 1 205df40664a63a91a1ab4b40c7f2d356cf255071d56Edward O'Callaghan#elif defined(__HAIKU__) 206df40664a63a91a1ab4b40c7f2d356cf255071d56Edward O'Callaghan#define GTEST_OS_HAIKU 207190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // __CYGWIN__ 2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 209190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_SYMBIAN || \ 210190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GTEST_OS_SOLARIS 2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 212e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// On some platforms, <regex.h> needs someone to define size_t, and 213e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// won't compile otherwise. We can #include it here as we already 214e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// included <stdlib.h>, which is guaranteed to define size_t through 215e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// <stddef.h>. 216e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#include <regex.h> // NOLINT 217190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <strings.h> // NOLINT 218190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <sys/types.h> // NOLINT 219190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <unistd.h> // NOLINT 220190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 221e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_USES_POSIX_RE 1 222e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 223190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif GTEST_OS_WINDOWS 224190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 225190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if !GTEST_OS_WINDOWS_MOBILE 226190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <direct.h> // NOLINT 227190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <io.h> // NOLINT 228190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 229190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 230190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// <regex.h> is not available on Windows. Use our own simple regex 231190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// implementation instead. 232190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_USES_SIMPLE_RE 1 233190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 234e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#else 235e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 236e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// <regex.h> may not be available on this platform. Use our own 237e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// simple regex implementation instead. 238e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_USES_SIMPLE_RE 1 239e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 240190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || 241190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // GTEST_OS_SYMBIAN || GTEST_OS_SOLARIS 242e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 243e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Defines GTEST_HAS_EXCEPTIONS to 1 if exceptions are enabled, or 0 244e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// otherwise. 2457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 246190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if defined(_MSC_VER) || defined(__BORLANDC__) 247190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS 248190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// macro to enable exceptions, so we'll do the same. 2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Assumes that exceptions are enabled by default. 250190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifndef _HAS_EXCEPTIONS 2517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define _HAS_EXCEPTIONS 1 2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // _HAS_EXCEPTIONS 2537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS 254190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else // The compiler is not MSVC or C++Builder. 255e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. For 256e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// other compilers, we assume exceptions are disabled to be 257e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// conservative. 258e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if defined(__GNUC__) && __EXCEPTIONS 259e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_EXCEPTIONS 1 260e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#else 2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_EXCEPTIONS 0 262e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif // defined(__GNUC__) && __EXCEPTIONS 263190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // defined(_MSC_VER) || defined(__BORLANDC__) 264e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 265e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Determines whether ::std::string and ::string are available. 2667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 267e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#ifndef GTEST_HAS_STD_STRING 268e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// The user didn't tell us whether ::std::string is available, so we 269e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// need to figure it out. The only environment that we know 270e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// ::std::string is not available is MSVC 7.1 or lower with exceptions 271e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// disabled. 272e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if defined(_MSC_VER) && (_MSC_VER < 1400) && !GTEST_HAS_EXCEPTIONS 273e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_STD_STRING 0 274e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#else 275e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_STD_STRING 1 276e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif 2777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_STRING 2787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_GLOBAL_STRING 2807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us whether ::string is available, so we need 2817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to figure it out. 2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_GLOBAL_STRING 0 2847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_GLOBAL_STRING 2867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_STD_WSTRING 2887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us whether ::std::wstring is available, so we need 2897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to figure it out. 2907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring 2917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is available. 2927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 293e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || GTEST_OS_HAIKU || defined(_MINIX) 294e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Cygwin 1.5 and below doesn't support ::std::wstring. 295e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Cygwin 1.7 might add wstring support; this should be updated when clear. 2967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Solaris' libc++ doesn't support it either. 29721aa347c2816aa8fc635ad05c5ab786234b32c7eChris Lattner// Minix currently doesn't support it either. 2987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_STD_WSTRING 0 2997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 3007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_STD_WSTRING GTEST_HAS_STD_STRING 301e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif // GTEST_OS_CYGWIN || GTEST_OS_SOLARIS 3027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_WSTRING 3047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_GLOBAL_WSTRING 3067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us whether ::wstring is available, so we need 3077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to figure it out. 308e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_GLOBAL_WSTRING \ 309e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) 3107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_GLOBAL_WSTRING 3117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING || \ 3137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 3147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <string> // NOLINT 3157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING || 3167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 3177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_STRING 3197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <sstream> // NOLINT 3207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 3217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <strstream> // NOLINT 3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_STRING 3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether RTTI is available. 3257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_RTTI 3267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us whether RTTI is enabled, so we need to 3277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// figure it out. 3287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef _MSC_VER 3307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. 3327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_RTTI 1 3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_RTTI 0 3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // _CPPRTTI 3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#elif defined(__GNUC__) 3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. 3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_GCC_VER_ >= 40302 3417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef __GXX_RTTI 3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_RTTI 1 3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_RTTI 0 3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // __GXX_RTTI 3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For gcc versions smaller than 4.3.2, we assume RTTI is enabled. 3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_RTTI 1 3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_GCC_VER >= 40302 3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Unknown compiler - assume RTTI is enabled. 3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_RTTI 1 3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // _MSC_VER 3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_RTTI 3597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether <pthread.h> is available. 3617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_PTHREAD 3627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us, so we need to figure it out. 363e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC) 3647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_PTHREAD 3657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 366190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Determines whether Google Test can use tr1/tuple. You can define 367190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// this macro to 0 to prevent Google Test from using tuple (any 368190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// feature depending on tuple with be disabled in this mode). 3697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_TR1_TUPLE 370190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The user didn't tell us not to do it, so we assume it's OK. 371190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_HAS_TR1_TUPLE 1 372190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_HAS_TR1_TUPLE 373190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 374190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Determines whether Google Test's own tr1 tuple implementation 375190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// should be used. 376190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifndef GTEST_USE_OWN_TR1_TUPLE 3777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us, so we need to figure it out. 3787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 379190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// We use our own tr1 tuple if we aren't sure the user has an 380190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// implementation of it already. At this time, GCC 4.0.0+ is the only 381190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// mainstream compiler that comes with a TR1 tuple implementation. 382190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// MSVC 2008 (9.0) provides TR1 tuple in a 323 MB Feature Pack 383190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// download, which we cannot assume the user has. MSVC 2010 isn't 384190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// released yet. 3857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) 386190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_USE_OWN_TR1_TUPLE 0 3877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 388190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_USE_OWN_TR1_TUPLE 1 389190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) 390190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 391190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_USE_OWN_TR1_TUPLE 3927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// To avoid conditional compilation everywhere, we make it 3947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// gtest-port.h's responsibility to #include the header implementing 3957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// tr1/tuple. 3967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_TR1_TUPLE 397190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 398190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_USE_OWN_TR1_TUPLE 399190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <gtest/internal/gtest-tuple.h> 400190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif GTEST_OS_SYMBIAN 401190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 402190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to 403190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// use STLport's tuple implementation, which unfortunately doesn't 404190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// work as the copy of STLport distributed with Symbian is incomplete. 405190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to 406190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// use its own tuple implementation. 407190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifdef BOOST_HAS_TR1_TUPLE 408190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#undef BOOST_HAS_TR1_TUPLE 409190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // BOOST_HAS_TR1_TUPLE 410190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 411190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// This prevents <boost/tr1/detail/config.hpp>, which defines 412190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>. 413190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED 414190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <tuple> 415190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 416190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) 417190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does 418190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// not conform to the TR1 spec, which requires the header to be <tuple>. 419190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 420190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 421190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Until version 4.3.2, gcc has a bug that causes <tr1/functional>, 422190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// which is #included by <tr1/tuple>, to not compile when RTTI is 423190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// disabled. _TR1_FUNCTIONAL is the header guard for 424190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// <tr1/functional>. Hence the following #define is a hack to prevent 425190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// <tr1/functional> from being included. 426190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define _TR1_FUNCTIONAL 1 4277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <tr1/tuple> 428190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#undef _TR1_FUNCTIONAL // Allows the user to #include 429190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // <tr1/functional> if he chooses to. 4307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 431190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <tr1/tuple> 432190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 433190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 434190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 435190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// If the compiler is not GCC 4.0+, we assume the user is using a 4367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// spec-conforming TR1 implementation. 4377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <tuple> 438190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_USE_OWN_TR1_TUPLE 439190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 4407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_TR1_TUPLE 4417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether clone(2) is supported. 4437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Usually it will only be available on Linux, excluding 4447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Linux on the Itanium architecture. 4457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Also see http://linux.die.net/man/2/clone. 4467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_HAS_CLONE 4477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user didn't tell us, so we need to figure it out. 4487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 449e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_LINUX && !defined(__ia64__) 4507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_CLONE 1 4517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 4527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_HAS_CLONE 0 453e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif // GTEST_OS_LINUX && !defined(__ia64__) 4547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_CLONE 4567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether to support death tests. 458e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Google Test does not support death tests for VC 7.1 and earlier for 459e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// these reasons: 460e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 1. std::vector does not build in VC 7.1 when exceptions are disabled. 461e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 2. std::string does not build in VC 7.1 when exceptions are disabled 462e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// (this is covered by GTEST_HAS_STD_STRING guard). 463e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 3. abort() in a VC 7.1 application compiled as GUI in debug config 464e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// pops up a dialog window that cannot be suppressed programmatically. 465190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_HAS_STD_STRING && \ 466190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || \ 467190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || GTEST_OS_WINDOWS_MINGW) 468e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_DEATH_TEST 1 469190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#include <vector> // NOLINT 470e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif 4717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether to support value-parameterized tests. 4737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if defined(__GNUC__) || (_MSC_VER >= 1400) 4757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TODO(vladl@google.com): get the implementation rid of vector and list 4767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to compile on MSVC 7.1. 477e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_PARAM_TEST 1 4787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // defined(__GNUC__) || (_MSC_VER >= 1400) 4797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether to support type-driven tests. 4817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Typed tests need <typeinfo> and variadic macros, which gcc and VC 4837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 8.0+ support. 4847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if defined(__GNUC__) || (_MSC_VER >= 1400) 485e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_TYPED_TEST 1 486e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_TYPED_TEST_P 1 4877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // defined(__GNUC__) || (_MSC_VER >= 1400) 4887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether to support Combine(). This only makes sense when 4907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// value-parameterized tests are enabled. 491e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE 492e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_HAS_COMBINE 1 493e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif // GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE 4947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Determines whether the system compiler uses UTF-16 for encoding wide strings. 496e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_WIDE_STRING_USES_UTF16_ \ 497e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN) 4987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines some utility macros. 5007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The GNU compiler emits a warning if nested "if" statements are followed by 5027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// an "else" statement and braces are not used to explicitly disambiguate the 5037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "else" binding. This leads to problems with code like: 5047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 5057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// if (gate) 5067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ASSERT_*(condition) << "Some message"; 5077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 5087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The "switch (0) case 0:" idiom is used to suppress this. 5097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef __INTEL_COMPILER 5107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ 5117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 5127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: // NOLINT 5137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif 5147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 515190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Use this annotation at the end of a struct/class definition to 5167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// prevent the compiler from optimizing away instances that are never 5177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// used. This is useful when all interesting logic happens inside the 5187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// c'tor and / or d'tor. Example: 5197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 5207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// struct Foo { 5217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Foo() { ... } 5227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// } GTEST_ATTRIBUTE_UNUSED_; 523190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// 524190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Also use it after a variable or parameter declaration to tell the 525190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// compiler the variable/parameter does not have to be used. 5267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if defined(__GNUC__) && !defined(COMPILER_ICC) 5277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 5287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 5297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_ATTRIBUTE_UNUSED_ 5307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif 5317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A macro to disallow the evil copy constructor and operator= functions 5337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This should be used in the private: declarations for a class. 5347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ 5357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman type(const type &);\ 5367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman void operator=(const type &) 5377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Tell the compiler to warn about unused return values for functions declared 5397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// with this macro. The macro should be used on function declarations 5407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// following the argument list: 5417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 5427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; 5437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) 5447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) 5457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 5467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_MUST_USE_RESULT_ 5477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC 5487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 549190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Determine whether the compiler supports Microsoft's Structured Exception 550190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Handling. This is supported by several Windows compilers but generally 551190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// does not exist on any other system. 552190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifndef GTEST_HAS_SEH 553190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The user didn't tell us, so we need to figure it out. 554190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 555190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if defined(_MSC_VER) || defined(__BORLANDC__) 556190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// These two compilers are known to support SEH. 557190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_HAS_SEH 1 558190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 559190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Assume no SEH. 560190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_HAS_SEH 0 561190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 562190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 563190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_HAS_SEH 564190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 5657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing { 5667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass Message; 5687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal { 5707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass String; 5727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// std::strstream is deprecated. However, we have to use it on 5747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Windows as std::stringstream won't compile on Windows when 5757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// exceptions are disabled. We use std::stringstream on other 5767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// platforms to avoid compiler warnings there. 5777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_STRING 5787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef ::std::stringstream StrStream; 5797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 5807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef ::std::strstream StrStream; 5817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_STRING 5827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 583190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A helper for suppressing warnings on constant condition. It just 584190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// returns 'condition'. 585190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerbool IsTrue(bool condition); 586190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 5877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines scoped_ptr. 5887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This implementation of scoped_ptr is PARTIAL - it only contains 5907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// enough stuff to satisfy Google Test's need. 5917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T> 5927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass scoped_ptr { 5937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 5947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman explicit scoped_ptr(T* p = NULL) : ptr_(p) {} 5957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ~scoped_ptr() { reset(); } 5967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T& operator*() const { return *ptr_; } 5987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T* operator->() const { return ptr_; } 5997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T* get() const { return ptr_; } 6007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T* release() { 6027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T* const ptr = ptr_; 6037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ptr_ = NULL; 6047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return ptr; 6057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman void reset(T* p = NULL) { 6087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (p != ptr_) { 609190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. 6107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman delete ptr_; 6117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ptr_ = p; 6137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 6167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T* ptr_; 6177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); 6197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 6207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines RE. 6227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A simple C++ wrapper for <regex.h>. It uses the POSIX Enxtended 6247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Regular Expression syntax. 6257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass RE { 6267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 6277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Constructs an RE from a string. 6287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_STRING 6297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT 6307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_STRING 6317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_GLOBAL_STRING 6337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT 6347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_GLOBAL_STRING 6357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman RE(const char* regex) { Init(regex); } // NOLINT 6377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ~RE(); 6387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Returns the string representation of the regex. 6407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const char* pattern() const { return pattern_; } 6417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // FullMatch(str, re) returns true iff regular expression re matches 6437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // the entire str. 6447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // PartialMatch(str, re) returns true iff regular expression re 6457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // matches a substring of str (including str itself). 6467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // 6477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // TODO(wan@google.com): make FullMatch() and PartialMatch() work 6487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // when str contains NUL characters. 6497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_STRING 6507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static bool FullMatch(const ::std::string& str, const RE& re) { 6517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return FullMatch(str.c_str(), re); 6527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static bool PartialMatch(const ::std::string& str, const RE& re) { 6547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return PartialMatch(str.c_str(), re); 6557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_STD_STRING 6577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_GLOBAL_STRING 6597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static bool FullMatch(const ::string& str, const RE& re) { 6607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return FullMatch(str.c_str(), re); 6617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static bool PartialMatch(const ::string& str, const RE& re) { 6637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return PartialMatch(str.c_str(), re); 6647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_GLOBAL_STRING 6667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static bool FullMatch(const char* str, const RE& re); 6687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static bool PartialMatch(const char* str, const RE& re); 6697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 6717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman void Init(const char* regex); 6727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // We use a const char* instead of a string, as Google Test may be used 6747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // where string is not available. We also do not use Google Test's own 6757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // String type here, in order to simplify dependencies between the 6767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // files. 6777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const char* pattern_; 678e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer bool is_valid_; 679e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_USES_POSIX_RE 6807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman regex_t full_regex_; // For FullMatch(). 6817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman regex_t partial_regex_; // For PartialMatch(). 682e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#else // GTEST_USES_SIMPLE_RE 683e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer const char* full_pattern_; // For FullMatch(); 684e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif 6857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 686e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer GTEST_DISALLOW_COPY_AND_ASSIGN_(RE); 687e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer}; 6887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines logging utilities: 690190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// GTEST_LOG_(severity) - logs messages at the specified severity level. The 691190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// message itself is streamed into the macro. 6927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LogToStderr() - directs all log messages to stderr. 6937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FlushInfoLog() - flushes informational log messages. 6947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanenum GTestLogSeverity { 6967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_INFO, 6977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_WARNING, 6987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_ERROR, 6997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_FATAL 7007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 7017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 702190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Formats log entry severity, provides a stream object for streaming the 703190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// log message, and terminates the message with a newline when going out of 704190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// scope. 705190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass GTestLog { 706190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public: 707190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GTestLog(GTestLogSeverity severity, const char* file, int line); 7087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 709190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. 710190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ~GTestLog(); 711190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 712190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ::std::ostream& GetStream() { return ::std::cerr; } 713190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 714190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private: 715190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer const GTestLogSeverity severity_; 716190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 717190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); 718190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer}; 719190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 720190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define GTEST_LOG_(severity) \ 721190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ 722190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer __FILE__, __LINE__).GetStream() 7237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninline void LogToStderr() {} 7257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninline void FlushInfoLog() { fflush(NULL); } 7267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines the stderr capturer: 7287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// CaptureStderr - starts capturing stderr. 7297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GetCapturedStderr - stops capturing stderr and returns the captured string. 7307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 731e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramervoid CaptureStderr(); 732190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerString GetCapturedStderr(); 733e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 734e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_DEATH_TEST 7357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A copy of all command line arguments. Set by InitGoogleTest(). 7377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanextern ::std::vector<String> g_argvs; 7387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_HAS_DEATH_TEST implies we have ::std::string. 7407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst ::std::vector<String>& GetArgvs(); 7417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_DEATH_TEST 7437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines synchronization primitives. 7457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A dummy implementation of synchronization primitives (mutex, lock, 7477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// and thread-local variable). Necessary for compiling Google Test where 7487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// mutex is not supported - using Google Test in multiple threads is not 7497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// supported on such platforms. 7507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass Mutex { 7527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 7537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman Mutex() {} 7547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman explicit Mutex(int /*unused*/) {} 7557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman void AssertHeld() const {} 7567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman enum { NO_CONSTRUCTOR_NEEDED_FOR_STATIC_MUTEX = 0 }; 7577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 7587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// We cannot call it MutexLock directly as the ctor declaration would 7607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// conflict with a macro named MutexLock, which is defined on some 7617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// platforms. Hence the typedef trick below. 7627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass GTestMutexLock { 7637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 7647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman explicit GTestMutexLock(Mutex*) {} // NOLINT 7657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 7667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef GTestMutexLock MutexLock; 7687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T> 7707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass ThreadLocal { 7717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 7727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ThreadLocal() : value_() {} 7737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman explicit ThreadLocal(const T& value) : value_(value) {} 7747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T* pointer() { return &value_; } 7757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const T* pointer() const { return &value_; } 7767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const T& get() const { return value_; } 7777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman void set(const T& value) { value_ = value; } 7787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 7797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman T value_; 7807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 7817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 782190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Returns the number of threads running in the process, or 0 to indicate that 783190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// we cannot detect it. 784190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramersize_t GetThreadCount(); 7857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The above synchronization primitives have dummy implementations. 7877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Therefore Google Test is not thread-safe. 7887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_IS_THREADSAFE 0 7897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if defined(__SYMBIAN32__) || defined(__IBMCPP__) 7917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Passing non-POD classes through ellipsis (...) crashes the ARM 7937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// compiler. The Nokia Symbian and the IBM XL C/C++ compiler try to 7947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// instantiate a copy constructor for objects passed through ellipsis 7957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (...), failing for uncopyable objects. We define this to indicate 7967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the fact. 7977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_ELLIPSIS_NEEDS_COPY_ 1 7987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between 8007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// const T& and const T* in a function template. These compilers 8017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// _can_ decide between class template specializations for T and T*, 8027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// so a tr1::type_traits-like is_pointer works. 8037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_NEEDS_IS_POINTER_ 1 8047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // defined(__SYMBIAN32__) || defined(__IBMCPP__) 8067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <bool bool_value> 8087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstruct bool_constant { 8097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef bool_constant<bool_value> type; 8107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static const bool value = bool_value; 8117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 8127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <bool bool_value> const bool bool_constant<bool_value>::value; 8137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef bool_constant<false> false_type; 8157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef bool_constant<true> true_type; 8167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T> 8187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstruct is_pointer : public false_type {}; 8197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T> 8217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstruct is_pointer<T*> : public true_type {}; 8227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 823e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_WINDOWS 824e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_PATH_SEP_ "\\" 825190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The biggest signed integer type the compiler supports. 826190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramertypedef __int64 BiggestInt; 827e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#else 828e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_PATH_SEP_ "/" 829190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramertypedef long long BiggestInt; // NOLINT 830e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif // GTEST_OS_WINDOWS 831e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 832190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The testing::internal::posix namespace holds wrappers for common 833190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// POSIX functions. These wrappers hide the differences between 834190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Windows/MSVC and POSIX systems. Since some compilers define these 835190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// standard functions as macros, the wrapper cannot have the same name 836190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// as the wrapped function. 837190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 838190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramernamespace posix { 839190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 840190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Functions with a different name on Windows. 841190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 842e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_WINDOWS 843190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 844190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramertypedef struct _stat StatStruct; 845190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 846190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifdef __BORLANDC__ 847190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int IsATTY(int fd) { return isatty(fd); } 848190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int StrCaseCmp(const char* s1, const char* s2) { 849190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return stricmp(s1, s2); 850190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 851190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline char* StrDup(const char* src) { return strdup(src); } 852190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else // !__BORLANDC__ 853190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_OS_WINDOWS_MOBILE 854190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int IsATTY(int /* fd */) { return 0; } 8557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 856190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int IsATTY(int fd) { return _isatty(fd); } 857190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_OS_WINDOWS_MOBILE 858190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int StrCaseCmp(const char* s1, const char* s2) { 859190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return _stricmp(s1, s2); 860190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 861190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline char* StrDup(const char* src) { return _strdup(src); } 862190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // __BORLANDC__ 863190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 864190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_OS_WINDOWS_MOBILE 865190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); } 866190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this 867190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// time and thus not defined there. 868190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 869190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int FileNo(FILE* file) { return _fileno(file); } 870190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } 871190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int RmDir(const char* dir) { return _rmdir(dir); } 872190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline bool IsDir(const StatStruct& st) { 873190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return (_S_IFDIR & st.st_mode) != 0; 874190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 875190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_OS_WINDOWS_MOBILE 876190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 877190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 878190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 879190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramertypedef struct stat StatStruct; 880190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 881190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int FileNo(FILE* file) { return fileno(file); } 882190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int IsATTY(int fd) { return isatty(fd); } 883190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } 884190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int StrCaseCmp(const char* s1, const char* s2) { 885190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return strcasecmp(s1, s2); 886190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 887190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline char* StrDup(const char* src) { return strdup(src); } 888190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int RmDir(const char* dir) { return rmdir(dir); } 889190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } 890190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 8917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_OS_WINDOWS 8927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 893190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Functions deprecated by MSVC 8.0. 894190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 895190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifdef _MSC_VER 896190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Temporarily disable warning 4996 (deprecated function). 897190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#pragma warning(push) 898190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#pragma warning(disable:4996) 899190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 900190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 901190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline const char* StrNCpy(char* dest, const char* src, size_t n) { 902190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return strncpy(dest, src, n); 903190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 904190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 905190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and 906190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// StrError() aren't needed on Windows CE at this time and thus not 907190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// defined there. 908190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 909190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if !GTEST_OS_WINDOWS_MOBILE 910190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int ChDir(const char* dir) { return chdir(dir); } 911190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 912190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline FILE* FOpen(const char* path, const char* mode) { 913190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return fopen(path, mode); 914190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 915190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if !GTEST_OS_WINDOWS_MOBILE 916190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline FILE *FReopen(const char* path, const char* mode, FILE* stream) { 917190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return freopen(path, mode, stream); 918190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 919190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } 920190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 921190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int FClose(FILE* fp) { return fclose(fp); } 922190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if !GTEST_OS_WINDOWS_MOBILE 923190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int Read(int fd, void* buf, unsigned int count) { 924190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return static_cast<int>(read(fd, buf, count)); 925190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 926190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int Write(int fd, const void* buf, unsigned int count) { 927190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return static_cast<int>(write(fd, buf, count)); 928190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 929190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline int Close(int fd) { return close(fd); } 930190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline const char* StrError(int errnum) { return strerror(errnum); } 931190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 932190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline const char* GetEnv(const char* name) { 933190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_OS_WINDOWS_MOBILE 934190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // We are on Windows CE, which has no environment variables. 935190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 936190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#elif defined(__BORLANDC__) 937190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // Environment variables which we programmatically clear will be set to the 938190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // empty string rather than unset (NULL). Handle that case. 939190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer const char* const env = getenv(name); 940190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return (env != NULL && env[0] != '\0') ? env : NULL; 941190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 942190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return getenv(name); 943190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 944190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 945190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 946190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#ifdef _MSC_VER 947190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#pragma warning(pop) // Restores the warning state. 948190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 949190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 950190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_OS_WINDOWS_MOBILE 951190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Windows CE has no C library. The abort() function is used in 952190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// several places in Google Test. This implementation provides a reasonable 953190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// imitation of standard behaviour. 954190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid Abort(); 955190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 956190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinline void Abort() { abort(); } 957190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif // GTEST_OS_WINDOWS_MOBILE 958190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 959190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} // namespace posix 960190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 9617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The maximum number a BiggestInt can represent. This definition 9627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// works no matter BiggestInt is represented in one's complement or 9637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// two's complement. 9647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 9657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// We cannot rely on numeric_limits in STL, as __int64 and long long 9667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// are not part of standard C++ and numeric_limits doesn't need to be 9677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// defined for them. 9687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst BiggestInt kMaxBiggestInt = 9697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1)); 9707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 9717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This template class serves as a compile-time function from size to 9727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// type. It maps a size in bytes to a primitive type with that 9737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// size. e.g. 9747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 9757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TypeWithSize<4>::UInt 9767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 9777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is typedef-ed to be unsigned int (unsigned integer made up of 4 9787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// bytes). 9797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 9807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Such functionality should belong to STL, but I cannot find it 9817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// there. 9827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 9837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Google Test uses this class in the implementation of floating-point 9847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// comparison. 9857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 9867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For now it only handles UInt (unsigned int) as that's all Google Test 9877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// needs. Other types can be easily added in the future if need 9887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// arises. 9897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <size_t size> 9907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass TypeWithSize { 9917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 9927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // This prevents the user from using TypeWithSize<N> with incorrect 9937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // values of N. 9947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef void UInt; 9957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 9967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 9977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The specialization for size 4. 9987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <> 9997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass TypeWithSize<4> { 10007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 10017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // unsigned int has size 4 in both gcc and MSVC. 10027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // 10037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // As base/basictypes.h doesn't compile on Windows, we cannot use 10047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // uint32, uint64, and etc here. 10057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef int Int; 10067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef unsigned int UInt; 10077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 10087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The specialization for size 8. 10107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <> 10117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass TypeWithSize<8> { 10127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 1013e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_WINDOWS 10147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef __int64 Int; 10157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef unsigned __int64 UInt; 10167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 10177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef long long Int; // NOLINT 10187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman typedef unsigned long long UInt; // NOLINT 10197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_OS_WINDOWS 10207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 10217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Integer types of known sizes. 10237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef TypeWithSize<4>::Int Int32; 10247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef TypeWithSize<4>::UInt UInt32; 10257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef TypeWithSize<8>::Int Int64; 10267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef TypeWithSize<8>::UInt UInt64; 10277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. 10287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Utilities for command line flags and environment variables. 10307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE. 10327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 10337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition 10347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is not satisfied. 10357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Synopsys: 10367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_CHECK_(boolean_condition); 10377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// or 10387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_CHECK_(boolean_condition) << "Additional message"; 10397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 10407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This checks the condition and if the condition is not satisfied 10417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// it prints message about the condition violation, including the 10427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// condition itself, plus additional message streamed into it, if any, 10437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// and then it aborts the program. It aborts the program irrespective of 10447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// whether it is built in the debug mode or not. 10457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_CHECK_(condition) \ 10467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1047190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (::testing::internal::IsTrue(condition)) \ 10487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ; \ 10497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman else \ 1050190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GTEST_LOG_(FATAL) << "Condition " #condition " failed. " 10517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macro for referencing flags. 10537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_FLAG(name) FLAGS_gtest_##name 10547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for declaring flags. 10567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DECLARE_bool_(name) extern bool GTEST_FLAG(name) 10577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DECLARE_int32_(name) \ 10587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman extern ::testing::internal::Int32 GTEST_FLAG(name) 10597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DECLARE_string_(name) \ 10607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman extern ::testing::internal::String GTEST_FLAG(name) 10617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for defining flags. 10637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DEFINE_bool_(name, default_val, doc) \ 10647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bool GTEST_FLAG(name) = (default_val) 10657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DEFINE_int32_(name, default_val, doc) \ 10667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) 10677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_DEFINE_string_(name, default_val, doc) \ 10687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::internal::String GTEST_FLAG(name) = (default_val) 10697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Parses 'str' for a 32-bit signed integer. If successful, writes the result 10717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to *value and returns true; otherwise leaves *value unchanged and returns 10727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// false. 10737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TODO(chandlerc): Find a better way to refactor flag and environment parsing 10747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// out of both gtest-port.cc and gtest.cc to avoid exporting this utility 10757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// function. 10767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanbool ParseInt32(const Message& src_text, const char* str, Int32* value); 10777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Parses a bool/Int32/string from the environment variable 10797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// corresponding to the given Google Test flag. 10807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanbool BoolFromGTestEnv(const char* flag, bool default_val); 10817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanInt32 Int32FromGTestEnv(const char* flag, Int32 default_val); 10827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst char* StringFromGTestEnv(const char* flag, const char* default_val); 10837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} // namespace internal 10857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} // namespace testing 10867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 1088