Coverage Report

Created: 2020-06-26 05:44

/home/arjun/llvm-project/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h
Line
Count
Source (jump to first uncovered line)
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.  All macros ending with _ and symbols defined in an
34
// internal namespace are subject to change without notice.  Code
35
// outside Google Test MUST NOT USE THEM DIRECTLY.  Macros that don't
36
// end with _ are part of Google Test's public API and can be used by
37
// code outside Google Test.
38
//
39
// This file is fundamental to Google Test.  All other Google Test source
40
// files are expected to #include this.  Therefore, it cannot #include
41
// any other Google Test header.
42
43
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
44
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
45
46
// Environment-describing macros
47
// -----------------------------
48
//
49
// Google Test can be used in many different environments.  Macros in
50
// this section tell Google Test what kind of environment it is being
51
// used in, such that Google Test can provide environment-specific
52
// features and implementations.
53
//
54
// Google Test tries to automatically detect the properties of its
55
// environment, so users usually don't need to worry about these
56
// macros.  However, the automatic detection is not perfect.
57
// Sometimes it's necessary for a user to define some of the following
58
// macros in the build script to override Google Test's decisions.
59
//
60
// If the user doesn't define a macro in the list, Google Test will
61
// provide a default definition.  After this header is #included, all
62
// macros in this list will be defined to either 1 or 0.
63
//
64
// Notes to maintainers:
65
//   - Each macro here is a user-tweakable knob; do not grow the list
66
//     lightly.
67
//   - Use #if to key off these macros.  Don't use #ifdef or "#if
68
//     defined(...)", which will not work as these macros are ALWAYS
69
//     defined.
70
//
71
//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
72
//                              is/isn't available.
73
//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
74
//                              are enabled.
75
//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
76
//                              is/isn't available (some systems define
77
//                              ::string, which is different to std::string).
78
//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
79
//                              is/isn't available (some systems define
80
//                              ::wstring, which is different to std::wstring).
81
//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
82
//                              expressions are/aren't available.
83
//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
84
//                              is/isn't available.
85
//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
86
//                              enabled.
87
//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
88
//                              std::wstring does/doesn't work (Google Test can
89
//                              be used where std::wstring is unavailable).
90
//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
91
//                              is/isn't available.
92
//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
93
//                              compiler supports Microsoft's "Structured
94
//                              Exception Handling".
95
//   GTEST_HAS_STREAM_REDIRECTION
96
//                            - Define it to 1/0 to indicate whether the
97
//                              platform supports I/O stream redirection using
98
//                              dup() and dup2().
99
//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
100
//                              Test's own tr1 tuple implementation should be
101
//                              used.  Unused when the user sets
102
//                              GTEST_HAS_TR1_TUPLE to 0.
103
//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
104
//                              is building in C++11/C++98 mode.
105
//   GTEST_LINKED_AS_SHARED_LIBRARY
106
//                            - Define to 1 when compiling tests that use
107
//                              Google Test as a shared library (known as
108
//                              DLL on Windows).
109
//   GTEST_CREATE_SHARED_LIBRARY
110
//                            - Define to 1 when compiling Google Test itself
111
//                              as a shared library.
112
113
// Platform-indicating macros
114
// --------------------------
115
//
116
// Macros indicating the platform on which Google Test is being used
117
// (a macro is defined to 1 if compiled on the given platform;
118
// otherwise UNDEFINED -- it's never defined to 0.).  Google Test
119
// defines these macros automatically.  Code outside Google Test MUST
120
// NOT define them.
121
//
122
//   GTEST_OS_AIX      - IBM AIX
123
//   GTEST_OS_CYGWIN   - Cygwin
124
//   GTEST_OS_FREEBSD  - FreeBSD
125
//   GTEST_OS_HAIKU    - Haiku
126
//   GTEST_OS_HPUX     - HP-UX
127
//   GTEST_OS_LINUX    - Linux
128
//     GTEST_OS_LINUX_ANDROID - Google Android
129
//   GTEST_OS_MAC      - Mac OS X
130
//     GTEST_OS_IOS    - iOS
131
//   GTEST_OS_MINIX    - Minix
132
//   GTEST_OS_NACL     - Google Native Client (NaCl)
133
//   GTEST_OS_OPENBSD  - OpenBSD
134
//   GTEST_OS_QNX      - QNX
135
//   GTEST_OS_SOLARIS  - Sun Solaris
136
//   GTEST_OS_SYMBIAN  - Symbian
137
//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
138
//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
139
//     GTEST_OS_WINDOWS_MINGW    - MinGW
140
//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
141
//     GTEST_OS_WINDOWS_PHONE    - Windows Phone
142
//     GTEST_OS_WINDOWS_RT       - Windows Store App/WinRT
143
//   GTEST_OS_ZOS      - z/OS
144
//
145
// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
146
// most stable support.  Since core members of the Google Test project
147
// don't have access to other platforms, support for them may be less
148
// stable.  If you notice any problems on your platform, please notify
149
// googletestframework@googlegroups.com (patches for fixing them are
150
// even more welcome!).
151
//
152
// It is possible that none of the GTEST_OS_* macros are defined.
153
154
// Feature-indicating macros
155
// -------------------------
156
//
157
// Macros indicating which Google Test features are available (a macro
158
// is defined to 1 if the corresponding feature is supported;
159
// otherwise UNDEFINED -- it's never defined to 0.).  Google Test
160
// defines these macros automatically.  Code outside Google Test MUST
161
// NOT define them.
162
//
163
// These macros are public so that portable tests can be written.
164
// Such tests typically surround code using a feature with an #if
165
// which controls that code.  For example:
166
//
167
// #if GTEST_HAS_DEATH_TEST
168
//   EXPECT_DEATH(DoSomethingDeadly());
169
// #endif
170
//
171
//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
172
//                            tests)
173
//   GTEST_HAS_DEATH_TEST   - death tests
174
//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
175
//   GTEST_HAS_TYPED_TEST   - typed tests
176
//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
177
//   GTEST_IS_THREADSAFE    - Google Test is thread-safe.
178
//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
179
//                            GTEST_HAS_POSIX_RE (see above) which users can
180
//                            define themselves.
181
//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
182
//                            the above two are mutually exclusive.
183
//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
184
185
// Misc public macros
186
// ------------------
187
//
188
//   GTEST_FLAG(flag_name)  - references the variable corresponding to
189
//                            the given Google Test flag.
190
191
// Internal utilities
192
// ------------------
193
//
194
// The following macros and utilities are for Google Test's INTERNAL
195
// use only.  Code outside Google Test MUST NOT USE THEM DIRECTLY.
196
//
197
// Macros for basic C++ coding:
198
//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
199
//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
200
//                              variable don't have to be used.
201
//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
202
//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
203
//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
204
//   GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is
205
//                                        suppressed (constant conditional).
206
//   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127
207
//                                        is suppressed.
208
//
209
// C++11 feature wrappers:
210
//
211
//   testing::internal::move  - portability wrapper for std::move.
212
//
213
// Synchronization:
214
//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
215
//                            - synchronization primitives.
216
//
217
// Template meta programming:
218
//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
219
//   IteratorTraits - partial implementation of std::iterator_traits, which
220
//                    is not available in libCstd when compiled with Sun C++.
221
//
222
// Smart pointers:
223
//   scoped_ptr     - as in TR2.
224
//
225
// Regular expressions:
226
//   RE             - a simple regular expression class using the POSIX
227
//                    Extended Regular Expression syntax on UNIX-like
228
//                    platforms, or a reduced regular exception syntax on
229
//                    other platforms, including Windows.
230
//
231
// Logging:
232
//   GTEST_LOG_()   - logs messages at the specified severity level.
233
//   LogToStderr()  - directs all log messages to stderr.
234
//   FlushInfoLog() - flushes informational log messages.
235
//
236
// Stdout and stderr capturing:
237
//   CaptureStdout()     - starts capturing stdout.
238
//   GetCapturedStdout() - stops capturing stdout and returns the captured
239
//                         string.
240
//   CaptureStderr()     - starts capturing stderr.
241
//   GetCapturedStderr() - stops capturing stderr and returns the captured
242
//                         string.
243
//
244
// Integer types:
245
//   TypeWithSize   - maps an integer to a int type.
246
//   Int32, UInt32, Int64, UInt64, TimeInMillis
247
//                  - integers of known sizes.
248
//   BiggestInt     - the biggest signed integer type.
249
//
250
// Command-line utilities:
251
//   GTEST_DECLARE_*()  - declares a flag.
252
//   GTEST_DEFINE_*()   - defines a flag.
253
//   GetInjectableArgvs() - returns the command line as a vector of strings.
254
//
255
// Environment variable utilities:
256
//   GetEnv()             - gets the value of an environment variable.
257
//   BoolFromGTestEnv()   - parses a bool environment variable.
258
//   Int32FromGTestEnv()  - parses an Int32 environment variable.
259
//   StringFromGTestEnv() - parses a string environment variable.
260
261
#include <ctype.h>   // for isspace, etc
262
#include <stddef.h>  // for ptrdiff_t
263
#include <stdlib.h>
264
#include <stdio.h>
265
#include <string.h>
266
#ifndef _WIN32_WCE
267
# include <sys/types.h>
268
# include <sys/stat.h>
269
#endif  // !_WIN32_WCE
270
271
#if defined __APPLE__
272
# include <AvailabilityMacros.h>
273
# include <TargetConditionals.h>
274
#endif
275
276
#include <algorithm>  // NOLINT
277
#include <iostream>  // NOLINT
278
#include <sstream>  // NOLINT
279
#include <string>  // NOLINT
280
#include <utility>
281
#include <vector>  // NOLINT
282
283
#include "gtest/internal/gtest-port-arch.h"
284
#include "gtest/internal/custom/gtest-port.h"
285
286
#if !defined(GTEST_DEV_EMAIL_)
287
# define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
288
32
# define GTEST_FLAG_PREFIX_ "gtest_"
289
0
# define GTEST_FLAG_PREFIX_DASH_ "gtest-"
290
# define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
291
0
# define GTEST_NAME_ "Google Test"
292
# define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"
293
#endif  // !defined(GTEST_DEV_EMAIL_)
294
295
#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
296
# define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest"
297
#endif  // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
298
299
// Determines the version of gcc that is used to compile this.
300
#ifdef __GNUC__
301
// 40302 means version 4.3.2.
302
# define GTEST_GCC_VER_ \
303
    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
304
#endif  // __GNUC__
305
306
// Macros for disabling Microsoft Visual C++ warnings.
307
//
308
//   GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)
309
//   /* code that triggers warnings C4800 and C4385 */
310
//   GTEST_DISABLE_MSC_WARNINGS_POP_()
311
#if _MSC_VER >= 1500
312
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
313
    __pragma(warning(push))                        \
314
    __pragma(warning(disable: warnings))
315
# define GTEST_DISABLE_MSC_WARNINGS_POP_()          \
316
    __pragma(warning(pop))
317
#else
318
// Older versions of MSVC don't have __pragma.
319
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
320
# define GTEST_DISABLE_MSC_WARNINGS_POP_()
321
#endif
322
323
#ifndef GTEST_LANG_CXX11
324
// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
325
// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
326
// value for __cplusplus, and recent versions of clang, gcc, and
327
// probably other compilers set that too in C++11 mode.
328
# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
329
// Compiling in at least C++11 mode.
330
#  define GTEST_LANG_CXX11 1
331
# else
332
#  define GTEST_LANG_CXX11 0
333
# endif
334
#endif
335
336
// Distinct from C++11 language support, some environments don't provide
337
// proper C++11 library support. Notably, it's possible to build in
338
// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++
339
// with no C++11 support.
340
//
341
// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__
342
// 20110325, but maintenance releases in the 4.4 and 4.5 series followed
343
// this date, so check for those versions by their date stamps.
344
// https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning
345
#if GTEST_LANG_CXX11 && \
346
    (!defined(__GLIBCXX__) || ( \
347
        __GLIBCXX__ >= 20110325ul &&  /* GCC >= 4.6.0 */ \
348
        /* Blacklist of patch releases of older branches: */ \
349
        __GLIBCXX__ != 20110416ul &&  /* GCC 4.4.6 */ \
350
        __GLIBCXX__ != 20120313ul &&  /* GCC 4.4.7 */ \
351
        __GLIBCXX__ != 20110428ul &&  /* GCC 4.5.3 */ \
352
        __GLIBCXX__ != 20120702ul))   /* GCC 4.5.4 */
353
# define GTEST_STDLIB_CXX11 1
354
#endif
355
356
// Only use C++11 library features if the library provides them.
357
#if GTEST_STDLIB_CXX11
358
# define GTEST_HAS_STD_BEGIN_AND_END_ 1
359
# define GTEST_HAS_STD_FORWARD_LIST_ 1
360
# define GTEST_HAS_STD_FUNCTION_ 1
361
# define GTEST_HAS_STD_INITIALIZER_LIST_ 1
362
# define GTEST_HAS_STD_MOVE_ 1
363
# define GTEST_HAS_STD_SHARED_PTR_ 1
364
# define GTEST_HAS_STD_TYPE_TRAITS_ 1
365
# define GTEST_HAS_STD_UNIQUE_PTR_ 1
366
#endif
367
368
// C++11 specifies that <tuple> provides std::tuple.
369
// Some platforms still might not have it, however.
370
#if GTEST_LANG_CXX11
371
# define GTEST_HAS_STD_TUPLE_ 1
372
# if defined(__clang__)
373
// Inspired by http://clang.llvm.org/docs/LanguageExtensions.html#__has_include
374
#  if defined(__has_include) && !__has_include(<tuple>)
375
#   undef GTEST_HAS_STD_TUPLE_
376
#  endif
377
# elif defined(_MSC_VER)
378
// Inspired by boost/config/stdlib/dinkumware.hpp
379
#  if defined(_CPPLIB_VER) && _CPPLIB_VER < 520
380
#   undef GTEST_HAS_STD_TUPLE_
381
#  endif
382
# elif defined(__GLIBCXX__)
383
// Inspired by boost/config/stdlib/libstdcpp3.hpp,
384
// http://gcc.gnu.org/gcc-4.2/changes.html and
385
// http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x
386
#  if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
387
#   undef GTEST_HAS_STD_TUPLE_
388
#  endif
389
# endif
390
#endif
391
392
// Brings in definitions for functions used in the testing::internal::posix
393
// namespace (read, write, close, chdir, isatty, stat). We do not currently
394
// use them on Windows Mobile.
395
#if GTEST_OS_WINDOWS
396
# if !GTEST_OS_WINDOWS_MOBILE
397
#  include <direct.h>
398
#  include <io.h>
399
# endif
400
// In order to avoid having to include <windows.h>, use forward declaration
401
// assuming CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
402
// This assumption is verified by
403
// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
404
struct _RTL_CRITICAL_SECTION;
405
#else
406
// This assumes that non-Windows OSes provide unistd.h. For OSes where this
407
// is not the case, we need to include headers that provide the functions
408
// mentioned above.
409
# include <unistd.h>
410
# include <strings.h>
411
#endif  // GTEST_OS_WINDOWS
412
413
#if GTEST_OS_LINUX_ANDROID
414
// Used to define __ANDROID_API__ matching the target NDK API level.
415
#  include <android/api-level.h>  // NOLINT
416
#endif
417
418
// Defines this to true iff Google Test can use POSIX regular expressions.
419
#ifndef GTEST_HAS_POSIX_RE
420
# if GTEST_OS_LINUX_ANDROID
421
// On Android, <regex.h> is only available starting with Gingerbread.
422
#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
423
# else
424
#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
425
# endif
426
#endif
427
428
#if GTEST_USES_PCRE
429
// The appropriate headers have already been included.
430
431
#elif GTEST_HAS_POSIX_RE
432
433
// On some platforms, <regex.h> needs someone to define size_t, and
434
// won't compile otherwise.  We can #include it here as we already
435
// included <stdlib.h>, which is guaranteed to define size_t through
436
// <stddef.h>.
437
# include <regex.h>  // NOLINT
438
439
# define GTEST_USES_POSIX_RE 1
440
441
#elif GTEST_OS_WINDOWS
442
443
// <regex.h> is not available on Windows.  Use our own simple regex
444
// implementation instead.
445
# define GTEST_USES_SIMPLE_RE 1
446
447
#else
448
449
// <regex.h> may not be available on this platform.  Use our own
450
// simple regex implementation instead.
451
# define GTEST_USES_SIMPLE_RE 1
452
453
#endif  // GTEST_USES_PCRE
454
455
#ifndef GTEST_HAS_EXCEPTIONS
456
// The user didn't tell us whether exceptions are enabled, so we need
457
// to figure it out.
458
# if defined(_MSC_VER) || defined(__BORLANDC__)
459
// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
460
// macro to enable exceptions, so we'll do the same.
461
// Assumes that exceptions are enabled by default.
462
#  ifndef _HAS_EXCEPTIONS
463
#   define _HAS_EXCEPTIONS 1
464
#  endif  // _HAS_EXCEPTIONS
465
#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
466
# elif defined(__clang__)
467
// clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,
468
// but iff cleanups are enabled after that. In Obj-C++ files, there can be
469
// cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions
470
// are disabled. clang has __has_feature(cxx_exceptions) which checks for C++
471
// exceptions starting at clang r206352, but which checked for cleanups prior to
472
// that. To reliably check for C++ exception availability with clang, check for
473
// __EXCEPTIONS && __has_feature(cxx_exceptions).
474
#  define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
475
# elif defined(__GNUC__) && __EXCEPTIONS
476
// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
477
#  define GTEST_HAS_EXCEPTIONS 1
478
# elif defined(__SUNPRO_CC)
479
// Sun Pro CC supports exceptions.  However, there is no compile-time way of
480
// detecting whether they are enabled or not.  Therefore, we assume that
481
// they are enabled unless the user tells us otherwise.
482
#  define GTEST_HAS_EXCEPTIONS 1
483
# elif defined(__IBMCPP__) && __EXCEPTIONS
484
// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
485
#  define GTEST_HAS_EXCEPTIONS 1
486
# elif defined(__HP_aCC)
487
// Exception handling is in effect by default in HP aCC compiler. It has to
488
// be turned of by +noeh compiler option if desired.
489
#  define GTEST_HAS_EXCEPTIONS 1
490
# else
491
// For other compilers, we assume exceptions are disabled to be
492
// conservative.
493
#  define GTEST_HAS_EXCEPTIONS 0
494
# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
495
#endif  // GTEST_HAS_EXCEPTIONS
496
497
#if !defined(GTEST_HAS_STD_STRING)
498
// Even though we don't use this macro any longer, we keep it in case
499
// some clients still depend on it.
500
# define GTEST_HAS_STD_STRING 1
501
#elif !GTEST_HAS_STD_STRING
502
// The user told us that ::std::string isn't available.
503
# error "Google Test cannot be used where ::std::string isn't available."
504
#endif  // !defined(GTEST_HAS_STD_STRING)
505
506
#ifndef GTEST_HAS_GLOBAL_STRING
507
// The user didn't tell us whether ::string is available, so we need
508
// to figure it out.
509
510
# define GTEST_HAS_GLOBAL_STRING 0
511
512
#endif  // GTEST_HAS_GLOBAL_STRING
513
514
#ifndef GTEST_HAS_STD_WSTRING
515
// The user didn't tell us whether ::std::wstring is available, so we need
516
// to figure it out.
517
// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
518
//   is available.
519
520
// Cygwin 1.7 and below doesn't support ::std::wstring.
521
// Solaris' libc++ doesn't support it either.  Android has
522
// no support for it at least as recent as Froyo (2.2).
523
// Minix currently doesn't support it either.
524
# define GTEST_HAS_STD_WSTRING \
525
    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || GTEST_OS_HAIKU || GTEST_OS_MINIX))
526
527
#endif  // GTEST_HAS_STD_WSTRING
528
529
#ifndef GTEST_HAS_GLOBAL_WSTRING
530
// The user didn't tell us whether ::wstring is available, so we need
531
// to figure it out.
532
# define GTEST_HAS_GLOBAL_WSTRING \
533
    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
534
#endif  // GTEST_HAS_GLOBAL_WSTRING
535
536
// Determines whether RTTI is available.
537
#ifndef GTEST_HAS_RTTI
538
// The user didn't tell us whether RTTI is enabled, so we need to
539
// figure it out.
540
541
# ifdef _MSC_VER
542
543
#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
544
#   define GTEST_HAS_RTTI 1
545
#  else
546
#   define GTEST_HAS_RTTI 0
547
#  endif
548
549
// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
550
# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
551
552
#  ifdef __GXX_RTTI
553
// When building against STLport with the Android NDK and with
554
// -frtti -fno-exceptions, the build fails at link time with undefined
555
// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
556
// so disable RTTI when detected.
557
#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
558
       !defined(__EXCEPTIONS)
559
#    define GTEST_HAS_RTTI 0
560
#   else
561
#    define GTEST_HAS_RTTI 1
562
#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
563
#  else
564
#   define GTEST_HAS_RTTI 0
565
#  endif  // __GXX_RTTI
566
567
// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
568
// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
569
// first version with C++ support.
570
# elif defined(__clang__)
571
572
#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
573
574
// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
575
// both the typeid and dynamic_cast features are present.
576
# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
577
578
#  ifdef __RTTI_ALL__
579
#   define GTEST_HAS_RTTI 1
580
#  else
581
#   define GTEST_HAS_RTTI 0
582
#  endif
583
584
# else
585
586
// For all other compilers, we assume RTTI is enabled.
587
#  define GTEST_HAS_RTTI 1
588
589
# endif  // _MSC_VER
590
591
#endif  // GTEST_HAS_RTTI
592
593
// It's this header's responsibility to #include <typeinfo> when RTTI
594
// is enabled.
595
#if GTEST_HAS_RTTI
596
# include <typeinfo>
597
#endif
598
599
// Determines whether Google Test can use the pthreads library.
600
#ifndef GTEST_HAS_PTHREAD
601
// The user didn't tell us explicitly, so we make reasonable assumptions about
602
// which platforms have pthreads support.
603
//
604
// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
605
// to your compiler flags.
606
# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
607
    || GTEST_OS_QNX || GTEST_OS_FREEBSD || GTEST_OS_NACL)
608
#endif  // GTEST_HAS_PTHREAD
609
610
#if GTEST_HAS_PTHREAD
611
// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
612
// true.
613
# include <pthread.h>  // NOLINT
614
615
// For timespec and nanosleep, used below.
616
# include <time.h>  // NOLINT
617
#endif
618
619
// Determines if hash_map/hash_set are available.
620
// Only used for testing against those containers.
621
#if !defined(GTEST_HAS_HASH_MAP_)
622
# if _MSC_VER
623
#  define GTEST_HAS_HASH_MAP_ 1  // Indicates that hash_map is available.
624
#  define GTEST_HAS_HASH_SET_ 1  // Indicates that hash_set is available.
625
# endif  // _MSC_VER
626
#endif  // !defined(GTEST_HAS_HASH_MAP_)
627
628
// Determines whether Google Test can use tr1/tuple.  You can define
629
// this macro to 0 to prevent Google Test from using tuple (any
630
// feature depending on tuple with be disabled in this mode).
631
#ifndef GTEST_HAS_TR1_TUPLE
632
# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
633
// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
634
#  define GTEST_HAS_TR1_TUPLE 0
635
# else
636
// The user didn't tell us not to do it, so we assume it's OK.
637
#  define GTEST_HAS_TR1_TUPLE 1
638
# endif
639
#endif  // GTEST_HAS_TR1_TUPLE
640
641
// Determines whether Google Test's own tr1 tuple implementation
642
// should be used.
643
#ifndef GTEST_USE_OWN_TR1_TUPLE
644
// The user didn't tell us, so we need to figure it out.
645
646
// We use our own TR1 tuple if we aren't sure the user has an
647
// implementation of it already.  At this time, libstdc++ 4.0.0+ and
648
// MSVC 2010 are the only mainstream standard libraries that come
649
// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
650
// pretends to be GCC by defining __GNUC__ and friends, but cannot
651
// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
652
// tuple in a 323 MB Feature Pack download, which we cannot assume the
653
// user has.  QNX's QCC compiler is a modified GCC but it doesn't
654
// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
655
// and it can be used with some compilers that define __GNUC__.
656
# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
657
      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
658
#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
659
# endif
660
661
// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
662
// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
663
// can build with clang but need to use gcc4.2's libstdc++).
664
# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
665
#  define GTEST_ENV_HAS_STD_TUPLE_ 1
666
# endif
667
668
# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
669
#  define GTEST_USE_OWN_TR1_TUPLE 0
670
# else
671
#  define GTEST_USE_OWN_TR1_TUPLE 1
672
# endif
673
674
#endif  // GTEST_USE_OWN_TR1_TUPLE
675
676
// To avoid conditional compilation everywhere, we make it
677
// gtest-port.h's responsibility to #include the header implementing
678
// tuple.
679
#if GTEST_HAS_STD_TUPLE_
680
# include <tuple>  // IWYU pragma: export
681
# define GTEST_TUPLE_NAMESPACE_ ::std
682
#endif  // GTEST_HAS_STD_TUPLE_
683
684
// We include tr1::tuple even if std::tuple is available to define printers for
685
// them.
686
#if GTEST_HAS_TR1_TUPLE
687
# ifndef GTEST_TUPLE_NAMESPACE_
688
#  define GTEST_TUPLE_NAMESPACE_ ::std::tr1
689
# endif  // GTEST_TUPLE_NAMESPACE_
690
691
# if GTEST_USE_OWN_TR1_TUPLE
692
#  include "gtest/internal/gtest-tuple.h"  // IWYU pragma: export  // NOLINT
693
# elif GTEST_ENV_HAS_STD_TUPLE_
694
#  include <tuple>
695
// C++11 puts its tuple into the ::std namespace rather than
696
// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
697
// This causes undefined behavior, but supported compilers react in
698
// the way we intend.
699
namespace std {
700
namespace tr1 {
701
using ::std::get;
702
using ::std::make_tuple;
703
using ::std::tuple;
704
using ::std::tuple_element;
705
using ::std::tuple_size;
706
}
707
}
708
709
# elif GTEST_OS_SYMBIAN
710
711
// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
712
// use STLport's tuple implementation, which unfortunately doesn't
713
// work as the copy of STLport distributed with Symbian is incomplete.
714
// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
715
// use its own tuple implementation.
716
#  ifdef BOOST_HAS_TR1_TUPLE
717
#   undef BOOST_HAS_TR1_TUPLE
718
#  endif  // BOOST_HAS_TR1_TUPLE
719
720
// This prevents <boost/tr1/detail/config.hpp>, which defines
721
// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
722
#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
723
#  include <tuple>  // IWYU pragma: export  // NOLINT
724
725
# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
726
// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
727
// not conform to the TR1 spec, which requires the header to be <tuple>.
728
729
#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
730
// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
731
// which is #included by <tr1/tuple>, to not compile when RTTI is
732
// disabled.  _TR1_FUNCTIONAL is the header guard for
733
// <tr1/functional>.  Hence the following #define is a hack to prevent
734
// <tr1/functional> from being included.
735
#   define _TR1_FUNCTIONAL 1
736
#   include <tr1/tuple>
737
#   undef _TR1_FUNCTIONAL  // Allows the user to #include
738
                        // <tr1/functional> if he chooses to.
739
#  else
740
#   include <tr1/tuple>  // NOLINT
741
#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
742
743
# else
744
// If the compiler is not GCC 4.0+, we assume the user is using a
745
// spec-conforming TR1 implementation.
746
#  include <tuple>  // IWYU pragma: export  // NOLINT
747
# endif  // GTEST_USE_OWN_TR1_TUPLE
748
749
#endif  // GTEST_HAS_TR1_TUPLE
750
751
// Determines whether clone(2) is supported.
752
// Usually it will only be available on Linux, excluding
753
// Linux on the Itanium architecture.
754
// Also see http://linux.die.net/man/2/clone.
755
#ifndef GTEST_HAS_CLONE
756
// The user didn't tell us, so we need to figure it out.
757
758
# if GTEST_OS_LINUX && !defined(__ia64__)
759
#  if GTEST_OS_LINUX_ANDROID
760
// On Android, clone() is only available on ARM starting with Gingerbread.
761
#    if defined(__arm__) && __ANDROID_API__ >= 9
762
#     define GTEST_HAS_CLONE 1
763
#    else
764
#     define GTEST_HAS_CLONE 0
765
#    endif
766
#  else
767
#   define GTEST_HAS_CLONE 1
768
#  endif
769
# else
770
#  define GTEST_HAS_CLONE 0
771
# endif  // GTEST_OS_LINUX && !defined(__ia64__)
772
773
#endif  // GTEST_HAS_CLONE
774
775
// Determines whether to support stream redirection. This is used to test
776
// output correctness and to implement death tests.
777
#ifndef GTEST_HAS_STREAM_REDIRECTION
778
// By default, we assume that stream redirection is supported on all
779
// platforms except known mobile ones.
780
# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \
781
    GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
782
#  define GTEST_HAS_STREAM_REDIRECTION 0
783
# else
784
#  define GTEST_HAS_STREAM_REDIRECTION 1
785
# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
786
#endif  // GTEST_HAS_STREAM_REDIRECTION
787
788
// Determines whether to support death tests.
789
// Google Test does not support death tests for VC 7.1 and earlier as
790
// abort() in a VC 7.1 application compiled as GUI in debug config
791
// pops up a dialog window that cannot be suppressed programmatically.
792
#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
793
     (GTEST_OS_MAC && !GTEST_OS_IOS) || \
794
     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
795
     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
796
     GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || GTEST_OS_NETBSD)
797
# define GTEST_HAS_DEATH_TEST 1
798
#endif
799
800
// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
801
// all the compilers we care about are adequate for supporting
802
// value-parameterized tests.
803
#define GTEST_HAS_PARAM_TEST 1
804
805
// Determines whether to support type-driven tests.
806
807
// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
808
// Sun Pro CC, IBM Visual Age, and HP aCC support.
809
#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
810
    defined(__IBMCPP__) || defined(__HP_aCC)
811
# define GTEST_HAS_TYPED_TEST 1
812
# define GTEST_HAS_TYPED_TEST_P 1
813
#endif
814
815
// Determines whether to support Combine(). This only makes sense when
816
// value-parameterized tests are enabled.  The implementation doesn't
817
// work on Sun Studio since it doesn't understand templated conversion
818
// operators.
819
#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
820
# define GTEST_HAS_COMBINE 1
821
#endif
822
823
// Determines whether the system compiler uses UTF-16 for encoding wide strings.
824
#define GTEST_WIDE_STRING_USES_UTF16_ \
825
    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
826
827
// Determines whether test results can be streamed to a socket.
828
#if GTEST_OS_LINUX
829
# define GTEST_CAN_STREAM_RESULTS_ 1
830
#endif
831
832
// Defines some utility macros.
833
834
// The GNU compiler emits a warning if nested "if" statements are followed by
835
// an "else" statement and braces are not used to explicitly disambiguate the
836
// "else" binding.  This leads to problems with code like:
837
//
838
//   if (gate)
839
//     ASSERT_*(condition) << "Some message";
840
//
841
// The "switch (0) case 0:" idiom is used to suppress this.
842
#ifdef __INTEL_COMPILER
843
# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
844
#else
845
168
# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
846
#endif
847
848
// Use this annotation at the end of a struct/class definition to
849
// prevent the compiler from optimizing away instances that are never
850
// used.  This is useful when all interesting logic happens inside the
851
// c'tor and / or d'tor.  Example:
852
//
853
//   struct Foo {
854
//     Foo() { ... }
855
//   } GTEST_ATTRIBUTE_UNUSED_;
856
//
857
// Also use it after a variable or parameter declaration to tell the
858
// compiler the variable/parameter does not have to be used.
859
#if defined(__GNUC__) && !defined(COMPILER_ICC)
860
# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
861
#elif defined(__clang__)
862
# if __has_attribute(unused)
863
#  define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
864
# endif
865
#endif
866
#ifndef GTEST_ATTRIBUTE_UNUSED_
867
# define GTEST_ATTRIBUTE_UNUSED_
868
#endif
869
870
// A macro to disallow operator=
871
// This should be used in the private: declarations for a class.
872
#define GTEST_DISALLOW_ASSIGN_(type)\
873
  void operator=(type const &) = delete
874
875
// A macro to disallow copy constructor and operator=
876
// This should be used in the private: declarations for a class.
877
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
878
  type(type const &) = delete;\
879
  GTEST_DISALLOW_ASSIGN_(type)
880
881
// Tell the compiler to warn about unused return values for functions declared
882
// with this macro.  The macro should be used on function declarations
883
// following the argument list:
884
//
885
//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
886
#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
887
# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
888
#else
889
# define GTEST_MUST_USE_RESULT_
890
#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
891
892
// MS C++ compiler emits warning when a conditional expression is compile time
893
// constant. In some contexts this warning is false positive and needs to be
894
// suppressed. Use the following two macros in such cases:
895
//
896
// GTEST_INTENTIONAL_CONST_COND_PUSH_()
897
// while (true) {
898
// GTEST_INTENTIONAL_CONST_COND_POP_()
899
// }
900
# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \
901
    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)
902
# define GTEST_INTENTIONAL_CONST_COND_POP_() \
903
    GTEST_DISABLE_MSC_WARNINGS_POP_()
904
905
// Determine whether the compiler supports Microsoft's Structured Exception
906
// Handling.  This is supported by several Windows compilers but generally
907
// does not exist on any other system.
908
#ifndef GTEST_HAS_SEH
909
// The user didn't tell us, so we need to figure it out.
910
911
# if defined(_MSC_VER) || defined(__BORLANDC__)
912
// These two compilers are known to support SEH.
913
#  define GTEST_HAS_SEH 1
914
# else
915
// Assume no SEH.
916
#  define GTEST_HAS_SEH 0
917
# endif
918
919
#endif  // GTEST_HAS_SEH
920
921
#define GTEST_IS_THREADSAFE \
922
    (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \
923
     || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \
924
     || GTEST_HAS_PTHREAD)
925
926
#ifdef _MSC_VER
927
# if GTEST_LINKED_AS_SHARED_LIBRARY
928
#  define GTEST_API_ __declspec(dllimport)
929
# elif GTEST_CREATE_SHARED_LIBRARY
930
#  define GTEST_API_ __declspec(dllexport)
931
# endif
932
#elif __GNUC__ >= 4 || defined(__clang__)
933
# define GTEST_API_ __attribute__((visibility ("default")))
934
#endif // _MSC_VER
935
936
#ifndef GTEST_API_
937
# define GTEST_API_
938
#endif
939
940
#ifdef __GNUC__
941
// Ask the compiler to never inline a given function.
942
# define GTEST_NO_INLINE_ __attribute__((noinline))
943
#else
944
# define GTEST_NO_INLINE_
945
#endif
946
947
// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
948
#if defined(__has_include)
949
# if __has_include(<cxxabi.h>)
950
#  define GTEST_HAS_CXXABI_H_ 1
951
# else
952
#  define GTEST_HAS_CXXABI_H_ 0
953
# endif
954
#elif defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
955
# define GTEST_HAS_CXXABI_H_ 1
956
#else
957
# define GTEST_HAS_CXXABI_H_ 0
958
#endif
959
960
// A function level attribute to disable checking for use of uninitialized
961
// memory when built with MemorySanitizer.
962
#if defined(__clang__)
963
# if __has_feature(memory_sanitizer)
964
#  define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \
965
       __attribute__((no_sanitize_memory))
966
# else
967
#  define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
968
# endif  // __has_feature(memory_sanitizer)
969
#else
970
# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
971
#endif  // __clang__
972
973
// A function level attribute to disable AddressSanitizer instrumentation.
974
#if defined(__clang__)
975
# if __has_feature(address_sanitizer)
976
#  define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \
977
       __attribute__((no_sanitize_address))
978
# else
979
#  define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
980
# endif  // __has_feature(address_sanitizer)
981
#else
982
# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
983
#endif  // __clang__
984
985
// A function level attribute to disable ThreadSanitizer instrumentation.
986
#if defined(__clang__)
987
# if __has_feature(thread_sanitizer)
988
#  define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \
989
       __attribute__((no_sanitize_thread))
990
# else
991
#  define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
992
# endif  // __has_feature(thread_sanitizer)
993
#else
994
# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
995
#endif  // __clang__
996
997
namespace testing {
998
999
class Message;
1000
1001
#if defined(GTEST_TUPLE_NAMESPACE_)
1002
// Import tuple and friends into the ::testing namespace.
1003
// It is part of our interface, having them in ::testing allows us to change
1004
// their types as needed.
1005
using GTEST_TUPLE_NAMESPACE_::get;
1006
using GTEST_TUPLE_NAMESPACE_::make_tuple;
1007
using GTEST_TUPLE_NAMESPACE_::tuple;
1008
using GTEST_TUPLE_NAMESPACE_::tuple_size;
1009
using GTEST_TUPLE_NAMESPACE_::tuple_element;
1010
#endif  // defined(GTEST_TUPLE_NAMESPACE_)
1011
1012
namespace internal {
1013
1014
// A secret type that Google Test users don't know about.  It has no
1015
// definition on purpose.  Therefore it's impossible to create a
1016
// Secret object, which is what we want.
1017
class Secret;
1018
1019
// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
1020
// expression is true. For example, you could use it to verify the
1021
// size of a static array:
1022
//
1023
//   GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,
1024
//                         names_incorrect_size);
1025
//
1026
// or to make sure a struct is smaller than a certain size:
1027
//
1028
//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
1029
//
1030
// The second argument to the macro is the name of the variable. If
1031
// the expression is false, most compilers will issue a warning/error
1032
// containing the name of the variable.
1033
1034
#if GTEST_LANG_CXX11
1035
# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
1036
#else  // !GTEST_LANG_CXX11
1037
template <bool>
1038
  struct CompileAssert {
1039
};
1040
1041
# define GTEST_COMPILE_ASSERT_(expr, msg) \
1042
  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
1043
      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
1044
#endif  // !GTEST_LANG_CXX11
1045
1046
// Implementation details of GTEST_COMPILE_ASSERT_:
1047
//
1048
// (In C++11, we simply use static_assert instead of the following)
1049
//
1050
// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
1051
//   elements (and thus is invalid) when the expression is false.
1052
//
1053
// - The simpler definition
1054
//
1055
//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
1056
//
1057
//   does not work, as gcc supports variable-length arrays whose sizes
1058
//   are determined at run-time (this is gcc's extension and not part
1059
//   of the C++ standard).  As a result, gcc fails to reject the
1060
//   following code with the simple definition:
1061
//
1062
//     int foo;
1063
//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
1064
//                                      // not a compile-time constant.
1065
//
1066
// - By using the type CompileAssert<(bool(expr))>, we ensures that
1067
//   expr is a compile-time constant.  (Template arguments must be
1068
//   determined at compile-time.)
1069
//
1070
// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
1071
//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
1072
//
1073
//     CompileAssert<bool(expr)>
1074
//
1075
//   instead, these compilers will refuse to compile
1076
//
1077
//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
1078
//
1079
//   (They seem to think the ">" in "5 > 0" marks the end of the
1080
//   template argument list.)
1081
//
1082
// - The array size is (bool(expr) ? 1 : -1), instead of simply
1083
//
1084
//     ((expr) ? 1 : -1).
1085
//
1086
//   This is to avoid running into a bug in MS VC 7.1, which
1087
//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
1088
1089
// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
1090
//
1091
// This template is declared, but intentionally undefined.
1092
template <typename T1, typename T2>
1093
struct StaticAssertTypeEqHelper;
1094
1095
template <typename T>
1096
struct StaticAssertTypeEqHelper<T, T> {
1097
  enum { value = true };
1098
};
1099
1100
// Evaluates to the number of elements in 'array'.
1101
#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
1102
1103
#if GTEST_HAS_GLOBAL_STRING
1104
typedef ::string string;
1105
#else
1106
typedef ::std::string string;
1107
#endif  // GTEST_HAS_GLOBAL_STRING
1108
1109
#if GTEST_HAS_GLOBAL_WSTRING
1110
typedef ::wstring wstring;
1111
#elif GTEST_HAS_STD_WSTRING
1112
typedef ::std::wstring wstring;
1113
#endif  // GTEST_HAS_GLOBAL_WSTRING
1114
1115
// A helper for suppressing warnings on constant condition.  It just
1116
// returns 'condition'.
1117
GTEST_API_ bool IsTrue(bool condition);
1118
1119
// Defines scoped_ptr.
1120
1121
// This implementation of scoped_ptr is PARTIAL - it only contains
1122
// enough stuff to satisfy Google Test's need.
1123
template <typename T>
1124
class scoped_ptr {
1125
 public:
1126
  typedef T element_type;
1127
1128
470
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPS7_
Line
Count
Source
1128
326
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_17StreamingListener20AbstractSocketWriterEEC2EPS3_
_ZN7testing8internal10scoped_ptrINSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEEEC2EPS7_
Line
Count
Source
1128
98
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINS0_14GTestFlagSaverEEC2EPS2_
Line
Count
Source
1128
11
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPS8_
Line
Count
Source
1128
25
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE18ValueHolderFactoryEEC2EPS6_
Line
Count
Source
1128
2
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINS0_16DeathTestFactoryEEC2EPS2_
Line
Count
Source
1128
2
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINS0_24InternalRunDeathTestFlagEEC2EPS2_
Line
Count
Source
1128
2
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINS0_11ThreadLocalISt6vectorINS0_9TraceInfoESaIS4_EEE18ValueHolderFactoryEEC2EPS8_
Line
Count
Source
1128
2
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
_ZN7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_8SequenceEE18ValueHolderFactoryEEC2EPS6_
Line
Count
Source
1128
2
  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
1129
435
  ~scoped_ptr() { reset(); }
_ZN7testing8internal10scoped_ptrINSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEEED2Ev
Line
Count
Source
1129
98
  ~scoped_ptr() { reset(); }
_ZN7testing8internal10scoped_ptrINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEED2Ev
Line
Count
Source
1129
326
  ~scoped_ptr() { reset(); }
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_17StreamingListener20AbstractSocketWriterEED2Ev
_ZN7testing8internal10scoped_ptrINS0_14GTestFlagSaverEED2Ev
Line
Count
Source
1129
11
  ~scoped_ptr() { reset(); }
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEED2Ev
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE18ValueHolderFactoryEED2Ev
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_24InternalRunDeathTestFlagEED2Ev
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_16DeathTestFactoryEED2Ev
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_11ThreadLocalISt6vectorINS0_9TraceInfoESaIS4_EEE18ValueHolderFactoryEED2Ev
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_8SequenceEE18ValueHolderFactoryEED2Ev
1130
1131
784
  T& operator*() const { return *ptr_; }
_ZNK7testing8internal10scoped_ptrINSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEEEdeEv
Line
Count
Source
1131
784
  T& operator*() const { return *ptr_; }
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEdeEv
1132
0
  T* operator->() const { return ptr_; }
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEptEv
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEptEv
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINS0_11ThreadLocalISt6vectorINS0_9TraceInfoESaIS4_EEE18ValueHolderFactoryEEptEv
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINS0_17StreamingListener20AbstractSocketWriterEEptEv
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE18ValueHolderFactoryEEptEv
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_8SequenceEE18ValueHolderFactoryEEptEv
1133
116
  T* get() const { return ptr_; }
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3getEv
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrIKbE3getEv
_ZNK7testing8internal10scoped_ptrIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3getEv
Line
Count
Source
1133
14
  T* get() const { return ptr_; }
Unexecuted instantiation: _ZNK7testing8internal10scoped_ptrINS0_16DeathTestFactoryEE3getEv
_ZNK7testing8internal10scoped_ptrINS0_24InternalRunDeathTestFlagEE3getEv
Line
Count
Source
1133
4
  T* get() const { return ptr_; }
_ZNK7testing8internal10scoped_ptrINSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEEE3getEv
Line
Count
Source
1133
98
  T* get() const { return ptr_; }
1134
1135
  T* release() {
1136
    T* const ptr = ptr_;
1137
    ptr_ = NULL;
1138
    return ptr;
1139
  }
1140
1141
437
  void reset(T* p = NULL) {
1142
437
    if (p != ptr_) {
1143
109
      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
1144
109
        delete ptr_;
1145
109
      }
1146
109
      ptr_ = p;
1147
109
    }
1148
437
  }
_ZN7testing8internal10scoped_ptrINSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEEE5resetEPS7_
Line
Count
Source
1141
98
  void reset(T* p = NULL) {
1142
98
    if (p != ptr_) {
1143
98
      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
1144
98
        delete ptr_;
1145
98
      }
1146
98
      ptr_ = p;
1147
98
    }
1148
98
  }
_ZN7testing8internal10scoped_ptrINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5resetEPS7_
Line
Count
Source
1141
326
  void reset(T* p = NULL) {
1142
326
    if (p != ptr_) {
1143
0
      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
1144
0
        delete ptr_;
1145
0
      }
1146
0
      ptr_ = p;
1147
0
    }
1148
326
  }
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrIKbE5resetEPS2_
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_17StreamingListener20AbstractSocketWriterEE5resetEPS3_
_ZN7testing8internal10scoped_ptrINS0_24InternalRunDeathTestFlagEE5resetEPS2_
Line
Count
Source
1141
2
  void reset(T* p = NULL) {
1142
2
    if (p != ptr_) {
1143
0
      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
1144
0
        delete ptr_;
1145
0
      }
1146
0
      ptr_ = p;
1147
0
    }
1148
2
  }
_ZN7testing8internal10scoped_ptrINS0_14GTestFlagSaverEE5resetEPS2_
Line
Count
Source
1141
11
  void reset(T* p = NULL) {
1142
11
    if (p != ptr_) {
1143
11
      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
1144
11
        delete ptr_;
1145
11
      }
1146
11
      ptr_ = p;
1147
11
    }
1148
11
  }
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5resetEPS8_
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE18ValueHolderFactoryEE5resetEPS6_
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_16DeathTestFactoryEE5resetEPS2_
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_11ThreadLocalISt6vectorINS0_9TraceInfoESaIS4_EEE18ValueHolderFactoryEE5resetEPS8_
Unexecuted instantiation: _ZN7testing8internal10scoped_ptrINS0_11ThreadLocalIPNS_8SequenceEE18ValueHolderFactoryEE5resetEPS6_
1149
1150
0
  friend void swap(scoped_ptr& a, scoped_ptr& b) {
1151
0
    using std::swap;
1152
0
    swap(a.ptr_, b.ptr_);
1153
0
  }
1154
1155
 private:
1156
  T* ptr_;
1157
1158
  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
1159
};
1160
1161
// Defines RE.
1162
1163
// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
1164
// Regular Expression syntax.
1165
class GTEST_API_ RE {
1166
 public:
1167
  // A copy constructor is required by the Standard to initialize object
1168
  // references from r-values.
1169
0
  RE(const RE& other) { Init(other.pattern()); }
1170
1171
  // Constructs an RE from a string.
1172
0
  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
1173
1174
#if GTEST_HAS_GLOBAL_STRING
1175
1176
  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
1177
1178
#endif  // GTEST_HAS_GLOBAL_STRING
1179
1180
0
  RE(const char* regex) { Init(regex); }  // NOLINT
1181
  ~RE();
1182
1183
  // Returns the string representation of the regex.
1184
0
  const char* pattern() const { return pattern_; }
1185
1186
  // FullMatch(str, re) returns true iff regular expression re matches
1187
  // the entire str.
1188
  // PartialMatch(str, re) returns true iff regular expression re
1189
  // matches a substring of str (including str itself).
1190
  //
1191
  // TODO(wan@google.com): make FullMatch() and PartialMatch() work
1192
  // when str contains NUL characters.
1193
0
  static bool FullMatch(const ::std::string& str, const RE& re) {
1194
0
    return FullMatch(str.c_str(), re);
1195
0
  }
1196
0
  static bool PartialMatch(const ::std::string& str, const RE& re) {
1197
0
    return PartialMatch(str.c_str(), re);
1198
0
  }
1199
1200
#if GTEST_HAS_GLOBAL_STRING
1201
1202
  static bool FullMatch(const ::string& str, const RE& re) {
1203
    return FullMatch(str.c_str(), re);
1204
  }
1205
  static bool PartialMatch(const ::string& str, const RE& re) {
1206
    return PartialMatch(str.c_str(), re);
1207
  }
1208
1209
#endif  // GTEST_HAS_GLOBAL_STRING
1210
1211
  static bool FullMatch(const char* str, const RE& re);
1212
  static bool PartialMatch(const char* str, const RE& re);
1213
1214
 private:
1215
  void Init(const char* regex);
1216
1217
  // We use a const char* instead of an std::string, as Google Test used to be
1218
  // used where std::string is not available.  TODO(wan@google.com): change to
1219
  // std::string.
1220
  const char* pattern_;
1221
  bool is_valid_;
1222
1223
#if GTEST_USES_POSIX_RE
1224
1225
  regex_t full_regex_;     // For FullMatch().
1226
  regex_t partial_regex_;  // For PartialMatch().
1227
1228
#else  // GTEST_USES_SIMPLE_RE
1229
1230
  const char* full_pattern_;  // For FullMatch();
1231
1232
#endif
1233
1234
  GTEST_DISALLOW_ASSIGN_(RE);
1235
};
1236
1237
// Formats a source file path and a line number as they would appear
1238
// in an error message from the compiler used to compile this code.
1239
GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
1240
1241
// Formats a file location for compiler-independent XML output.
1242
// Although this function is not platform dependent, we put it next to
1243
// FormatFileLocation in order to contrast the two functions.
1244
GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
1245
                                                               int line);
1246
1247
// Defines logging utilities:
1248
//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
1249
//                          message itself is streamed into the macro.
1250
//   LogToStderr()  - directs all log messages to stderr.
1251
//   FlushInfoLog() - flushes informational log messages.
1252
1253
enum GTestLogSeverity {
1254
  GTEST_INFO,
1255
  GTEST_WARNING,
1256
  GTEST_ERROR,
1257
  GTEST_FATAL
1258
};
1259
1260
// Formats log entry severity, provides a stream object for streaming the
1261
// log message, and terminates the message with a newline when going out of
1262
// scope.
1263
class GTEST_API_ GTestLog {
1264
 public:
1265
  GTestLog(GTestLogSeverity severity, const char* file, int line);
1266
1267
  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
1268
  ~GTestLog();
1269
1270
0
  ::std::ostream& GetStream() { return ::std::cerr; }
1271
1272
 private:
1273
  const GTestLogSeverity severity_;
1274
1275
  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
1276
};
1277
1278
#if !defined(GTEST_LOG_)
1279
1280
# define GTEST_LOG_(severity) \
1281
0
    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
1282
0
                                  __FILE__, __LINE__).GetStream()
1283
1284
0
inline void LogToStderr() {}
1285
0
inline void FlushInfoLog() { fflush(NULL); }
1286
1287
#endif  // !defined(GTEST_LOG_)
1288
1289
#if !defined(GTEST_CHECK_)
1290
// INTERNAL IMPLEMENTATION - DO NOT USE.
1291
//
1292
// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
1293
// is not satisfied.
1294
//  Synopsys:
1295
//    GTEST_CHECK_(boolean_condition);
1296
//     or
1297
//    GTEST_CHECK_(boolean_condition) << "Additional message";
1298
//
1299
//    This checks the condition and if the condition is not satisfied
1300
//    it prints message about the condition violation, including the
1301
//    condition itself, plus additional message streamed into it, if any,
1302
//    and then it aborts the program. It aborts the program irrespective of
1303
//    whether it is built in the debug mode or not.
1304
# define GTEST_CHECK_(condition) \
1305
2
    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
1306
2
    if (::testing::internal::IsTrue(condition)) \
1307
2
      ; \
1308
2
    else \
1309
2
      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
1310
#endif  // !defined(GTEST_CHECK_)
1311
1312
// An all-mode assert to verify that the given POSIX-style function
1313
// call returns 0 (indicating success).  Known limitation: this
1314
// doesn't expand to a balanced 'if' statement, so enclose the macro
1315
// in {} if you need to use it as the only statement in an 'if'
1316
// branch.
1317
#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
1318
118
  if (const int gtest_error = (posix_call)) \
1319
118
    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
1320
0
                      << gtest_error
1321
1322
#if GTEST_HAS_STD_MOVE_
1323
using std::move;
1324
#else  // GTEST_HAS_STD_MOVE_
1325
template <typename T>
1326
const T& move(const T& t) {
1327
  return t;
1328
}
1329
#endif  // GTEST_HAS_STD_MOVE_
1330
1331
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
1332
//
1333
// Use ImplicitCast_ as a safe version of static_cast for upcasting in
1334
// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
1335
// const Foo*).  When you use ImplicitCast_, the compiler checks that
1336
// the cast is safe.  Such explicit ImplicitCast_s are necessary in
1337
// surprisingly many situations where C++ demands an exact type match
1338
// instead of an argument type convertable to a target type.
1339
//
1340
// The syntax for using ImplicitCast_ is the same as for static_cast:
1341
//
1342
//   ImplicitCast_<ToType>(expr)
1343
//
1344
// ImplicitCast_ would have been part of the C++ standard library,
1345
// but the proposal was submitted too late.  It will probably make
1346
// its way into the language in the future.
1347
//
1348
// This relatively ugly name is intentional. It prevents clashes with
1349
// similar functions users may have (e.g., implicit_cast). The internal
1350
// namespace alone is not enough because the function can be found by ADL.
1351
template<typename To>
1352
0
inline To ImplicitCast_(To x) { return x; }
Unexecuted instantiation: _ZN7testing8internal13ImplicitCast_IPKcEET_S4_
Unexecuted instantiation: _ZN7testing8internal13ImplicitCast_IPKvEET_S4_
Unexecuted instantiation: _ZN7testing8internal13ImplicitCast_IPKwEET_S4_
1353
1354
// When you upcast (that is, cast a pointer from type Foo to type
1355
// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
1356
// always succeed.  When you downcast (that is, cast a pointer from
1357
// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
1358
// how do you know the pointer is really of type SubclassOfFoo?  It
1359
// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
1360
// when you downcast, you should use this macro.  In debug mode, we
1361
// use dynamic_cast<> to double-check the downcast is legal (we die
1362
// if it's not).  In normal mode, we do the efficient static_cast<>
1363
// instead.  Thus, it's important to test in debug mode to make sure
1364
// the cast is legal!
1365
//    This is the only place in the code we should use dynamic_cast<>.
1366
// In particular, you SHOULDN'T be using dynamic_cast<> in order to
1367
// do RTTI (eg code like this:
1368
//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
1369
//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
1370
// You should design the code some other way not to need this.
1371
//
1372
// This relatively ugly name is intentional. It prevents clashes with
1373
// similar functions users may have (e.g., down_cast). The internal
1374
// namespace alone is not enough because the function can be found by ADL.
1375
template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
1376
inline To DownCast_(From* f) {  // so we only accept pointers
1377
  // Ensures that To is a sub-type of From *.  This test is here only
1378
  // for compile-time type checking, and has no overhead in an
1379
  // optimized build at run-time, as it will be optimized away
1380
  // completely.
1381
  GTEST_INTENTIONAL_CONST_COND_PUSH_()
1382
  if (false) {
1383
  GTEST_INTENTIONAL_CONST_COND_POP_()
1384
    const To to = NULL;
1385
    ::testing::internal::ImplicitCast_<From*>(to);
1386
  }
1387
1388
#if GTEST_HAS_RTTI
1389
  // RTTI: debug mode only!
1390
  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
1391
#endif
1392
  return static_cast<To>(f);
1393
}
1394
1395
// Downcasts the pointer of type Base to Derived.
1396
// Derived must be a subclass of Base. The parameter MUST
1397
// point to a class of type Derived, not any subclass of it.
1398
// When RTTI is available, the function performs a runtime
1399
// check to enforce this.
1400
template <class Derived, class Base>
1401
0
Derived* CheckedDowncastToActualType(Base* base) {
1402
#if GTEST_HAS_RTTI
1403
  GTEST_CHECK_(typeid(*base) == typeid(Derived));
1404
#endif
1405
1406
#if GTEST_HAS_DOWNCAST_
1407
  return ::down_cast<Derived*>(base);
1408
#elif GTEST_HAS_RTTI
1409
  return dynamic_cast<Derived*>(base);  // NOLINT
1410
#else
1411
  return static_cast<Derived*>(base);  // Poor man's downcast.
1412
0
#endif
1413
0
}
Unexecuted instantiation: _ZN7testing8internal27CheckedDowncastToActualTypeIKNS0_30ValuesInIteratorRangeGeneratorIbE8IteratorEKNS0_22ParamIteratorInterfaceIbEEEEPT_PT0_
Unexecuted instantiation: _ZN7testing8internal27CheckedDowncastToActualTypeINS0_11ThreadLocalISt6vectorINS0_9TraceInfoESaIS4_EEE11ValueHolderENS0_26ThreadLocalValueHolderBaseEEEPT_PT0_
Unexecuted instantiation: _ZN7testing8internal27CheckedDowncastToActualTypeINS0_11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE11ValueHolderENS0_26ThreadLocalValueHolderBaseEEEPT_PT0_
Unexecuted instantiation: _ZN7testing8internal27CheckedDowncastToActualTypeINS0_11ThreadLocalIPNS_8SequenceEE11ValueHolderENS0_26ThreadLocalValueHolderBaseEEEPT_PT0_
1414
1415
#if GTEST_HAS_STREAM_REDIRECTION
1416
1417
// Defines the stderr capturer:
1418
//   CaptureStdout     - starts capturing stdout.
1419
//   GetCapturedStdout - stops capturing stdout and returns the captured string.
1420
//   CaptureStderr     - starts capturing stderr.
1421
//   GetCapturedStderr - stops capturing stderr and returns the captured string.
1422
//
1423
GTEST_API_ void CaptureStdout();
1424
GTEST_API_ std::string GetCapturedStdout();
1425
GTEST_API_ void CaptureStderr();
1426
GTEST_API_ std::string GetCapturedStderr();
1427
1428
#endif  // GTEST_HAS_STREAM_REDIRECTION
1429
1430
// Returns a path to temporary directory.
1431
GTEST_API_ std::string TempDir();
1432
1433
// Returns the size (in bytes) of a file.
1434
GTEST_API_ size_t GetFileSize(FILE* file);
1435
1436
// Reads the entire content of a file as a string.
1437
GTEST_API_ std::string ReadEntireFile(FILE* file);
1438
1439
// All command line arguments.
1440
GTEST_API_ const ::std::vector<testing::internal::string>& GetArgvs();
1441
1442
#if GTEST_HAS_DEATH_TEST
1443
1444
const ::std::vector<testing::internal::string>& GetInjectableArgvs();
1445
void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
1446
                             new_argvs);
1447
1448
1449
#endif  // GTEST_HAS_DEATH_TEST
1450
1451
// Defines synchronization primitives.
1452
#if GTEST_IS_THREADSAFE
1453
# if GTEST_HAS_PTHREAD
1454
// Sleeps for (roughly) n milliseconds.  This function is only for testing
1455
// Google Test's own constructs.  Don't use it in user tests, either
1456
// directly or indirectly.
1457
0
inline void SleepMilliseconds(int n) {
1458
0
  const timespec time = {
1459
0
    0,                  // 0 seconds.
1460
0
    n * 1000L * 1000L,  // And n ms.
1461
0
  };
1462
0
  nanosleep(&time, NULL);
1463
0
}
1464
# endif  // GTEST_HAS_PTHREAD
1465
1466
# if GTEST_HAS_NOTIFICATION_
1467
// Notification has already been imported into the namespace.
1468
// Nothing to do here.
1469
1470
# elif GTEST_HAS_PTHREAD
1471
// Allows a controller thread to pause execution of newly created
1472
// threads until notified.  Instances of this class must be created
1473
// and destroyed in the controller thread.
1474
//
1475
// This class is only for testing Google Test's own constructs. Do not
1476
// use it in user tests, either directly or indirectly.
1477
class Notification {
1478
 public:
1479
0
  Notification() : notified_(false) {
1480
0
    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
1481
0
  }
1482
0
  ~Notification() {
1483
0
    pthread_mutex_destroy(&mutex_);
1484
0
  }
1485
1486
  // Notifies all threads created with this notification to start. Must
1487
  // be called from the controller thread.
1488
0
  void Notify() {
1489
0
    pthread_mutex_lock(&mutex_);
1490
0
    notified_ = true;
1491
0
    pthread_mutex_unlock(&mutex_);
1492
0
  }
1493
1494
  // Blocks until the controller thread notifies. Must be called from a test
1495
  // thread.
1496
0
  void WaitForNotification() {
1497
0
    for (;;) {
1498
0
      pthread_mutex_lock(&mutex_);
1499
0
      const bool notified = notified_;
1500
0
      pthread_mutex_unlock(&mutex_);
1501
0
      if (notified)
1502
0
        break;
1503
0
      SleepMilliseconds(10);
1504
0
    }
1505
0
  }
1506
1507
 private:
1508
  pthread_mutex_t mutex_;
1509
  bool notified_;
1510
1511
  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1512
};
1513
1514
# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
1515
1516
GTEST_API_ void SleepMilliseconds(int n);
1517
1518
// Provides leak-safe Windows kernel handle ownership.
1519
// Used in death tests and in threading support.
1520
class GTEST_API_ AutoHandle {
1521
 public:
1522
  // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to
1523
  // avoid including <windows.h> in this header file. Including <windows.h> is
1524
  // undesirable because it defines a lot of symbols and macros that tend to
1525
  // conflict with client code. This assumption is verified by
1526
  // WindowsTypesTest.HANDLEIsVoidStar.
1527
  typedef void* Handle;
1528
  AutoHandle();
1529
  explicit AutoHandle(Handle handle);
1530
1531
  ~AutoHandle();
1532
1533
  Handle Get() const;
1534
  void Reset();
1535
  void Reset(Handle handle);
1536
1537
 private:
1538
  // Returns true iff the handle is a valid handle object that can be closed.
1539
  bool IsCloseable() const;
1540
1541
  Handle handle_;
1542
1543
  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
1544
};
1545
1546
// Allows a controller thread to pause execution of newly created
1547
// threads until notified.  Instances of this class must be created
1548
// and destroyed in the controller thread.
1549
//
1550
// This class is only for testing Google Test's own constructs. Do not
1551
// use it in user tests, either directly or indirectly.
1552
class GTEST_API_ Notification {
1553
 public:
1554
  Notification();
1555
  void Notify();
1556
  void WaitForNotification();
1557
1558
 private:
1559
  AutoHandle event_;
1560
1561
  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1562
};
1563
# endif  // GTEST_HAS_NOTIFICATION_
1564
1565
// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD
1566
// defined, but we don't want to use MinGW's pthreads implementation, which
1567
// has conformance problems with some versions of the POSIX standard.
1568
# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
1569
1570
// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
1571
// Consequently, it cannot select a correct instantiation of ThreadWithParam
1572
// in order to call its Run(). Introducing ThreadWithParamBase as a
1573
// non-templated base class for ThreadWithParam allows us to bypass this
1574
// problem.
1575
class ThreadWithParamBase {
1576
 public:
1577
0
  virtual ~ThreadWithParamBase() {}
1578
  virtual void Run() = 0;
1579
};
1580
1581
// pthread_create() accepts a pointer to a function type with the C linkage.
1582
// According to the Standard (7.5/1), function types with different linkages
1583
// are different even if they are otherwise identical.  Some compilers (for
1584
// example, SunStudio) treat them as different types.  Since class methods
1585
// cannot be defined with C-linkage we need to define a free C-function to
1586
// pass into pthread_create().
1587
0
extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
1588
0
  static_cast<ThreadWithParamBase*>(thread)->Run();
1589
0
  return NULL;
1590
0
}
1591
1592
// Helper class for testing Google Test's multi-threading constructs.
1593
// To use it, write:
1594
//
1595
//   void ThreadFunc(int param) { /* Do things with param */ }
1596
//   Notification thread_can_start;
1597
//   ...
1598
//   // The thread_can_start parameter is optional; you can supply NULL.
1599
//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
1600
//   thread_can_start.Notify();
1601
//
1602
// These classes are only for testing Google Test's own constructs. Do
1603
// not use them in user tests, either directly or indirectly.
1604
template <typename T>
1605
class ThreadWithParam : public ThreadWithParamBase {
1606
 public:
1607
  typedef void UserThreadFunc(T);
1608
1609
  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
1610
      : func_(func),
1611
        param_(param),
1612
        thread_can_start_(thread_can_start),
1613
        finished_(false) {
1614
    ThreadWithParamBase* const base = this;
1615
    // The thread can be created only after all fields except thread_
1616
    // have been initialized.
1617
    GTEST_CHECK_POSIX_SUCCESS_(
1618
        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
1619
  }
1620
  ~ThreadWithParam() { Join(); }
1621
1622
  void Join() {
1623
    if (!finished_) {
1624
      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
1625
      finished_ = true;
1626
    }
1627
  }
1628
1629
  virtual void Run() {
1630
    if (thread_can_start_ != NULL)
1631
      thread_can_start_->WaitForNotification();
1632
    func_(param_);
1633
  }
1634
1635
 private:
1636
  UserThreadFunc* const func_;  // User-supplied thread function.
1637
  const T param_;  // User-supplied parameter to the thread function.
1638
  // When non-NULL, used to block execution until the controller thread
1639
  // notifies.
1640
  Notification* const thread_can_start_;
1641
  bool finished_;  // true iff we know that the thread function has finished.
1642
  pthread_t thread_;  // The native thread object.
1643
1644
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1645
};
1646
# endif  // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||
1647
         // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
1648
1649
# if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
1650
// Mutex and ThreadLocal have already been imported into the namespace.
1651
// Nothing to do here.
1652
1653
# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
1654
1655
// Mutex implements mutex on Windows platforms.  It is used in conjunction
1656
// with class MutexLock:
1657
//
1658
//   Mutex mutex;
1659
//   ...
1660
//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the
1661
//                            // end of the current scope.
1662
//
1663
// A static Mutex *must* be defined or declared using one of the following
1664
// macros:
1665
//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
1666
//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
1667
//
1668
// (A non-static Mutex is defined/declared in the usual way).
1669
class GTEST_API_ Mutex {
1670
 public:
1671
  enum MutexType { kStatic = 0, kDynamic = 1 };
1672
  // We rely on kStaticMutex being 0 as it is to what the linker initializes
1673
  // type_ in static mutexes.  critical_section_ will be initialized lazily
1674
  // in ThreadSafeLazyInit().
1675
  enum StaticConstructorSelector { kStaticMutex = 0 };
1676
1677
  // This constructor intentionally does nothing.  It relies on type_ being
1678
  // statically initialized to 0 (effectively setting it to kStatic) and on
1679
  // ThreadSafeLazyInit() to lazily initialize the rest of the members.
1680
  explicit Mutex(StaticConstructorSelector /*dummy*/) {}
1681
1682
  Mutex();
1683
  ~Mutex();
1684
1685
  void Lock();
1686
1687
  void Unlock();
1688
1689
  // Does nothing if the current thread holds the mutex. Otherwise, crashes
1690
  // with high probability.
1691
  void AssertHeld();
1692
1693
 private:
1694
  // Initializes owner_thread_id_ and critical_section_ in static mutexes.
1695
  void ThreadSafeLazyInit();
1696
1697
  // Per http://blogs.msdn.com/b/oldnewthing/archive/2004/02/23/78395.aspx,
1698
  // we assume that 0 is an invalid value for thread IDs.
1699
  unsigned int owner_thread_id_;
1700
1701
  // For static mutexes, we rely on these members being initialized to zeros
1702
  // by the linker.
1703
  MutexType type_;
1704
  long critical_section_init_phase_;  // NOLINT
1705
  _RTL_CRITICAL_SECTION* critical_section_;
1706
1707
  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1708
};
1709
1710
# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1711
    extern ::testing::internal::Mutex mutex
1712
1713
# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
1714
    ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)
1715
1716
// We cannot name this class MutexLock because the ctor declaration would
1717
// conflict with a macro named MutexLock, which is defined on some
1718
// platforms. That macro is used as a defensive measure to prevent against
1719
// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
1720
// "MutexLock l(&mu)".  Hence the typedef trick below.
1721
class GTestMutexLock {
1722
 public:
1723
  explicit GTestMutexLock(Mutex* mutex)
1724
      : mutex_(mutex) { mutex_->Lock(); }
1725
1726
  ~GTestMutexLock() { mutex_->Unlock(); }
1727
1728
 private:
1729
  Mutex* const mutex_;
1730
1731
  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
1732
};
1733
1734
typedef GTestMutexLock MutexLock;
1735
1736
// Base class for ValueHolder<T>.  Allows a caller to hold and delete a value
1737
// without knowing its type.
1738
class ThreadLocalValueHolderBase {
1739
 public:
1740
  virtual ~ThreadLocalValueHolderBase() {}
1741
};
1742
1743
// Provides a way for a thread to send notifications to a ThreadLocal
1744
// regardless of its parameter type.
1745
class ThreadLocalBase {
1746
 public:
1747
  // Creates a new ValueHolder<T> object holding a default value passed to
1748
  // this ThreadLocal<T>'s constructor and returns it.  It is the caller's
1749
  // responsibility not to call this when the ThreadLocal<T> instance already
1750
  // has a value on the current thread.
1751
  virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0;
1752
1753
 protected:
1754
  ThreadLocalBase() {}
1755
  virtual ~ThreadLocalBase() {}
1756
1757
 private:
1758
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);
1759
};
1760
1761
// Maps a thread to a set of ThreadLocals that have values instantiated on that
1762
// thread and notifies them when the thread exits.  A ThreadLocal instance is
1763
// expected to persist until all threads it has values on have terminated.
1764
class GTEST_API_ ThreadLocalRegistry {
1765
 public:
1766
  // Registers thread_local_instance as having value on the current thread.
1767
  // Returns a value that can be used to identify the thread from other threads.
1768
  static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
1769
      const ThreadLocalBase* thread_local_instance);
1770
1771
  // Invoked when a ThreadLocal instance is destroyed.
1772
  static void OnThreadLocalDestroyed(
1773
      const ThreadLocalBase* thread_local_instance);
1774
};
1775
1776
class GTEST_API_ ThreadWithParamBase {
1777
 public:
1778
  void Join();
1779
1780
 protected:
1781
  class Runnable {
1782
   public:
1783
    virtual ~Runnable() {}
1784
    virtual void Run() = 0;
1785
  };
1786
1787
  ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
1788
  virtual ~ThreadWithParamBase();
1789
1790
 private:
1791
  AutoHandle thread_;
1792
};
1793
1794
// Helper class for testing Google Test's multi-threading constructs.
1795
template <typename T>
1796
class ThreadWithParam : public ThreadWithParamBase {
1797
 public:
1798
  typedef void UserThreadFunc(T);
1799
1800
  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
1801
      : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {
1802
  }
1803
  virtual ~ThreadWithParam() {}
1804
1805
 private:
1806
  class RunnableImpl : public Runnable {
1807
   public:
1808
    RunnableImpl(UserThreadFunc* func, T param)
1809
        : func_(func),
1810
          param_(param) {
1811
    }
1812
    virtual ~RunnableImpl() {}
1813
    virtual void Run() {
1814
      func_(param_);
1815
    }
1816
1817
   private:
1818
    UserThreadFunc* const func_;
1819
    const T param_;
1820
1821
    GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);
1822
  };
1823
1824
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1825
};
1826
1827
// Implements thread-local storage on Windows systems.
1828
//
1829
//   // Thread 1
1830
//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
1831
//
1832
//   // Thread 2
1833
//   tl.set(150);  // Changes the value for thread 2 only.
1834
//   EXPECT_EQ(150, tl.get());
1835
//
1836
//   // Thread 1
1837
//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
1838
//   tl.set(200);
1839
//   EXPECT_EQ(200, tl.get());
1840
//
1841
// The template type argument T must have a public copy constructor.
1842
// In addition, the default ThreadLocal constructor requires T to have
1843
// a public default constructor.
1844
//
1845
// The users of a TheadLocal instance have to make sure that all but one
1846
// threads (including the main one) using that instance have exited before
1847
// destroying it. Otherwise, the per-thread objects managed for them by the
1848
// ThreadLocal instance are not guaranteed to be destroyed on all platforms.
1849
//
1850
// Google Test only uses global ThreadLocal objects.  That means they
1851
// will die after main() has returned.  Therefore, no per-thread
1852
// object managed by Google Test will be leaked as long as all threads
1853
// using Google Test have exited when main() returns.
1854
template <typename T>
1855
class ThreadLocal : public ThreadLocalBase {
1856
 public:
1857
  ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}
1858
  explicit ThreadLocal(const T& value)
1859
      : default_factory_(new InstanceValueHolderFactory(value)) {}
1860
1861
  ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); }
1862
1863
  T* pointer() { return GetOrCreateValue(); }
1864
  const T* pointer() const { return GetOrCreateValue(); }
1865
  const T& get() const { return *pointer(); }
1866
  void set(const T& value) { *pointer() = value; }
1867
1868
 private:
1869
  // Holds a value of T.  Can be deleted via its base class without the caller
1870
  // knowing the type of T.
1871
  class ValueHolder : public ThreadLocalValueHolderBase {
1872
   public:
1873
    ValueHolder() : value_() {}
1874
    explicit ValueHolder(const T& value) : value_(value) {}
1875
1876
    T* pointer() { return &value_; }
1877
1878
   private:
1879
    T value_;
1880
    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
1881
  };
1882
1883
1884
  T* GetOrCreateValue() const {
1885
    return static_cast<ValueHolder*>(
1886
        ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer();
1887
  }
1888
1889
  virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const {
1890
    return default_factory_->MakeNewHolder();
1891
  }
1892
1893
  class ValueHolderFactory {
1894
   public:
1895
    ValueHolderFactory() {}
1896
    virtual ~ValueHolderFactory() {}
1897
    virtual ValueHolder* MakeNewHolder() const = 0;
1898
1899
   private:
1900
    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
1901
  };
1902
1903
  class DefaultValueHolderFactory : public ValueHolderFactory {
1904
   public:
1905
    DefaultValueHolderFactory() {}
1906
    virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
1907
1908
   private:
1909
    GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
1910
  };
1911
1912
  class InstanceValueHolderFactory : public ValueHolderFactory {
1913
   public:
1914
    explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
1915
    virtual ValueHolder* MakeNewHolder() const {
1916
      return new ValueHolder(value_);
1917
    }
1918
1919
   private:
1920
    const T value_;  // The value for each thread.
1921
1922
    GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
1923
  };
1924
1925
  scoped_ptr<ValueHolderFactory> default_factory_;
1926
1927
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
1928
};
1929
1930
# elif GTEST_HAS_PTHREAD
1931
1932
// MutexBase and Mutex implement mutex on pthreads-based platforms.
1933
class MutexBase {
1934
 public:
1935
  // Acquires this mutex.
1936
46
  void Lock() {
1937
46
    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
1938
46
    owner_ = pthread_self();
1939
46
    has_owner_ = true;
1940
46
  }
1941
1942
  // Releases this mutex.
1943
46
  void Unlock() {
1944
46
    // Since the lock is being released the owner_ field should no longer be
1945
46
    // considered valid. We don't protect writing to has_owner_ here, as it's
1946
46
    // the caller's responsibility to ensure that the current thread holds the
1947
46
    // mutex when this is called.
1948
46
    has_owner_ = false;
1949
46
    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
1950
46
  }
1951
1952
  // Does nothing if the current thread holds the mutex. Otherwise, crashes
1953
  // with high probability.
1954
0
  void AssertHeld() const {
1955
0
    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
1956
0
        << "The current thread is not holding the mutex @" << this;
1957
0
  }
1958
1959
  // A static mutex may be used before main() is entered.  It may even
1960
  // be used before the dynamic initialization stage.  Therefore we
1961
  // must be able to initialize a static mutex object at link time.
1962
  // This means MutexBase has to be a POD and its member variables
1963
  // have to be public.
1964
 public:
1965
  pthread_mutex_t mutex_;  // The underlying pthread mutex.
1966
  // has_owner_ indicates whether the owner_ field below contains a valid thread
1967
  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
1968
  // accesses to the owner_ field should be protected by a check of this field.
1969
  // An alternative might be to memset() owner_ to all zeros, but there's no
1970
  // guarantee that a zero'd pthread_t is necessarily invalid or even different
1971
  // from pthread_self().
1972
  bool has_owner_;
1973
  pthread_t owner_;  // The thread holding the mutex.
1974
};
1975
1976
// Forward-declares a static mutex.
1977
#  define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1978
     extern ::testing::internal::MutexBase mutex
1979
1980
// Defines and statically (i.e. at link time) initializes a static mutex.
1981
#  define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
1982
     ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false, pthread_t() }
1983
1984
// The Mutex class can only be used for mutexes created at runtime. It
1985
// shares its API with MutexBase otherwise.
1986
class Mutex : public MutexBase {
1987
 public:
1988
20
  Mutex() {
1989
20
    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
1990
20
    has_owner_ = false;
1991
20
  }
1992
0
  ~Mutex() {
1993
0
    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
1994
0
  }
1995
1996
 private:
1997
  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1998
};
1999
2000
// We cannot name this class MutexLock because the ctor declaration would
2001
// conflict with a macro named MutexLock, which is defined on some
2002
// platforms. That macro is used as a defensive measure to prevent against
2003
// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
2004
// "MutexLock l(&mu)".  Hence the typedef trick below.
2005
class GTestMutexLock {
2006
 public:
2007
  explicit GTestMutexLock(MutexBase* mutex)
2008
46
      : mutex_(mutex) { mutex_->Lock(); }
2009
2010
46
  ~GTestMutexLock() { mutex_->Unlock(); }
2011
2012
 private:
2013
  MutexBase* const mutex_;
2014
2015
  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
2016
};
2017
2018
typedef GTestMutexLock MutexLock;
2019
2020
// Helpers for ThreadLocal.
2021
2022
// pthread_key_create() requires DeleteThreadLocalValue() to have
2023
// C-linkage.  Therefore it cannot be templatized to access
2024
// ThreadLocal<T>.  Hence the need for class
2025
// ThreadLocalValueHolderBase.
2026
class ThreadLocalValueHolderBase {
2027
 public:
2028
0
  virtual ~ThreadLocalValueHolderBase() {}
2029
};
2030
2031
// Called by pthread to delete thread-local data stored by
2032
// pthread_setspecific().
2033
0
extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
2034
0
  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
2035
0
}
2036
2037
// Implements thread-local storage on pthreads-based systems.
2038
template <typename T>
2039
class ThreadLocal {
2040
 public:
2041
  ThreadLocal()
2042
4
      : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
_ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEEC2Ev
Line
Count
Source
2042
2
      : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
_ZN7testing8internal11ThreadLocalIPNS_8SequenceEEC2Ev
Line
Count
Source
2042
2
      : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
2043
  explicit ThreadLocal(const T& value)
2044
      : key_(CreateKey()),
2045
2
        default_factory_(new InstanceValueHolderFactory(value)) {}
2046
2047
0
  ~ThreadLocal() {
2048
0
    // Destroys the managed object for the current thread, if any.
2049
0
    DeleteThreadLocalValue(pthread_getspecific(key_));
2050
0
2051
0
    // Releases resources associated with the key.  This will *not*
2052
0
    // delete managed objects for other threads.
2053
0
    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
2054
0
  }
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED2Ev
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEED2Ev
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_8SequenceEED2Ev
2055
2056
0
  T* pointer() { return GetOrCreateValue(); }
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE7pointerEv
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE7pointerEv
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv
2057
0
  const T* pointer() const { return GetOrCreateValue(); }
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE7pointerEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE7pointerEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv
2058
0
  const T& get() const { return *pointer(); }
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE3getEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE3getEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv
2059
0
  void set(const T& value) { *pointer() = value; }
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE3setERKS3_
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_8SequenceEE3setERKS3_
2060
2061
 private:
2062
  // Holds a value of type T.
2063
  class ValueHolder : public ThreadLocalValueHolderBase {
2064
   public:
2065
0
    ValueHolder() : value_() {}
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE11ValueHolderC2Ev
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_8SequenceEE11ValueHolderC2Ev
2066
0
    explicit ValueHolder(const T& value) : value_(value) {}
2067
2068
0
    T* pointer() { return &value_; }
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE11ValueHolder7pointerEv
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE11ValueHolder7pointerEv
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_8SequenceEE11ValueHolder7pointerEv
2069
2070
   private:
2071
    T value_;
2072
    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
2073
  };
2074
2075
6
  static pthread_key_t CreateKey() {
2076
6
    pthread_key_t key;
2077
6
    // When a thread exits, DeleteThreadLocalValue() will be called on
2078
6
    // the object managed for that thread.
2079
6
    GTEST_CHECK_POSIX_SUCCESS_(
2080
6
        pthread_key_create(&key, &DeleteThreadLocalValue));
2081
6
    return key;
2082
6
  }
_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE9CreateKeyEv
Line
Count
Source
2075
2
  static pthread_key_t CreateKey() {
2076
2
    pthread_key_t key;
2077
2
    // When a thread exits, DeleteThreadLocalValue() will be called on
2078
2
    // the object managed for that thread.
2079
2
    GTEST_CHECK_POSIX_SUCCESS_(
2080
2
        pthread_key_create(&key, &DeleteThreadLocalValue));
2081
2
    return key;
2082
2
  }
_ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE9CreateKeyEv
Line
Count
Source
2075
2
  static pthread_key_t CreateKey() {
2076
2
    pthread_key_t key;
2077
2
    // When a thread exits, DeleteThreadLocalValue() will be called on
2078
2
    // the object managed for that thread.
2079
2
    GTEST_CHECK_POSIX_SUCCESS_(
2080
2
        pthread_key_create(&key, &DeleteThreadLocalValue));
2081
2
    return key;
2082
2
  }
_ZN7testing8internal11ThreadLocalIPNS_8SequenceEE9CreateKeyEv
Line
Count
Source
2075
2
  static pthread_key_t CreateKey() {
2076
2
    pthread_key_t key;
2077
2
    // When a thread exits, DeleteThreadLocalValue() will be called on
2078
2
    // the object managed for that thread.
2079
2
    GTEST_CHECK_POSIX_SUCCESS_(
2080
2
        pthread_key_create(&key, &DeleteThreadLocalValue));
2081
2
    return key;
2082
2
  }
2083
2084
0
  T* GetOrCreateValue() const {
2085
0
    ThreadLocalValueHolderBase* const holder =
2086
0
        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
2087
0
    if (holder != NULL) {
2088
0
      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
2089
0
    }
2090
0
2091
0
    ValueHolder* const new_holder = default_factory_->MakeNewHolder();
2092
0
    ThreadLocalValueHolderBase* const holder_base = new_holder;
2093
0
    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
2094
0
    return new_holder->pointer();
2095
0
  }
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE16GetOrCreateValueEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE16GetOrCreateValueEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv
2096
2097
  class ValueHolderFactory {
2098
   public:
2099
6
    ValueHolderFactory() {}
_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE18ValueHolderFactoryC2Ev
Line
Count
Source
2099
2
    ValueHolderFactory() {}
_ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE18ValueHolderFactoryC2Ev
Line
Count
Source
2099
2
    ValueHolderFactory() {}
_ZN7testing8internal11ThreadLocalIPNS_8SequenceEE18ValueHolderFactoryC2Ev
Line
Count
Source
2099
2
    ValueHolderFactory() {}
2100
0
    virtual ~ValueHolderFactory() {}
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE18ValueHolderFactoryD2Ev
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE18ValueHolderFactoryD2Ev
Unexecuted instantiation: _ZN7testing8internal11ThreadLocalIPNS_8SequenceEE18ValueHolderFactoryD2Ev
2101
    virtual ValueHolder* MakeNewHolder() const = 0;
2102
2103
   private:
2104
    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
2105
  };
2106
2107
  class DefaultValueHolderFactory : public ValueHolderFactory {
2108
   public:
2109
4
    DefaultValueHolderFactory() {}
_ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE25DefaultValueHolderFactoryC2Ev
Line
Count
Source
2109
2
    DefaultValueHolderFactory() {}
_ZN7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactoryC2Ev
Line
Count
Source
2109
2
    DefaultValueHolderFactory() {}
2110
0
    virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEE25DefaultValueHolderFactory13MakeNewHolderEv
Unexecuted instantiation: _ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv
2111
2112
   private:
2113
    GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
2114
  };
2115
2116
  class InstanceValueHolderFactory : public ValueHolderFactory {
2117
   public:
2118
2
    explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
2119
0
    virtual ValueHolder* MakeNewHolder() const {
2120
0
      return new ValueHolder(value_);
2121
0
    }
2122
2123
   private:
2124
    const T value_;  // The value for each thread.
2125
2126
    GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
2127
  };
2128
2129
  // A key pthreads uses for looking up per-thread values.
2130
  const pthread_key_t key_;
2131
  scoped_ptr<ValueHolderFactory> default_factory_;
2132
2133
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
2134
};
2135
2136
# endif  // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
2137
2138
#else  // GTEST_IS_THREADSAFE
2139
2140
// A dummy implementation of synchronization primitives (mutex, lock,
2141
// and thread-local variable).  Necessary for compiling Google Test where
2142
// mutex is not supported - using Google Test in multiple threads is not
2143
// supported on such platforms.
2144
2145
class Mutex {
2146
 public:
2147
  Mutex() {}
2148
  void Lock() {}
2149
  void Unlock() {}
2150
  void AssertHeld() const {}
2151
};
2152
2153
# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
2154
  extern ::testing::internal::Mutex mutex
2155
2156
# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
2157
2158
// We cannot name this class MutexLock because the ctor declaration would
2159
// conflict with a macro named MutexLock, which is defined on some
2160
// platforms. That macro is used as a defensive measure to prevent against
2161
// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
2162
// "MutexLock l(&mu)".  Hence the typedef trick below.
2163
class GTestMutexLock {
2164
 public:
2165
  explicit GTestMutexLock(Mutex*) {}  // NOLINT
2166
};
2167
2168
typedef GTestMutexLock MutexLock;
2169
2170
template <typename T>
2171
class ThreadLocal {
2172
 public:
2173
  ThreadLocal() : value_() {}
2174
  explicit ThreadLocal(const T& value) : value_(value) {}
2175
  T* pointer() { return &value_; }
2176
  const T* pointer() const { return &value_; }
2177
  const T& get() const { return value_; }
2178
  void set(const T& value) { value_ = value; }
2179
 private:
2180
  T value_;
2181
};
2182
2183
#endif  // GTEST_IS_THREADSAFE
2184
2185
// Returns the number of threads running in the process, or 0 to indicate that
2186
// we cannot detect it.
2187
GTEST_API_ size_t GetThreadCount();
2188
2189
// Passing non-POD classes through ellipsis (...) crashes the ARM
2190
// compiler and generates a warning in Sun Studio.  The Nokia Symbian
2191
// and the IBM XL C/C++ compiler try to instantiate a copy constructor
2192
// for objects passed through ellipsis (...), failing for uncopyable
2193
// objects.  We define this to ensure that only POD is passed through
2194
// ellipsis on these systems.
2195
#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
2196
// We lose support for NULL detection where the compiler doesn't like
2197
// passing non-POD classes through ellipsis (...).
2198
# define GTEST_ELLIPSIS_NEEDS_POD_ 1
2199
#else
2200
# define GTEST_CAN_COMPARE_NULL 1
2201
#endif
2202
2203
// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
2204
// const T& and const T* in a function template.  These compilers
2205
// _can_ decide between class template specializations for T and T*,
2206
// so a tr1::type_traits-like is_pointer works.
2207
#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
2208
# define GTEST_NEEDS_IS_POINTER_ 1
2209
#endif
2210
2211
template <bool bool_value>
2212
struct bool_constant {
2213
  typedef bool_constant<bool_value> type;
2214
  static const bool value = bool_value;
2215
};
2216
template <bool bool_value> const bool bool_constant<bool_value>::value;
2217
2218
typedef bool_constant<false> false_type;
2219
typedef bool_constant<true> true_type;
2220
2221
template <typename T>
2222
struct is_pointer : public false_type {};
2223
2224
template <typename T>
2225
struct is_pointer<T*> : public true_type {};
2226
2227
template <typename Iterator>
2228
struct IteratorTraits {
2229
  typedef typename Iterator::value_type value_type;
2230
};
2231
2232
template <typename T>
2233
struct IteratorTraits<T*> {
2234
  typedef T value_type;
2235
};
2236
2237
template <typename T>
2238
struct IteratorTraits<const T*> {
2239
  typedef T value_type;
2240
};
2241
2242
#if GTEST_OS_WINDOWS
2243
# define GTEST_PATH_SEP_ "\\"
2244
# define GTEST_HAS_ALT_PATH_SEP_ 1
2245
// The biggest signed integer type the compiler supports.
2246
typedef __int64 BiggestInt;
2247
#else
2248
# define GTEST_PATH_SEP_ "/"
2249
# define GTEST_HAS_ALT_PATH_SEP_ 0
2250
typedef long long BiggestInt;  // NOLINT
2251
#endif  // GTEST_OS_WINDOWS
2252
2253
// Utilities for char.
2254
2255
// isspace(int ch) and friends accept an unsigned char or EOF.  char
2256
// may be signed, depending on the compiler (or compiler flags).
2257
// Therefore we need to cast a char to unsigned char before calling
2258
// isspace(), etc.
2259
2260
0
inline bool IsAlpha(char ch) {
2261
0
  return isalpha(static_cast<unsigned char>(ch)) != 0;
2262
0
}
2263
0
inline bool IsAlNum(char ch) {
2264
0
  return isalnum(static_cast<unsigned char>(ch)) != 0;
2265
0
}
2266
0
inline bool IsDigit(char ch) {
2267
0
  return isdigit(static_cast<unsigned char>(ch)) != 0;
2268
0
}
2269
0
inline bool IsLower(char ch) {
2270
0
  return islower(static_cast<unsigned char>(ch)) != 0;
2271
0
}
2272
0
inline bool IsSpace(char ch) {
2273
0
  return isspace(static_cast<unsigned char>(ch)) != 0;
2274
0
}
2275
0
inline bool IsUpper(char ch) {
2276
0
  return isupper(static_cast<unsigned char>(ch)) != 0;
2277
0
}
2278
0
inline bool IsXDigit(char ch) {
2279
0
  return isxdigit(static_cast<unsigned char>(ch)) != 0;
2280
0
}
2281
0
inline bool IsXDigit(wchar_t ch) {
2282
0
  const unsigned char low_byte = static_cast<unsigned char>(ch);
2283
0
  return ch == low_byte && isxdigit(low_byte) != 0;
2284
0
}
2285
2286
0
inline char ToLower(char ch) {
2287
0
  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
2288
0
}
2289
588
inline char ToUpper(char ch) {
2290
588
  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
2291
588
}
2292
2293
0
inline std::string StripTrailingSpaces(std::string str) {
2294
0
  std::string::iterator it = str.end();
2295
0
  while (it != str.begin() && IsSpace(*--it))
2296
0
    it = str.erase(it);
2297
0
  return str;
2298
0
}
2299
2300
// The testing::internal::posix namespace holds wrappers for common
2301
// POSIX functions.  These wrappers hide the differences between
2302
// Windows/MSVC and POSIX systems.  Since some compilers define these
2303
// standard functions as macros, the wrapper cannot have the same name
2304
// as the wrapped function.
2305
2306
namespace posix {
2307
2308
// Functions with a different name on Windows.
2309
2310
#if GTEST_OS_WINDOWS
2311
2312
typedef struct _stat StatStruct;
2313
2314
# ifdef __BORLANDC__
2315
inline int IsATTY(int fd) { return isatty(fd); }
2316
inline int StrCaseCmp(const char* s1, const char* s2) {
2317
  return stricmp(s1, s2);
2318
}
2319
inline char* StrDup(const char* src) { return strdup(src); }
2320
# else  // !__BORLANDC__
2321
#  if GTEST_OS_WINDOWS_MOBILE
2322
inline int IsATTY(int /* fd */) { return 0; }
2323
#  else
2324
inline int IsATTY(int fd) { return _isatty(fd); }
2325
#  endif  // GTEST_OS_WINDOWS_MOBILE
2326
inline int StrCaseCmp(const char* s1, const char* s2) {
2327
  return _stricmp(s1, s2);
2328
}
2329
inline char* StrDup(const char* src) { return _strdup(src); }
2330
# endif  // __BORLANDC__
2331
2332
# if GTEST_OS_WINDOWS_MOBILE
2333
inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
2334
// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
2335
// time and thus not defined there.
2336
# else
2337
inline int FileNo(FILE* file) { return _fileno(file); }
2338
inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
2339
inline int RmDir(const char* dir) { return _rmdir(dir); }
2340
inline bool IsDir(const StatStruct& st) {
2341
  return (_S_IFDIR & st.st_mode) != 0;
2342
}
2343
# endif  // GTEST_OS_WINDOWS_MOBILE
2344
2345
#else
2346
2347
typedef struct stat StatStruct;
2348
2349
2
inline int FileNo(FILE* file) { return fileno(file); }
2350
2
inline int IsATTY(int fd) { return isatty(fd); }
2351
0
inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
2352
2
inline int StrCaseCmp(const char* s1, const char* s2) {
2353
2
  return strcasecmp(s1, s2);
2354
2
}
2355
0
inline char* StrDup(const char* src) { return strdup(src); }
2356
0
inline int RmDir(const char* dir) { return rmdir(dir); }
2357
0
inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
2358
2359
#endif  // GTEST_OS_WINDOWS
2360
2361
// Functions deprecated by MSVC 8.0.
2362
2363
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */)
2364
2365
0
inline const char* StrNCpy(char* dest, const char* src, size_t n) {
2366
0
  return strncpy(dest, src, n);
2367
0
}
2368
2369
// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
2370
// StrError() aren't needed on Windows CE at this time and thus not
2371
// defined there.
2372
2373
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
2374
0
inline int ChDir(const char* dir) { return chdir(dir); }
2375
#endif
2376
0
inline FILE* FOpen(const char* path, const char* mode) {
2377
0
  return fopen(path, mode);
2378
0
}
2379
#if !GTEST_OS_WINDOWS_MOBILE
2380
0
inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
2381
0
  return freopen(path, mode, stream);
2382
0
}
2383
0
inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
2384
#endif
2385
0
inline int FClose(FILE* fp) { return fclose(fp); }
2386
#if !GTEST_OS_WINDOWS_MOBILE
2387
0
inline int Read(int fd, void* buf, unsigned int count) {
2388
0
  return static_cast<int>(read(fd, buf, count));
2389
0
}
2390
0
inline int Write(int fd, const void* buf, unsigned int count) {
2391
0
  return static_cast<int>(write(fd, buf, count));
2392
0
}
2393
0
inline int Close(int fd) { return close(fd); }
2394
0
inline const char* StrError(int errnum) { return strerror(errnum); }
2395
#endif
2396
48
inline const char* GetEnv(const char* name) {
2397
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE | GTEST_OS_WINDOWS_RT
2398
  // We are on Windows CE, which has no environment variables.
2399
  static_cast<void>(name);  // To prevent 'unused argument' warning.
2400
  return NULL;
2401
#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
2402
  // Environment variables which we programmatically clear will be set to the
2403
  // empty string rather than unset (NULL).  Handle that case.
2404
  const char* const env = getenv(name);
2405
  return (env != NULL && env[0] != '\0') ? env : NULL;
2406
#else
2407
  return getenv(name);
2408
48
#endif
2409
48
}
2410
2411
GTEST_DISABLE_MSC_WARNINGS_POP_()
2412
2413
#if GTEST_OS_WINDOWS_MOBILE
2414
// Windows CE has no C library. The abort() function is used in
2415
// several places in Google Test. This implementation provides a reasonable
2416
// imitation of standard behaviour.
2417
void Abort();
2418
#else
2419
0
inline void Abort() { abort(); }
2420
#endif  // GTEST_OS_WINDOWS_MOBILE
2421
2422
}  // namespace posix
2423
2424
// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
2425
// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
2426
// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
2427
// function in order to achieve that.  We use macro definition here because
2428
// snprintf is a variadic function.
2429
#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
2430
// MSVC 2005 and above support variadic macros.
2431
# define GTEST_SNPRINTF_(buffer, size, format, ...) \
2432
     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
2433
#elif defined(_MSC_VER)
2434
// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
2435
// complain about _snprintf.
2436
# define GTEST_SNPRINTF_ _snprintf
2437
#else
2438
0
# define GTEST_SNPRINTF_ snprintf
2439
#endif
2440
2441
// The maximum number a BiggestInt can represent.  This definition
2442
// works no matter BiggestInt is represented in one's complement or
2443
// two's complement.
2444
//
2445
// We cannot rely on numeric_limits in STL, as __int64 and long long
2446
// are not part of standard C++ and numeric_limits doesn't need to be
2447
// defined for them.
2448
const BiggestInt kMaxBiggestInt =
2449
    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
2450
2451
// This template class serves as a compile-time function from size to
2452
// type.  It maps a size in bytes to a primitive type with that
2453
// size. e.g.
2454
//
2455
//   TypeWithSize<4>::UInt
2456
//
2457
// is typedef-ed to be unsigned int (unsigned integer made up of 4
2458
// bytes).
2459
//
2460
// Such functionality should belong to STL, but I cannot find it
2461
// there.
2462
//
2463
// Google Test uses this class in the implementation of floating-point
2464
// comparison.
2465
//
2466
// For now it only handles UInt (unsigned int) as that's all Google Test
2467
// needs.  Other types can be easily added in the future if need
2468
// arises.
2469
template <size_t size>
2470
class TypeWithSize {
2471
 public:
2472
  // This prevents the user from using TypeWithSize<N> with incorrect
2473
  // values of N.
2474
  typedef void UInt;
2475
};
2476
2477
// The specialization for size 4.
2478
template <>
2479
class TypeWithSize<4> {
2480
 public:
2481
  // unsigned int has size 4 in both gcc and MSVC.
2482
  //
2483
  // As base/basictypes.h doesn't compile on Windows, we cannot use
2484
  // uint32, uint64, and etc here.
2485
  typedef int Int;
2486
  typedef unsigned int UInt;
2487
};
2488
2489
// The specialization for size 8.
2490
template <>
2491
class TypeWithSize<8> {
2492
 public:
2493
#if GTEST_OS_WINDOWS
2494
  typedef __int64 Int;
2495
  typedef unsigned __int64 UInt;
2496
#else
2497
  typedef long long Int;  // NOLINT
2498
  typedef unsigned long long UInt;  // NOLINT
2499
#endif  // GTEST_OS_WINDOWS
2500
};
2501
2502
// Integer types of known sizes.
2503
typedef TypeWithSize<4>::Int Int32;
2504
typedef TypeWithSize<4>::UInt UInt32;
2505
typedef TypeWithSize<8>::Int Int64;
2506
typedef TypeWithSize<8>::UInt UInt64;
2507
typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
2508
2509
// Utilities for command line flags and environment variables.
2510
2511
// Macro for referencing flags.
2512
#if !defined(GTEST_FLAG)
2513
5
# define GTEST_FLAG(name) FLAGS_gtest_##name
2514
#endif  // !defined(GTEST_FLAG)
2515
2516
#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
2517
# define GTEST_USE_OWN_FLAGFILE_FLAG_ 1
2518
#endif  // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
2519
2520
#if !defined(GTEST_DECLARE_bool_)
2521
# define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver
2522
2523
// Macros for declaring flags.
2524
# define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
2525
# define GTEST_DECLARE_int32_(name) \
2526
    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
2527
#define GTEST_DECLARE_string_(name) \
2528
    GTEST_API_ extern ::std::string GTEST_FLAG(name)
2529
2530
// Macros for defining flags.
2531
#define GTEST_DEFINE_bool_(name, default_val, doc) \
2532
    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
2533
#define GTEST_DEFINE_int32_(name, default_val, doc) \
2534
    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
2535
#define GTEST_DEFINE_string_(name, default_val, doc) \
2536
    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
2537
2538
#endif  // !defined(GTEST_DECLARE_bool_)
2539
2540
// Thread annotations
2541
#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
2542
# define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
2543
# define GTEST_LOCK_EXCLUDED_(locks)
2544
#endif  // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
2545
2546
// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
2547
// to *value and returns true; otherwise leaves *value unchanged and returns
2548
// false.
2549
// TODO(chandlerc): Find a better way to refactor flag and environment parsing
2550
// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
2551
// function.
2552
bool ParseInt32(const Message& src_text, const char* str, Int32* value);
2553
2554
// Parses a bool/Int32/string from the environment variable
2555
// corresponding to the given Google Test flag.
2556
bool BoolFromGTestEnv(const char* flag, bool default_val);
2557
GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
2558
std::string StringFromGTestEnv(const char* flag, const char* default_val);
2559
2560
}  // namespace internal
2561
}  // namespace testing
2562
2563
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_