gtest-port.h revision d0332953cda33fb4f8e24ebff9c49159b69c43d6
1// Copyright 2005, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10//     * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14//     * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29//
30// Authors: wan@google.com (Zhanyong Wan)
31//
32// Low-level types and utilities for porting Google Test to various
33// platforms.  They are subject to change without notice.  DO NOT USE
34// THEM IN USER CODE.
35
36#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
37#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
38
39// The user can define the following macros in the build script to
40// control Google Test's behavior.  If the user doesn't define a macro
41// in this list, Google Test will define it.
42//
43//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
44//                              is/isn't available.
45//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
46//                              is/isn't available (some systems define
47//                              ::string, which is different to std::string).
48//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
49//                              is/isn't available (some systems define
50//                              ::wstring, which is different to std::wstring).
51//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
52//                              is/isn't available.
53//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
54//                              enabled.
55//   GTEST_HAS_STD_STRING     - Define it to 1/0 to indicate that
56//                              std::string does/doesn't work (Google Test can
57//                              be used where std::string is unavailable).
58//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
59//                              std::wstring does/doesn't work (Google Test can
60//                              be used where std::wstring is unavailable).
61//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
62//                              is/isn't available.
63//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
64//                              compiler supports Microsoft's "Structured
65//                              Exception Handling".
66//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
67//                              Test's own tr1 tuple implementation should be
68//                              used.  Unused when the user sets
69//                              GTEST_HAS_TR1_TUPLE to 0.
70
71// This header defines the following utilities:
72//
73// Macros indicating the current platform (defined to 1 if compiled on
74// the given platform; otherwise undefined):
75//   GTEST_OS_CYGWIN   - Cygwin
76//   GTEST_OS_LINUX    - Linux
77//   GTEST_OS_MAC      - Mac OS X
78//   GTEST_OS_SOLARIS  - Sun Solaris
79//   GTEST_OS_SYMBIAN  - Symbian
80//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
81//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
82//     GTEST_OS_WINDOWS_MINGW    - MinGW
83//     GTEST_OS_WINODWS_MOBILE   - Windows Mobile
84//   GTEST_OS_ZOS      - z/OS
85//
86// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
87// most stable support.  Since core members of the Google Test project
88// don't have access to other platforms, support for them may be less
89// stable.  If you notice any problems on your platform, please notify
90// googletestframework@googlegroups.com (patches for fixing them are
91// even more welcome!).
92//
93// Note that it is possible that none of the GTEST_OS_* macros are defined.
94//
95// Macros indicating available Google Test features (defined to 1 if
96// the corresponding feature is supported; otherwise undefined):
97//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
98//                            tests)
99//   GTEST_HAS_DEATH_TEST   - death tests
100//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
101//   GTEST_HAS_TYPED_TEST   - typed tests
102//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
103//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used.
104//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
105//                            the above two are mutually exclusive.
106//
107// Macros for basic C++ coding:
108//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
109//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
110//                              variable don't have to be used.
111//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
112//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
113//
114// Synchronization:
115//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
116//                  - synchronization primitives.
117//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
118//                         synchronization primitives have real implementations
119//                         and Google Test is thread-safe; or 0 otherwise.
120//
121// Template meta programming:
122//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
123//
124// Smart pointers:
125//   scoped_ptr     - as in TR2.
126//
127// Regular expressions:
128//   RE             - a simple regular expression class using the POSIX
129//                    Extended Regular Expression syntax.  Not available on
130//                    Windows.
131//
132// Logging:
133//   GTEST_LOG_()   - logs messages at the specified severity level.
134//   LogToStderr()  - directs all log messages to stderr.
135//   FlushInfoLog() - flushes informational log messages.
136//
137// Stderr capturing:
138//   CaptureStderr()     - starts capturing stderr.
139//   GetCapturedStderr() - stops capturing stderr and returns the captured
140//                         string.
141//
142// Integer types:
143//   TypeWithSize   - maps an integer to a int type.
144//   Int32, UInt32, Int64, UInt64, TimeInMillis
145//                  - integers of known sizes.
146//   BiggestInt     - the biggest signed integer type.
147//
148// Command-line utilities:
149//   GTEST_FLAG()       - references a flag.
150//   GTEST_DECLARE_*()  - declares a flag.
151//   GTEST_DEFINE_*()   - defines a flag.
152//   GetArgvs()         - returns the command line as a vector of strings.
153//
154// Environment variable utilities:
155//   GetEnv()             - gets the value of an environment variable.
156//   BoolFromGTestEnv()   - parses a bool environment variable.
157//   Int32FromGTestEnv()  - parses an Int32 environment variable.
158//   StringFromGTestEnv() - parses a string environment variable.
159
160#include <stddef.h>  // For ptrdiff_t
161#include <stdlib.h>
162#include <stdio.h>
163#include <string.h>
164#ifndef _WIN32_WCE
165#include <sys/stat.h>
166#endif  // !_WIN32_WCE
167
168#include <iostream>  // NOLINT
169
170#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
171#define GTEST_FLAG_PREFIX_ "gtest_"
172#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
173#define GTEST_NAME_ "Google Test"
174#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
175
176// Determines the version of gcc that is used to compile this.
177#ifdef __GNUC__
178// 40302 means version 4.3.2.
179#define GTEST_GCC_VER_ \
180    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
181#endif  // __GNUC__
182
183// Determines the platform on which Google Test is compiled.
184#ifdef __CYGWIN__
185#define GTEST_OS_CYGWIN 1
186#elif defined __SYMBIAN32__
187#define GTEST_OS_SYMBIAN 1
188#elif defined _WIN32
189#define GTEST_OS_WINDOWS 1
190#ifdef _WIN32_WCE
191#define GTEST_OS_WINDOWS_MOBILE 1
192#elif defined(__MINGW__) || defined(__MINGW32__)
193#define GTEST_OS_WINDOWS_MINGW 1
194#else
195#define GTEST_OS_WINDOWS_DESKTOP 1
196#endif  // _WIN32_WCE
197#elif defined __APPLE__
198#define GTEST_OS_MAC 1
199#elif defined __linux__
200#define GTEST_OS_LINUX 1
201#elif defined __MVS__
202#define GTEST_OS_ZOS 1
203#elif defined(__sun) && defined(__SVR4)
204#define GTEST_OS_SOLARIS 1
205#endif  // __CYGWIN__
206
207#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_SYMBIAN || \
208    GTEST_OS_SOLARIS
209
210// On some platforms, <regex.h> needs someone to define size_t, and
211// won't compile otherwise.  We can #include it here as we already
212// included <stdlib.h>, which is guaranteed to define size_t through
213// <stddef.h>.
214#include <regex.h>  // NOLINT
215#include <strings.h>  // NOLINT
216#include <sys/types.h>  // NOLINT
217#include <unistd.h>  // NOLINT
218
219#define GTEST_USES_POSIX_RE 1
220
221#elif GTEST_OS_WINDOWS
222
223#if !GTEST_OS_WINDOWS_MOBILE
224#include <direct.h>  // NOLINT
225#include <io.h>  // NOLINT
226#endif
227
228// <regex.h> is not available on Windows.  Use our own simple regex
229// implementation instead.
230#define GTEST_USES_SIMPLE_RE 1
231
232#else
233
234// <regex.h> may not be available on this platform.  Use our own
235// simple regex implementation instead.
236#define GTEST_USES_SIMPLE_RE 1
237
238#endif  // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC ||
239        // GTEST_OS_SYMBIAN || GTEST_OS_SOLARIS
240
241// Defines GTEST_HAS_EXCEPTIONS to 1 if exceptions are enabled, or 0
242// otherwise.
243
244#if defined(_MSC_VER) || defined(__BORLANDC__)
245// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
246// macro to enable exceptions, so we'll do the same.
247// Assumes that exceptions are enabled by default.
248#ifndef _HAS_EXCEPTIONS
249#define _HAS_EXCEPTIONS 1
250#endif  // _HAS_EXCEPTIONS
251#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
252#else  // The compiler is not MSVC or C++Builder.
253// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.  For
254// other compilers, we assume exceptions are disabled to be
255// conservative.
256#if defined(__GNUC__) && __EXCEPTIONS
257#define GTEST_HAS_EXCEPTIONS 1
258#else
259#define GTEST_HAS_EXCEPTIONS 0
260#endif  // defined(__GNUC__) && __EXCEPTIONS
261#endif  // defined(_MSC_VER) || defined(__BORLANDC__)
262
263// Determines whether ::std::string and ::string are available.
264
265#ifndef GTEST_HAS_STD_STRING
266// The user didn't tell us whether ::std::string is available, so we
267// need to figure it out.  The only environment that we know
268// ::std::string is not available is MSVC 7.1 or lower with exceptions
269// disabled.
270#if defined(_MSC_VER) && (_MSC_VER < 1400) && !GTEST_HAS_EXCEPTIONS
271#define GTEST_HAS_STD_STRING 0
272#else
273#define GTEST_HAS_STD_STRING 1
274#endif
275#endif  // GTEST_HAS_STD_STRING
276
277#ifndef GTEST_HAS_GLOBAL_STRING
278// The user didn't tell us whether ::string is available, so we need
279// to figure it out.
280
281#define GTEST_HAS_GLOBAL_STRING 0
282
283#endif  // GTEST_HAS_GLOBAL_STRING
284
285#ifndef GTEST_HAS_STD_WSTRING
286// The user didn't tell us whether ::std::wstring is available, so we need
287// to figure it out.
288// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
289//   is available.
290
291#if GTEST_OS_CYGWIN || GTEST_OS_SOLARIS
292// Cygwin 1.5 and below doesn't support ::std::wstring.
293// Cygwin 1.7 might add wstring support; this should be updated when clear.
294// Solaris' libc++ doesn't support it either.
295#define GTEST_HAS_STD_WSTRING 0
296#else
297#define GTEST_HAS_STD_WSTRING GTEST_HAS_STD_STRING
298#endif  // GTEST_OS_CYGWIN || GTEST_OS_SOLARIS
299
300#endif  // GTEST_HAS_STD_WSTRING
301
302#ifndef GTEST_HAS_GLOBAL_WSTRING
303// The user didn't tell us whether ::wstring is available, so we need
304// to figure it out.
305#define GTEST_HAS_GLOBAL_WSTRING \
306    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
307#endif  // GTEST_HAS_GLOBAL_WSTRING
308
309#if GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING || \
310    GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
311#include <string>  // NOLINT
312#endif  // GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING ||
313        // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
314
315#if GTEST_HAS_STD_STRING
316#include <sstream>  // NOLINT
317#else
318#include <strstream>  // NOLINT
319#endif  // GTEST_HAS_STD_STRING
320
321// Determines whether RTTI is available.
322#ifndef GTEST_HAS_RTTI
323// The user didn't tell us whether RTTI is enabled, so we need to
324// figure it out.
325
326#ifdef _MSC_VER
327
328#ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
329#define GTEST_HAS_RTTI 1
330#else
331#define GTEST_HAS_RTTI 0
332#endif  // _CPPRTTI
333
334#elif defined(__GNUC__)
335
336// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
337#if GTEST_GCC_VER_ >= 40302
338#ifdef __GXX_RTTI
339#define GTEST_HAS_RTTI 1
340#else
341#define GTEST_HAS_RTTI 0
342#endif  // __GXX_RTTI
343#else
344// For gcc versions smaller than 4.3.2, we assume RTTI is enabled.
345#define GTEST_HAS_RTTI 1
346#endif  // GTEST_GCC_VER >= 40302
347
348#else
349
350// Unknown compiler - assume RTTI is enabled.
351#define GTEST_HAS_RTTI 1
352
353#endif  // _MSC_VER
354
355#endif  // GTEST_HAS_RTTI
356
357// Determines whether <pthread.h> is available.
358#ifndef GTEST_HAS_PTHREAD
359// The user didn't tell us, so we need to figure it out.
360#define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC)
361#endif  // GTEST_HAS_PTHREAD
362
363// Determines whether Google Test can use tr1/tuple.  You can define
364// this macro to 0 to prevent Google Test from using tuple (any
365// feature depending on tuple with be disabled in this mode).
366#ifndef GTEST_HAS_TR1_TUPLE
367// The user didn't tell us not to do it, so we assume it's OK.
368#define GTEST_HAS_TR1_TUPLE 1
369#endif  // GTEST_HAS_TR1_TUPLE
370
371// Determines whether Google Test's own tr1 tuple implementation
372// should be used.
373#ifndef GTEST_USE_OWN_TR1_TUPLE
374// The user didn't tell us, so we need to figure it out.
375
376// We use our own tr1 tuple if we aren't sure the user has an
377// implementation of it already.  At this time, GCC 4.0.0+ is the only
378// mainstream compiler that comes with a TR1 tuple implementation.
379// MSVC 2008 (9.0) provides TR1 tuple in a 323 MB Feature Pack
380// download, which we cannot assume the user has.  MSVC 2010 isn't
381// released yet.
382#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
383#define GTEST_USE_OWN_TR1_TUPLE 0
384#else
385#define GTEST_USE_OWN_TR1_TUPLE 1
386#endif  // defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
387
388#endif  // GTEST_USE_OWN_TR1_TUPLE
389
390// To avoid conditional compilation everywhere, we make it
391// gtest-port.h's responsibility to #include the header implementing
392// tr1/tuple.
393#if GTEST_HAS_TR1_TUPLE
394
395#if GTEST_USE_OWN_TR1_TUPLE
396#include <gtest/internal/gtest-tuple.h>
397#elif GTEST_OS_SYMBIAN
398
399// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
400// use STLport's tuple implementation, which unfortunately doesn't
401// work as the copy of STLport distributed with Symbian is incomplete.
402// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
403// use its own tuple implementation.
404#ifdef BOOST_HAS_TR1_TUPLE
405#undef BOOST_HAS_TR1_TUPLE
406#endif  // BOOST_HAS_TR1_TUPLE
407
408// This prevents <boost/tr1/detail/config.hpp>, which defines
409// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
410#define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
411#include <tuple>
412
413#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
414// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
415// not conform to the TR1 spec, which requires the header to be <tuple>.
416
417#if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
418// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
419// which is #included by <tr1/tuple>, to not compile when RTTI is
420// disabled.  _TR1_FUNCTIONAL is the header guard for
421// <tr1/functional>.  Hence the following #define is a hack to prevent
422// <tr1/functional> from being included.
423#define _TR1_FUNCTIONAL 1
424#include <tr1/tuple>
425#undef _TR1_FUNCTIONAL  // Allows the user to #include
426                        // <tr1/functional> if he chooses to.
427#else
428#include <tr1/tuple>
429#endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
430
431#else
432// If the compiler is not GCC 4.0+, we assume the user is using a
433// spec-conforming TR1 implementation.
434#include <tuple>
435#endif  // GTEST_USE_OWN_TR1_TUPLE
436
437#endif  // GTEST_HAS_TR1_TUPLE
438
439// Determines whether clone(2) is supported.
440// Usually it will only be available on Linux, excluding
441// Linux on the Itanium architecture.
442// Also see http://linux.die.net/man/2/clone.
443#ifndef GTEST_HAS_CLONE
444// The user didn't tell us, so we need to figure it out.
445
446#if GTEST_OS_LINUX && !defined(__ia64__)
447#define GTEST_HAS_CLONE 1
448#else
449#define GTEST_HAS_CLONE 0
450#endif  // GTEST_OS_LINUX && !defined(__ia64__)
451
452#endif  // GTEST_HAS_CLONE
453
454// Determines whether to support death tests.
455// Google Test does not support death tests for VC 7.1 and earlier for
456// these reasons:
457//   1. std::vector does not build in VC 7.1 when exceptions are disabled.
458//   2. std::string does not build in VC 7.1 when exceptions are disabled
459//      (this is covered by GTEST_HAS_STD_STRING guard).
460//   3. abort() in a VC 7.1 application compiled as GUI in debug config
461//      pops up a dialog window that cannot be suppressed programmatically.
462#if GTEST_HAS_STD_STRING && \
463    (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || \
464     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || GTEST_OS_WINDOWS_MINGW)
465#define GTEST_HAS_DEATH_TEST 1
466#include <vector>  // NOLINT
467#endif
468
469// Determines whether to support value-parameterized tests.
470
471#if defined(__GNUC__) || (_MSC_VER >= 1400)
472// TODO(vladl@google.com): get the implementation rid of vector and list
473// to compile on MSVC 7.1.
474#define GTEST_HAS_PARAM_TEST 1
475#endif  // defined(__GNUC__) || (_MSC_VER >= 1400)
476
477// Determines whether to support type-driven tests.
478
479// Typed tests need <typeinfo> and variadic macros, which gcc and VC
480// 8.0+ support.
481#if defined(__GNUC__) || (_MSC_VER >= 1400)
482#define GTEST_HAS_TYPED_TEST 1
483#define GTEST_HAS_TYPED_TEST_P 1
484#endif  // defined(__GNUC__) || (_MSC_VER >= 1400)
485
486// Determines whether to support Combine(). This only makes sense when
487// value-parameterized tests are enabled.
488#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE
489#define GTEST_HAS_COMBINE 1
490#endif  // GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE
491
492// Determines whether the system compiler uses UTF-16 for encoding wide strings.
493#define GTEST_WIDE_STRING_USES_UTF16_ \
494    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN)
495
496// Defines some utility macros.
497
498// The GNU compiler emits a warning if nested "if" statements are followed by
499// an "else" statement and braces are not used to explicitly disambiguate the
500// "else" binding.  This leads to problems with code like:
501//
502//   if (gate)
503//     ASSERT_*(condition) << "Some message";
504//
505// The "switch (0) case 0:" idiom is used to suppress this.
506#ifdef __INTEL_COMPILER
507#define GTEST_AMBIGUOUS_ELSE_BLOCKER_
508#else
509#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0:  // NOLINT
510#endif
511
512// Use this annotation at the end of a struct/class definition to
513// prevent the compiler from optimizing away instances that are never
514// used.  This is useful when all interesting logic happens inside the
515// c'tor and / or d'tor.  Example:
516//
517//   struct Foo {
518//     Foo() { ... }
519//   } GTEST_ATTRIBUTE_UNUSED_;
520//
521// Also use it after a variable or parameter declaration to tell the
522// compiler the variable/parameter does not have to be used.
523#if defined(__GNUC__) && !defined(COMPILER_ICC)
524#define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
525#else
526#define GTEST_ATTRIBUTE_UNUSED_
527#endif
528
529// A macro to disallow the evil copy constructor and operator= functions
530// This should be used in the private: declarations for a class.
531#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
532  type(const type &);\
533  void operator=(const type &)
534
535// Tell the compiler to warn about unused return values for functions declared
536// with this macro.  The macro should be used on function declarations
537// following the argument list:
538//
539//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
540#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
541#define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
542#else
543#define GTEST_MUST_USE_RESULT_
544#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
545
546// Determine whether the compiler supports Microsoft's Structured Exception
547// Handling.  This is supported by several Windows compilers but generally
548// does not exist on any other system.
549#ifndef GTEST_HAS_SEH
550// The user didn't tell us, so we need to figure it out.
551
552#if defined(_MSC_VER) || defined(__BORLANDC__)
553// These two compilers are known to support SEH.
554#define GTEST_HAS_SEH 1
555#else
556// Assume no SEH.
557#define GTEST_HAS_SEH 0
558#endif
559
560#endif  // GTEST_HAS_SEH
561
562namespace testing {
563
564class Message;
565
566namespace internal {
567
568class String;
569
570// std::strstream is deprecated.  However, we have to use it on
571// Windows as std::stringstream won't compile on Windows when
572// exceptions are disabled.  We use std::stringstream on other
573// platforms to avoid compiler warnings there.
574#if GTEST_HAS_STD_STRING
575typedef ::std::stringstream StrStream;
576#else
577typedef ::std::strstream StrStream;
578#endif  // GTEST_HAS_STD_STRING
579
580// A helper for suppressing warnings on constant condition.  It just
581// returns 'condition'.
582bool IsTrue(bool condition);
583
584// Defines scoped_ptr.
585
586// This implementation of scoped_ptr is PARTIAL - it only contains
587// enough stuff to satisfy Google Test's need.
588template <typename T>
589class scoped_ptr {
590 public:
591  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
592  ~scoped_ptr() { reset(); }
593
594  T& operator*() const { return *ptr_; }
595  T* operator->() const { return ptr_; }
596  T* get() const { return ptr_; }
597
598  T* release() {
599    T* const ptr = ptr_;
600    ptr_ = NULL;
601    return ptr;
602  }
603
604  void reset(T* p = NULL) {
605    if (p != ptr_) {
606      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
607        delete ptr_;
608      }
609      ptr_ = p;
610    }
611  }
612 private:
613  T* ptr_;
614
615  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
616};
617
618// Defines RE.
619
620// A simple C++ wrapper for <regex.h>.  It uses the POSIX Enxtended
621// Regular Expression syntax.
622class RE {
623 public:
624  // Constructs an RE from a string.
625#if GTEST_HAS_STD_STRING
626  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
627#endif  // GTEST_HAS_STD_STRING
628
629#if GTEST_HAS_GLOBAL_STRING
630  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
631#endif  // GTEST_HAS_GLOBAL_STRING
632
633  RE(const char* regex) { Init(regex); }  // NOLINT
634  ~RE();
635
636  // Returns the string representation of the regex.
637  const char* pattern() const { return pattern_; }
638
639  // FullMatch(str, re) returns true iff regular expression re matches
640  // the entire str.
641  // PartialMatch(str, re) returns true iff regular expression re
642  // matches a substring of str (including str itself).
643  //
644  // TODO(wan@google.com): make FullMatch() and PartialMatch() work
645  // when str contains NUL characters.
646#if GTEST_HAS_STD_STRING
647  static bool FullMatch(const ::std::string& str, const RE& re) {
648    return FullMatch(str.c_str(), re);
649  }
650  static bool PartialMatch(const ::std::string& str, const RE& re) {
651    return PartialMatch(str.c_str(), re);
652  }
653#endif  // GTEST_HAS_STD_STRING
654
655#if GTEST_HAS_GLOBAL_STRING
656  static bool FullMatch(const ::string& str, const RE& re) {
657    return FullMatch(str.c_str(), re);
658  }
659  static bool PartialMatch(const ::string& str, const RE& re) {
660    return PartialMatch(str.c_str(), re);
661  }
662#endif  // GTEST_HAS_GLOBAL_STRING
663
664  static bool FullMatch(const char* str, const RE& re);
665  static bool PartialMatch(const char* str, const RE& re);
666
667 private:
668  void Init(const char* regex);
669
670  // We use a const char* instead of a string, as Google Test may be used
671  // where string is not available.  We also do not use Google Test's own
672  // String type here, in order to simplify dependencies between the
673  // files.
674  const char* pattern_;
675  bool is_valid_;
676#if GTEST_USES_POSIX_RE
677  regex_t full_regex_;     // For FullMatch().
678  regex_t partial_regex_;  // For PartialMatch().
679#else  // GTEST_USES_SIMPLE_RE
680  const char* full_pattern_;  // For FullMatch();
681#endif
682
683  GTEST_DISALLOW_COPY_AND_ASSIGN_(RE);
684};
685
686// Defines logging utilities:
687//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
688//                          message itself is streamed into the macro.
689//   LogToStderr()  - directs all log messages to stderr.
690//   FlushInfoLog() - flushes informational log messages.
691
692enum GTestLogSeverity {
693  GTEST_INFO,
694  GTEST_WARNING,
695  GTEST_ERROR,
696  GTEST_FATAL
697};
698
699// Formats log entry severity, provides a stream object for streaming the
700// log message, and terminates the message with a newline when going out of
701// scope.
702class GTestLog {
703 public:
704  GTestLog(GTestLogSeverity severity, const char* file, int line);
705
706  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
707  ~GTestLog();
708
709  ::std::ostream& GetStream() { return ::std::cerr; }
710
711 private:
712  const GTestLogSeverity severity_;
713
714  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
715};
716
717#define GTEST_LOG_(severity) \
718    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
719                                  __FILE__, __LINE__).GetStream()
720
721inline void LogToStderr() {}
722inline void FlushInfoLog() { fflush(NULL); }
723
724// Defines the stderr capturer:
725//   CaptureStderr     - starts capturing stderr.
726//   GetCapturedStderr - stops capturing stderr and returns the captured string.
727
728void CaptureStderr();
729String GetCapturedStderr();
730
731#if GTEST_HAS_DEATH_TEST
732
733// A copy of all command line arguments.  Set by InitGoogleTest().
734extern ::std::vector<String> g_argvs;
735
736// GTEST_HAS_DEATH_TEST implies we have ::std::string.
737const ::std::vector<String>& GetArgvs();
738
739#endif  // GTEST_HAS_DEATH_TEST
740
741// Defines synchronization primitives.
742
743// A dummy implementation of synchronization primitives (mutex, lock,
744// and thread-local variable).  Necessary for compiling Google Test where
745// mutex is not supported - using Google Test in multiple threads is not
746// supported on such platforms.
747
748class Mutex {
749 public:
750  Mutex() {}
751  explicit Mutex(int /*unused*/) {}
752  void AssertHeld() const {}
753  enum { NO_CONSTRUCTOR_NEEDED_FOR_STATIC_MUTEX = 0 };
754};
755
756// We cannot call it MutexLock directly as the ctor declaration would
757// conflict with a macro named MutexLock, which is defined on some
758// platforms.  Hence the typedef trick below.
759class GTestMutexLock {
760 public:
761  explicit GTestMutexLock(Mutex*) {}  // NOLINT
762};
763
764typedef GTestMutexLock MutexLock;
765
766template <typename T>
767class ThreadLocal {
768 public:
769  ThreadLocal() : value_() {}
770  explicit ThreadLocal(const T& value) : value_(value) {}
771  T* pointer() { return &value_; }
772  const T* pointer() const { return &value_; }
773  const T& get() const { return value_; }
774  void set(const T& value) { value_ = value; }
775 private:
776  T value_;
777};
778
779// Returns the number of threads running in the process, or 0 to indicate that
780// we cannot detect it.
781size_t GetThreadCount();
782
783// The above synchronization primitives have dummy implementations.
784// Therefore Google Test is not thread-safe.
785#define GTEST_IS_THREADSAFE 0
786
787#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
788
789// Passing non-POD classes through ellipsis (...) crashes the ARM
790// compiler.  The Nokia Symbian and the IBM XL C/C++ compiler try to
791// instantiate a copy constructor for objects passed through ellipsis
792// (...), failing for uncopyable objects.  We define this to indicate
793// the fact.
794#define GTEST_ELLIPSIS_NEEDS_COPY_ 1
795
796// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
797// const T& and const T* in a function template.  These compilers
798// _can_ decide between class template specializations for T and T*,
799// so a tr1::type_traits-like is_pointer works.
800#define GTEST_NEEDS_IS_POINTER_ 1
801
802#endif  // defined(__SYMBIAN32__) || defined(__IBMCPP__)
803
804template <bool bool_value>
805struct bool_constant {
806  typedef bool_constant<bool_value> type;
807  static const bool value = bool_value;
808};
809template <bool bool_value> const bool bool_constant<bool_value>::value;
810
811typedef bool_constant<false> false_type;
812typedef bool_constant<true> true_type;
813
814template <typename T>
815struct is_pointer : public false_type {};
816
817template <typename T>
818struct is_pointer<T*> : public true_type {};
819
820#if GTEST_OS_WINDOWS
821#define GTEST_PATH_SEP_ "\\"
822// The biggest signed integer type the compiler supports.
823typedef __int64 BiggestInt;
824#else
825#define GTEST_PATH_SEP_ "/"
826typedef long long BiggestInt;  // NOLINT
827#endif  // GTEST_OS_WINDOWS
828
829// The testing::internal::posix namespace holds wrappers for common
830// POSIX functions.  These wrappers hide the differences between
831// Windows/MSVC and POSIX systems.  Since some compilers define these
832// standard functions as macros, the wrapper cannot have the same name
833// as the wrapped function.
834
835namespace posix {
836
837// Functions with a different name on Windows.
838
839#if GTEST_OS_WINDOWS
840
841typedef struct _stat StatStruct;
842
843#ifdef __BORLANDC__
844inline int IsATTY(int fd) { return isatty(fd); }
845inline int StrCaseCmp(const char* s1, const char* s2) {
846  return stricmp(s1, s2);
847}
848inline char* StrDup(const char* src) { return strdup(src); }
849#else  // !__BORLANDC__
850#if GTEST_OS_WINDOWS_MOBILE
851inline int IsATTY(int /* fd */) { return 0; }
852#else
853inline int IsATTY(int fd) { return _isatty(fd); }
854#endif  // GTEST_OS_WINDOWS_MOBILE
855inline int StrCaseCmp(const char* s1, const char* s2) {
856  return _stricmp(s1, s2);
857}
858inline char* StrDup(const char* src) { return _strdup(src); }
859#endif  // __BORLANDC__
860
861#if GTEST_OS_WINDOWS_MOBILE
862inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
863// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
864// time and thus not defined there.
865#else
866inline int FileNo(FILE* file) { return _fileno(file); }
867inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
868inline int RmDir(const char* dir) { return _rmdir(dir); }
869inline bool IsDir(const StatStruct& st) {
870  return (_S_IFDIR & st.st_mode) != 0;
871}
872#endif  // GTEST_OS_WINDOWS_MOBILE
873
874#else
875
876typedef struct stat StatStruct;
877
878inline int FileNo(FILE* file) { return fileno(file); }
879inline int IsATTY(int fd) { return isatty(fd); }
880inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
881inline int StrCaseCmp(const char* s1, const char* s2) {
882  return strcasecmp(s1, s2);
883}
884inline char* StrDup(const char* src) { return strdup(src); }
885inline int RmDir(const char* dir) { return rmdir(dir); }
886inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
887
888#endif  // GTEST_OS_WINDOWS
889
890// Functions deprecated by MSVC 8.0.
891
892#ifdef _MSC_VER
893// Temporarily disable warning 4996 (deprecated function).
894#pragma warning(push)
895#pragma warning(disable:4996)
896#endif
897
898inline const char* StrNCpy(char* dest, const char* src, size_t n) {
899  return strncpy(dest, src, n);
900}
901
902// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
903// StrError() aren't needed on Windows CE at this time and thus not
904// defined there.
905
906#if !GTEST_OS_WINDOWS_MOBILE
907inline int ChDir(const char* dir) { return chdir(dir); }
908#endif
909inline FILE* FOpen(const char* path, const char* mode) {
910  return fopen(path, mode);
911}
912#if !GTEST_OS_WINDOWS_MOBILE
913inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
914  return freopen(path, mode, stream);
915}
916inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
917#endif
918inline int FClose(FILE* fp) { return fclose(fp); }
919#if !GTEST_OS_WINDOWS_MOBILE
920inline int Read(int fd, void* buf, unsigned int count) {
921  return static_cast<int>(read(fd, buf, count));
922}
923inline int Write(int fd, const void* buf, unsigned int count) {
924  return static_cast<int>(write(fd, buf, count));
925}
926inline int Close(int fd) { return close(fd); }
927inline const char* StrError(int errnum) { return strerror(errnum); }
928#endif
929inline const char* GetEnv(const char* name) {
930#if GTEST_OS_WINDOWS_MOBILE
931  // We are on Windows CE, which has no environment variables.
932  return NULL;
933#elif defined(__BORLANDC__)
934  // Environment variables which we programmatically clear will be set to the
935  // empty string rather than unset (NULL).  Handle that case.
936  const char* const env = getenv(name);
937  return (env != NULL && env[0] != '\0') ? env : NULL;
938#else
939  return getenv(name);
940#endif
941}
942
943#ifdef _MSC_VER
944#pragma warning(pop)  // Restores the warning state.
945#endif
946
947#if GTEST_OS_WINDOWS_MOBILE
948// Windows CE has no C library. The abort() function is used in
949// several places in Google Test. This implementation provides a reasonable
950// imitation of standard behaviour.
951void Abort();
952#else
953inline void Abort() { abort(); }
954#endif  // GTEST_OS_WINDOWS_MOBILE
955
956}  // namespace posix
957
958// The maximum number a BiggestInt can represent.  This definition
959// works no matter BiggestInt is represented in one's complement or
960// two's complement.
961//
962// We cannot rely on numeric_limits in STL, as __int64 and long long
963// are not part of standard C++ and numeric_limits doesn't need to be
964// defined for them.
965const BiggestInt kMaxBiggestInt =
966    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
967
968// This template class serves as a compile-time function from size to
969// type.  It maps a size in bytes to a primitive type with that
970// size. e.g.
971//
972//   TypeWithSize<4>::UInt
973//
974// is typedef-ed to be unsigned int (unsigned integer made up of 4
975// bytes).
976//
977// Such functionality should belong to STL, but I cannot find it
978// there.
979//
980// Google Test uses this class in the implementation of floating-point
981// comparison.
982//
983// For now it only handles UInt (unsigned int) as that's all Google Test
984// needs.  Other types can be easily added in the future if need
985// arises.
986template <size_t size>
987class TypeWithSize {
988 public:
989  // This prevents the user from using TypeWithSize<N> with incorrect
990  // values of N.
991  typedef void UInt;
992};
993
994// The specialization for size 4.
995template <>
996class TypeWithSize<4> {
997 public:
998  // unsigned int has size 4 in both gcc and MSVC.
999  //
1000  // As base/basictypes.h doesn't compile on Windows, we cannot use
1001  // uint32, uint64, and etc here.
1002  typedef int Int;
1003  typedef unsigned int UInt;
1004};
1005
1006// The specialization for size 8.
1007template <>
1008class TypeWithSize<8> {
1009 public:
1010#if GTEST_OS_WINDOWS
1011  typedef __int64 Int;
1012  typedef unsigned __int64 UInt;
1013#else
1014  typedef long long Int;  // NOLINT
1015  typedef unsigned long long UInt;  // NOLINT
1016#endif  // GTEST_OS_WINDOWS
1017};
1018
1019// Integer types of known sizes.
1020typedef TypeWithSize<4>::Int Int32;
1021typedef TypeWithSize<4>::UInt UInt32;
1022typedef TypeWithSize<8>::Int Int64;
1023typedef TypeWithSize<8>::UInt UInt64;
1024typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
1025
1026// Utilities for command line flags and environment variables.
1027
1028// INTERNAL IMPLEMENTATION - DO NOT USE.
1029//
1030// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
1031// is not satisfied.
1032//  Synopsys:
1033//    GTEST_CHECK_(boolean_condition);
1034//     or
1035//    GTEST_CHECK_(boolean_condition) << "Additional message";
1036//
1037//    This checks the condition and if the condition is not satisfied
1038//    it prints message about the condition violation, including the
1039//    condition itself, plus additional message streamed into it, if any,
1040//    and then it aborts the program. It aborts the program irrespective of
1041//    whether it is built in the debug mode or not.
1042#define GTEST_CHECK_(condition) \
1043    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
1044    if (::testing::internal::IsTrue(condition)) \
1045      ; \
1046    else \
1047      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
1048
1049// Macro for referencing flags.
1050#define GTEST_FLAG(name) FLAGS_gtest_##name
1051
1052// Macros for declaring flags.
1053#define GTEST_DECLARE_bool_(name) extern bool GTEST_FLAG(name)
1054#define GTEST_DECLARE_int32_(name) \
1055    extern ::testing::internal::Int32 GTEST_FLAG(name)
1056#define GTEST_DECLARE_string_(name) \
1057    extern ::testing::internal::String GTEST_FLAG(name)
1058
1059// Macros for defining flags.
1060#define GTEST_DEFINE_bool_(name, default_val, doc) \
1061    bool GTEST_FLAG(name) = (default_val)
1062#define GTEST_DEFINE_int32_(name, default_val, doc) \
1063    ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
1064#define GTEST_DEFINE_string_(name, default_val, doc) \
1065    ::testing::internal::String GTEST_FLAG(name) = (default_val)
1066
1067// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
1068// to *value and returns true; otherwise leaves *value unchanged and returns
1069// false.
1070// TODO(chandlerc): Find a better way to refactor flag and environment parsing
1071// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
1072// function.
1073bool ParseInt32(const Message& src_text, const char* str, Int32* value);
1074
1075// Parses a bool/Int32/string from the environment variable
1076// corresponding to the given Google Test flag.
1077bool BoolFromGTestEnv(const char* flag, bool default_val);
1078Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
1079const char* StringFromGTestEnv(const char* flag, const char* default_val);
1080
1081}  // namespace internal
1082}  // namespace testing
1083
1084#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
1085