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