gtest-port.h revision 84190c7c1f1b899ad83fdd8e110bde08ad281534
11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2005, Google Inc.
21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved.
31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without
51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are
61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met:
71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions of source code must retain the above copyright
91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer.
101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions in binary form must reproduce the above
111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer
121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the
131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution.
141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Neither the name of Google Inc. nor the names of its
151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from
161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission.
171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Authors: wan@google.com (Zhanyong Wan)
311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Low-level types and utilities for porting Google Test to various
331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// platforms.  They are subject to change without notice.  DO NOT USE
341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEM IN USER CODE.
351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user can define the following macros in the build script to
401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// control Google Test's behavior.  If the user doesn't define a macro
411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in this list, Google Test will define it.
421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              is/isn't available.
451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              is/isn't available (some systems define
471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              ::string, which is different to std::string).
481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              is/isn't available (some systems define
501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              ::wstring, which is different to std::wstring).
511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              is/isn't available.
531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              enabled.
551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_STD_STRING     - Define it to 1/0 to indicate that
561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              std::string does/doesn't work (Google Test can
571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              be used where std::string is unavailable).
581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              std::wstring does/doesn't work (Google Test can
601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              be used where std::wstring is unavailable).
611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_TR1_TUPLE 1    - Define it to 1/0 to indicate tr1::tuple
621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              is/isn't available.
631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This header defines the following utilities:
651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros indicating the current platform (defined to 1 if compiled on
671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the given platform; otherwise undefined):
68f6071db8c6f4192253a3c544379ad35dcb64dab0Nicolas Catania//   GTEST_OS_ANDROID  - Android
691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_CYGWIN   - Cygwin
701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_LINUX    - Linux
711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_MAC      - Mac OS X
721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_SOLARIS  - Sun Solaris
731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_SYMBIAN  - Symbian
741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_WINDOWS  - Windows
751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_OS_ZOS      - z/OS
761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// most stable support.  Since core members of the Google Test project
791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// don't have access to other platforms, support for them may be less
801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// stable.  If you notice any problems on your platform, please notify
811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// googletestframework@googlegroups.com (patches for fixing them are
821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// even more welcome!).
831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Note that it is possible that none of the GTEST_OS_* macros are defined.
851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros indicating available Google Test features (defined to 1 if
871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the corresponding feature is supported; otherwise undefined):
881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                            tests)
901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_DEATH_TEST   - death tests
911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_TYPED_TEST   - typed tests
931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used.
951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                            the above two are mutually exclusive.
971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros for basic C++ coding:
991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances don't have to
1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                              be used.
1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
1041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Synchronization:
1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                  - synchronization primitives.
1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         synchronization primitives have real implementations
1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         and Google Test is thread-safe; or 0 otherwise.
1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Template meta programming:
1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Smart pointers:
1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   scoped_ptr     - as in TR2.
1171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Regular expressions:
1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   RE             - a simple regular expression class using the POSIX
1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                    Extended Regular Expression syntax.  Not available on
1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                    Windows.
1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Logging:
1241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_LOG_()   - logs messages at the specified severity level.
1251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   LogToStderr()  - directs all log messages to stderr.
1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   FlushInfoLog() - flushes informational log messages.
1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Stderr capturing:
1291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   CaptureStderr()     - starts capturing stderr.
1301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GetCapturedStderr() - stops capturing stderr and returns the captured
1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                         string.
1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Integer types:
1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   TypeWithSize   - maps an integer to a int type.
1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   Int32, UInt32, Int64, UInt64, TimeInMillis
1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//                  - integers of known sizes.
1371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   BiggestInt     - the biggest signed integer type.
1381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Command-line utilities:
1401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_FLAG()       - references a flag.
1411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_DECLARE_*()  - declares a flag.
1421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_DEFINE_*()   - defines a flag.
1431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GetArgvs()         - returns the command line as a vector of strings.
1441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
1451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Environment variable utilities:
1461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GetEnv()             - gets the value of an environment variable.
1471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   BoolFromGTestEnv()   - parses a bool environment variable.
1481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   Int32FromGTestEnv()  - parses an Int32 environment variable.
1491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   StringFromGTestEnv() - parses a string environment variable.
1501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <stdlib.h>
1521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <stdio.h>
1531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <iostream>  // Used for GTEST_CHECK_
1541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
1561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_FLAG_PREFIX_ "gtest_"
1571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
1581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_NAME_ "Google Test"
1591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
1601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines the version of gcc that is used to compile this.
1621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __GNUC__
1631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 40302 means version 4.3.2.
1641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_GCC_VER_ \
1651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
1661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // __GNUC__
1671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines the platform on which Google Test is compiled.
1691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __CYGWIN__
1701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_CYGWIN 1
1711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif __SYMBIAN32__
1721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_SYMBIAN 1
1731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined _MSC_VER
1741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TODO(kenton@google.com): GTEST_OS_WINDOWS is currently used to mean
1751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   both "The OS is Windows" and "The compiler is MSVC".  These
1761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   meanings really should be separated in order to better support
1771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   Windows compilers other than MSVC.
1781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_WINDOWS 1
1791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined __APPLE__
1801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_MAC 1
181f6071db8c6f4192253a3c544379ad35dcb64dab0Nicolas Catania#elif defined ANDROID
182f6071db8c6f4192253a3c544379ad35dcb64dab0Nicolas Catania#define GTEST_OS_ANDROID 1
1831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined __linux__
1841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_LINUX 1
1851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined __MVS__
1861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_ZOS 1
1871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined(__sun) && defined(__SVR4)
1881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_OS_SOLARIS 1
1891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // _MSC_VER
1901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
1921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// On some platforms, <regex.h> needs someone to define size_t, and
1941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// won't compile otherwise.  We can #include it here as we already
1951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// included <stdlib.h>, which is guaranteed to define size_t through
1961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// <stddef.h>.
1971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <regex.h>  // NOLINT
1981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_USES_POSIX_RE 1
1991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
2011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// <regex.h> may not be available on this platform.  Use our own
2031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// simple regex implementation instead.
2041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_USES_SIMPLE_RE 1
2051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines GTEST_HAS_EXCEPTIONS to 1 if exceptions are enabled, or 0
2091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// otherwise.
2101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef _MSC_VER  // Compiled by MSVC?
2121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Assumes that exceptions are enabled by default.
2131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef _HAS_EXCEPTIONS  // MSVC uses this macro to enable exceptions.
2141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define _HAS_EXCEPTIONS 1
2151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // _HAS_EXCEPTIONS
2161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
2171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else  // The compiler is not MSVC.
2181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.  For
2191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// other compilers, we assume exceptions are disabled to be
2201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// conservative.
2211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__) && __EXCEPTIONS
2221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_EXCEPTIONS 1
2231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
2241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_EXCEPTIONS 0
2251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // defined(__GNUC__) && __EXCEPTIONS
2261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // _MSC_VER
2271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether ::std::string and ::string are available.
2291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_STD_STRING
2311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::std::string is available, so we
2321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// need to figure it out.  The only environment that we know
2331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ::std::string is not available is MSVC 7.1 or lower with exceptions
2341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// disabled.
2351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(_MSC_VER) && (_MSC_VER < 1400) && !GTEST_HAS_EXCEPTIONS
2361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_STD_STRING 0
2371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
2381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_STD_STRING 1
2391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
2401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING
2411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_GLOBAL_STRING
2431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::string is available, so we need
2441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to figure it out.
2451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_GLOBAL_STRING 0
2471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_GLOBAL_STRING
2491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_STD_WSTRING
2511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::std::wstring is available, so we need
2521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to figure it out.
2531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
2541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   is available.
2551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
256f6071db8c6f4192253a3c544379ad35dcb64dab0Nicolas Catania#if GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || GTEST_OS_ANDROID
2571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Cygwin 1.5 and below doesn't support ::std::wstring.
2581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Cygwin 1.7 might add wstring support; this should be updated when clear.
2591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Solaris' libc++ doesn't support it either.
260f6071db8c6f4192253a3c544379ad35dcb64dab0Nicolas Catania// Android does not support wstring and never will.
2611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_STD_WSTRING 0
2621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
2631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_STD_WSTRING GTEST_HAS_STD_STRING
2641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_OS_CYGWIN || GTEST_OS_SOLARIS
2651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_WSTRING
2671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_GLOBAL_WSTRING
2691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether ::wstring is available, so we need
2701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to figure it out.
2711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_GLOBAL_WSTRING \
2721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
2731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_GLOBAL_WSTRING
2741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING || \
2761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
2771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <string>  // NOLINT
2781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING ||
2791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
2801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING
2821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <sstream>  // NOLINT
2831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
2841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <strstream>  // NOLINT
2851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING
2861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether RTTI is available.
2881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_RTTI
2891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us whether RTTI is enabled, so we need to
2901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// figure it out.
2911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef _MSC_VER
2931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
2951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 1
2961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
2971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 0
2981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // _CPPRTTI
2991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif defined(__GNUC__)
3011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
30284190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania// Android uses GCC but does not support RTTI
30384190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania#if GTEST_OS_ANDROID
30484190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania#define GTEST_HAS_RTTI 0
30584190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania#else
3061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
3071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_GCC_VER_ >= 40302
3081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __GXX_RTTI
3091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 1
3101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
3111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 0
3121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // __GXX_RTTI
3131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
3141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// For gcc versions smaller than 4.3.2, we assume RTTI is enabled.
3151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 1
3161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_GCC_VER >= 40302
31784190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania#endif  // GTEST_OS_ANDROID
3181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
3201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Unknown compiler - assume RTTI is enabled.
3221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_RTTI 1
3231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // _MSC_VER
3251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_RTTI
3271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether <pthread.h> is available.
3291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_PTHREAD
3301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us, so we need to figure it out.
3311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC)
3321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_PTHREAD
3331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether tr1/tuple is available.  If you have tr1/tuple
3351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// on your platform, define GTEST_HAS_TR1_TUPLE=1 for both the Google
3361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Test project and your tests. If you would like Google Test to detect
3371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// tr1/tuple on your platform automatically, please open an issue
3381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// ticket at http://code.google.com/p/googletest.
3391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_TR1_TUPLE
3401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us, so we need to figure it out.
3411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GCC provides <tr1/tuple> since 4.0.0.
3433f9bef5994073d5f7e91e638ab000821ea0f7628Nicolas Catania#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) && !GTEST_OS_ANDROID
3441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_TR1_TUPLE 1
3451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
3461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_TR1_TUPLE 0
3471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // __GNUC__
3481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_TR1_TUPLE
3491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// To avoid conditional compilation everywhere, we make it
3511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// gtest-port.h's responsibility to #include the header implementing
3521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// tr1/tuple.
3531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_TR1_TUPLE
3541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__)
3551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GCC implements tr1/tuple in the <tr1/tuple> header.  This does not
3561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// conform to the TR1 spec, which requires the header to be <tuple>.
3571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <tr1/tuple>
3581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
3591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// If the compiler is not GCC, we assume the user is using a
3601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// spec-conforming TR1 implementation.
3611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <tuple>
3621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // __GNUC__
3631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_TR1_TUPLE
3641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether clone(2) is supported.
3661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Usually it will only be available on Linux, excluding
3671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Linux on the Itanium architecture.
3681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Also see http://linux.die.net/man/2/clone.
3691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_HAS_CLONE
3701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The user didn't tell us, so we need to figure it out.
3711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_LINUX && !defined(__ia64__)
3731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_CLONE 1
3741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
3751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_CLONE 0
3761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_OS_LINUX && !defined(__ia64__)
3771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_CLONE
3791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support death tests.
3811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Google Test does not support death tests for VC 7.1 and earlier for
3821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// these reasons:
3831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   1. std::vector does not build in VC 7.1 when exceptions are disabled.
3841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   2. std::string does not build in VC 7.1 when exceptions are disabled
3851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//      (this is covered by GTEST_HAS_STD_STRING guard).
3861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   3. abort() in a VC 7.1 application compiled as GUI in debug config
3871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//      pops up a dialog window that cannot be suppressed programmatically.
3881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING && (GTEST_OS_LINUX || \
3891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                             GTEST_OS_MAC || \
3901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                             GTEST_OS_CYGWIN || \
39184190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania                             (GTEST_OS_WINDOWS && _MSC_VER >= 1400))
3921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_DEATH_TEST 1
3931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include <vector>
3941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
3951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support value-parameterized tests.
3971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__) || (_MSC_VER >= 1400)
3991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TODO(vladl@google.com): get the implementation rid of vector and list
4001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to compile on MSVC 7.1.
4011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_PARAM_TEST 1
4021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // defined(__GNUC__) || (_MSC_VER >= 1400)
4031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support type-driven tests.
4051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Typed tests need <typeinfo> and variadic macros, which gcc and VC
4071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 8.0+ support.
40884190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania// TODO: We should be able to support these on Android but we don't
40984190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania// have cxxabi.h when building for the target but we have it for the host.
41084190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania#if ( defined(__GNUC__) || (_MSC_VER >= 1400) ) && !defined(GTEST_OS_ANDROID)
4111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_TYPED_TEST 1
4121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_TYPED_TEST_P 1
41384190c7c1f1b899ad83fdd8e110bde08ad281534Nicolas Catania#endif  // defined(__GNUC__) || (_MSC_VER >= 1400) && !defined(GTEST_OS_ANDROID)
4141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether to support Combine(). This only makes sense when
4161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// value-parameterized tests are enabled.
4171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE
4181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_HAS_COMBINE 1
4191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE
4201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Determines whether the system compiler uses UTF-16 for encoding wide strings.
4221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_WIDE_STRING_USES_UTF16_ \
4231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN)
4241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines some utility macros.
4261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The GNU compiler emits a warning if nested "if" statements are followed by
4281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// an "else" statement and braces are not used to explicitly disambiguate the
4291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "else" binding.  This leads to problems with code like:
4301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
4311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   if (gate)
4321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     ASSERT_*(condition) << "Some message";
4331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
4341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The "switch (0) case 0:" idiom is used to suppress this.
4351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef __INTEL_COMPILER
4361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_AMBIGUOUS_ELSE_BLOCKER_
4371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
4381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0:  // NOLINT
4391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
4401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Use this annotation at the end of a struct / class definition to
4421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// prevent the compiler from optimizing away instances that are never
4431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// used.  This is useful when all interesting logic happens inside the
4441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// c'tor and / or d'tor.  Example:
4451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
4461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   struct Foo {
4471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     Foo() { ... }
4481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   } GTEST_ATTRIBUTE_UNUSED_;
4491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__) && !defined(COMPILER_ICC)
4501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
4511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
4521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_ATTRIBUTE_UNUSED_
4531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
4541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A macro to disallow the evil copy constructor and operator= functions
4561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This should be used in the private: declarations for a class.
4571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
4581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  type(const type &);\
4591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void operator=(const type &)
4601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tell the compiler to warn about unused return values for functions declared
4621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// with this macro.  The macro should be used on function declarations
4631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// following the argument list:
4641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
4651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
4661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
4671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
4681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
4691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_MUST_USE_RESULT_
4701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
4711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace testing {
4731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass Message;
4751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace internal {
4771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass String;
4791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// std::strstream is deprecated.  However, we have to use it on
4811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Windows as std::stringstream won't compile on Windows when
4821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// exceptions are disabled.  We use std::stringstream on other
4831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// platforms to avoid compiler warnings there.
4841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING
4851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef ::std::stringstream StrStream;
4861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
4871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef ::std::strstream StrStream;
4881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING
4891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines scoped_ptr.
4911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This implementation of scoped_ptr is PARTIAL - it only contains
4931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// enough stuff to satisfy Google Test's need.
4941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T>
4951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass scoped_ptr {
4961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
4971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
4981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ~scoped_ptr() { reset(); }
4991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T& operator*() const { return *ptr_; }
5011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T* operator->() const { return ptr_; }
5021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T* get() const { return ptr_; }
5031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T* release() {
5051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    T* const ptr = ptr_;
5061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ptr_ = NULL;
5071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return ptr;
5081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void reset(T* p = NULL) {
5111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    if (p != ptr_) {
5121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      if (sizeof(T) > 0) {  // Makes sure T is a complete type.
5131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        delete ptr_;
5141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      }
5151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ptr_ = p;
5161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
5171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
5191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T* ptr_;
5201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
5221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
5231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines RE.
5251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A simple C++ wrapper for <regex.h>.  It uses the POSIX Enxtended
5271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Regular Expression syntax.
5281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass RE {
5291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
5301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // Constructs an RE from a string.
5311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING
5321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
5331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING
5341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_GLOBAL_STRING
5361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
5371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_GLOBAL_STRING
5381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RE(const char* regex) { Init(regex); }  // NOLINT
5401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ~RE();
5411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // Returns the string representation of the regex.
5431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const char* pattern() const { return pattern_; }
5441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // FullMatch(str, re) returns true iff regular expression re matches
5461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // the entire str.
5471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // PartialMatch(str, re) returns true iff regular expression re
5481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // matches a substring of str (including str itself).
5491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  //
5501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // TODO(wan@google.com): make FullMatch() and PartialMatch() work
5511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // when str contains NUL characters.
5521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING
5531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static bool FullMatch(const ::std::string& str, const RE& re) {
5541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return FullMatch(str.c_str(), re);
5551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static bool PartialMatch(const ::std::string& str, const RE& re) {
5571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return PartialMatch(str.c_str(), re);
5581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING
5601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_GLOBAL_STRING
5621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static bool FullMatch(const ::string& str, const RE& re) {
5631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return FullMatch(str.c_str(), re);
5641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static bool PartialMatch(const ::string& str, const RE& re) {
5661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    return PartialMatch(str.c_str(), re);
5671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
5681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_GLOBAL_STRING
5691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static bool FullMatch(const char* str, const RE& re);
5711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static bool PartialMatch(const char* str, const RE& re);
5721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
5741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void Init(const char* regex);
5751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // We use a const char* instead of a string, as Google Test may be used
5771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // where string is not available.  We also do not use Google Test's own
5781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // String type here, in order to simplify dependencies between the
5791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // files.
5801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const char* pattern_;
5811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  bool is_valid_;
5821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_USES_POSIX_RE
5831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  regex_t full_regex_;     // For FullMatch().
5841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  regex_t partial_regex_;  // For PartialMatch().
5851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else  // GTEST_USES_SIMPLE_RE
5861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const char* full_pattern_;  // For FullMatch();
5871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
5881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_DISALLOW_COPY_AND_ASSIGN_(RE);
5901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
5911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines logging utilities:
5931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GTEST_LOG_()   - logs messages at the specified severity level.
5941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   LogToStderr()  - directs all log messages to stderr.
5951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   FlushInfoLog() - flushes informational log messages.
5961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaenum GTestLogSeverity {
5981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_INFO,
5991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_WARNING,
6001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ERROR,
6011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_FATAL
6021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
6031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniavoid GTestLog(GTestLogSeverity severity, const char* file,
6051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania              int line, const char* msg);
6061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_LOG_(severity, msg)\
6081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ::testing::internal::GTestLog(\
6091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        ::testing::internal::GTEST_##severity, __FILE__, __LINE__, \
6101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania        (::testing::Message() << (msg)).GetString().c_str())
6111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline void LogToStderr() {}
6131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline void FlushInfoLog() { fflush(NULL); }
6141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines the stderr capturer:
6161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   CaptureStderr     - starts capturing stderr.
6171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   GetCapturedStderr - stops capturing stderr and returns the captured string.
6181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_STD_STRING
6201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniavoid CaptureStderr();
6211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania::std::string GetCapturedStderr();
6221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_STD_STRING
6231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_HAS_DEATH_TEST
6251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A copy of all command line arguments.  Set by InitGoogleTest().
6271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaextern ::std::vector<String> g_argvs;
6281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_HAS_DEATH_TEST implies we have ::std::string.
6301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst ::std::vector<String>& GetArgvs();
6311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_HAS_DEATH_TEST
6331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines synchronization primitives.
6351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A dummy implementation of synchronization primitives (mutex, lock,
6371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// and thread-local variable).  Necessary for compiling Google Test where
6381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// mutex is not supported - using Google Test in multiple threads is not
6391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// supported on such platforms.
6401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass Mutex {
6421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
6431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  Mutex() {}
6441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  explicit Mutex(int /*unused*/) {}
6451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void AssertHeld() const {}
6461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  enum { NO_CONSTRUCTOR_NEEDED_FOR_STATIC_MUTEX = 0 };
6471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
6481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// We cannot call it MutexLock directly as the ctor declaration would
6501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// conflict with a macro named MutexLock, which is defined on some
6511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// platforms.  Hence the typedef trick below.
6521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass GTestMutexLock {
6531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
6541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  explicit GTestMutexLock(Mutex*) {}  // NOLINT
6551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
6561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef GTestMutexLock MutexLock;
6581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T>
6601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass ThreadLocal {
6611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
6621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ThreadLocal() : value_() {}
6631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  explicit ThreadLocal(const T& value) : value_(value) {}
6641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T* pointer() { return &value_; }
6651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T* pointer() const { return &value_; }
6661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  const T& get() const { return value_; }
6671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void set(const T& value) { value_ = value; }
6681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private:
6691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  T value_;
6701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
6711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// There's no portable way to detect the number of threads, so we just
6731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// return 0 to indicate that we cannot detect it.
6741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline size_t GetThreadCount() { return 0; }
6751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The above synchronization primitives have dummy implementations.
6771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Therefore Google Test is not thread-safe.
6781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_IS_THREADSAFE 0
6791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
6811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Passing non-POD classes through ellipsis (...) crashes the ARM
6831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// compiler.  The Nokia Symbian and the IBM XL C/C++ compiler try to
6841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// instantiate a copy constructor for objects passed through ellipsis
6851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (...), failing for uncopyable objects.  We define this to indicate
6861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// the fact.
6871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_ELLIPSIS_NEEDS_COPY_ 1
6881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
6901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// const T& and const T* in a function template.  These compilers
6911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// _can_ decide between class template specializations for T and T*,
6921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// so a tr1::type_traits-like is_pointer works.
6931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_NEEDS_IS_POINTER_ 1
6941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // defined(__SYMBIAN32__) || defined(__IBMCPP__)
6961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <bool bool_value>
6981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniastruct bool_constant {
6991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef bool_constant<bool_value> type;
7001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  static const bool value = bool_value;
7011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
7021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <bool bool_value> const bool bool_constant<bool_value>::value;
7031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef bool_constant<false> false_type;
7051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef bool_constant<true> true_type;
7061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T>
7081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniastruct is_pointer : public false_type {};
7091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename T>
7111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniastruct is_pointer<T*> : public true_type {};
7121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_WINDOWS
7141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PATH_SEP_ "\\"
7151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
7161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PATH_SEP_ "/"
7171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_OS_WINDOWS
7181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines BiggestInt as the biggest signed integer type the compiler
7201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// supports.
7211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_WINDOWS
7221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef __int64 BiggestInt;
7231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
7241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef long long BiggestInt;  // NOLINT
7251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_OS_WINDOWS
7261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The maximum number a BiggestInt can represent.  This definition
7281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// works no matter BiggestInt is represented in one's complement or
7291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// two's complement.
7301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
7311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// We cannot rely on numeric_limits in STL, as __int64 and long long
7321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// are not part of standard C++ and numeric_limits doesn't need to be
7331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// defined for them.
7341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst BiggestInt kMaxBiggestInt =
7351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
7361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This template class serves as a compile-time function from size to
7381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// type.  It maps a size in bytes to a primitive type with that
7391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// size. e.g.
7401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
7411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   TypeWithSize<4>::UInt
7421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
7431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is typedef-ed to be unsigned int (unsigned integer made up of 4
7441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// bytes).
7451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
7461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Such functionality should belong to STL, but I cannot find it
7471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// there.
7481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
7491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Google Test uses this class in the implementation of floating-point
7501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// comparison.
7511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
7521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// For now it only handles UInt (unsigned int) as that's all Google Test
7531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// needs.  Other types can be easily added in the future if need
7541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// arises.
7551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <size_t size>
7561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass TypeWithSize {
7571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
7581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // This prevents the user from using TypeWithSize<N> with incorrect
7591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // values of N.
7601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef void UInt;
7611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
7621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The specialization for size 4.
7641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <>
7651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass TypeWithSize<4> {
7661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
7671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // unsigned int has size 4 in both gcc and MSVC.
7681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  //
7691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // As base/basictypes.h doesn't compile on Windows, we cannot use
7701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // uint32, uint64, and etc here.
7711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef int Int;
7721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef unsigned int UInt;
7731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
7741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// The specialization for size 8.
7761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <>
7771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass TypeWithSize<8> {
7781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
7791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_OS_WINDOWS
7801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef __int64 Int;
7811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef unsigned __int64 UInt;
7821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
7831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef long long Int;  // NOLINT
7841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  typedef unsigned long long UInt;  // NOLINT
7851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_OS_WINDOWS
7861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
7871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Integer types of known sizes.
7891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<4>::Int Int32;
7901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<4>::UInt UInt32;
7911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<8>::Int Int64;
7921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<8>::UInt UInt64;
7931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
7941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Utilities for command line flags and environment variables.
7961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
7971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A wrapper for getenv() that works on Linux, Windows, and Mac OS.
7981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline const char* GetEnv(const char* name) {
7991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef _WIN32_WCE  // We are on Windows CE.
8001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // CE has no environment variables.
8011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return NULL;
8021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif GTEST_OS_WINDOWS  // We are on Windows proper.
8031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // MSVC 8 deprecates getenv(), so we want to suppress warning 4996
8041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  // (deprecated function) there.
8051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#pragma warning(push)          // Saves the current warning state.
8061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#pragma warning(disable:4996)  // Temporarily disables warning 4996.
8071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return getenv(name);
8081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#pragma warning(pop)           // Restores the warning state.
8091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else  // We are on Linux or Mac OS.
8101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  return getenv(name);
8111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
8121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
8131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef _WIN32_WCE
8151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Windows CE has no C library. The abort() function is used in
8161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// several places in Google Test. This implementation provides a reasonable
8171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// imitation of standard behaviour.
8181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniavoid abort();
8191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
8201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniainline void abort() { ::abort(); }
8211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // _WIN32_WCE
8221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// INTERNAL IMPLEMENTATION - DO NOT USE.
8241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
8251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
8261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// is not satisfied.
8271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//  Synopsys:
8281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    GTEST_CHECK_(boolean_condition);
8291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     or
8301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    GTEST_CHECK_(boolean_condition) << "Additional message";
8311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
8321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    This checks the condition and if the condition is not satisfied
8331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    it prints message about the condition violation, including the
8341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    condition itself, plus additional message streamed into it, if any,
8351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    and then it aborts the program. It aborts the program irrespective of
8361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//    whether it is built in the debug mode or not.
8371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass GTestCheckProvider {
8381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public:
8391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTestCheckProvider(const char* condition, const char* file, int line) {
8401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    FormatFileLocation(file, line);
8411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ::std::cerr << " ERROR: Condition " << condition << " failed. ";
8421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
8431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ~GTestCheckProvider() {
8441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ::std::cerr << ::std::endl;
8451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    abort();
8461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
8471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  void FormatFileLocation(const char* file, int line) {
8481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    if (file == NULL)
8491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      file = "unknown file";
8501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    if (line < 0) {
8511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ::std::cerr << file << ":";
8521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    } else {
8531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if _MSC_VER
8541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ::std::cerr << file << "(" << line << "):";
8551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#else
8561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ::std::cerr << file << ":" << line << ":";
8571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif
8581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    }
8591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  }
8601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ::std::ostream& GetStream() { return ::std::cerr; }
8611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
8621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_CHECK_(condition) \
8631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    if (condition) \
8651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ; \
8661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    else \
8671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania      ::testing::internal::GTestCheckProvider(\
8681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          #condition, __FILE__, __LINE__).GetStream()
8691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macro for referencing flags.
8711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_FLAG(name) FLAGS_gtest_##name
8721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros for declaring flags.
8741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DECLARE_bool_(name) extern bool GTEST_FLAG(name)
8751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DECLARE_int32_(name) \
8761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    extern ::testing::internal::Int32 GTEST_FLAG(name)
8771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DECLARE_string_(name) \
8781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    extern ::testing::internal::String GTEST_FLAG(name)
8791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Macros for defining flags.
8811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEFINE_bool_(name, default_val, doc) \
8821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    bool GTEST_FLAG(name) = (default_val)
8831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEFINE_int32_(name, default_val, doc) \
8841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
8851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_DEFINE_string_(name, default_val, doc) \
8861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ::testing::internal::String GTEST_FLAG(name) = (default_val)
8871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
8891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// to *value and returns true; otherwise leaves *value unchanged and returns
8901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// false.
8911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// TODO(chandlerc): Find a better way to refactor flag and environment parsing
8921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
8931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// function.
8941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniabool ParseInt32(const Message& src_text, const char* str, Int32* value);
8951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Parses a bool/Int32/string from the environment variable
8971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// corresponding to the given Google Test flag.
8981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniabool BoolFromGTestEnv(const char* flag, bool default_val);
8991be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaInt32 Int32FromGTestEnv(const char* flag, Int32 default_val);
9001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaconst char* StringFromGTestEnv(const char* flag, const char* default_val);
9011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}  // namespace internal
9031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}  // namespace testing
9041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
906