cppjieba_rb 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +26 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +81 -0
  8. data/Rakefile +20 -0
  9. data/cppjieba_rb.gemspec +50 -0
  10. data/ext/cppjieba/.gitignore +17 -0
  11. data/ext/cppjieba/.travis.yml +22 -0
  12. data/ext/cppjieba/CMakeLists.txt +28 -0
  13. data/ext/cppjieba/ChangeLog.md +236 -0
  14. data/ext/cppjieba/README.md +285 -0
  15. data/ext/cppjieba/README_EN.md +111 -0
  16. data/ext/cppjieba/appveyor.yml +32 -0
  17. data/ext/cppjieba/deps/CMakeLists.txt +1 -0
  18. data/ext/cppjieba/deps/gtest/CMakeLists.txt +5 -0
  19. data/ext/cppjieba/deps/gtest/include/gtest/gtest-death-test.h +283 -0
  20. data/ext/cppjieba/deps/gtest/include/gtest/gtest-message.h +230 -0
  21. data/ext/cppjieba/deps/gtest/include/gtest/gtest-param-test.h +1421 -0
  22. data/ext/cppjieba/deps/gtest/include/gtest/gtest-param-test.h.pump +487 -0
  23. data/ext/cppjieba/deps/gtest/include/gtest/gtest-printers.h +796 -0
  24. data/ext/cppjieba/deps/gtest/include/gtest/gtest-spi.h +232 -0
  25. data/ext/cppjieba/deps/gtest/include/gtest/gtest-test-part.h +176 -0
  26. data/ext/cppjieba/deps/gtest/include/gtest/gtest-typed-test.h +259 -0
  27. data/ext/cppjieba/deps/gtest/include/gtest/gtest.h +2155 -0
  28. data/ext/cppjieba/deps/gtest/include/gtest/gtest_pred_impl.h +358 -0
  29. data/ext/cppjieba/deps/gtest/include/gtest/gtest_prod.h +58 -0
  30. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-death-test-internal.h +308 -0
  31. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-filepath.h +210 -0
  32. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-internal.h +1226 -0
  33. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-linked_ptr.h +233 -0
  34. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-param-util-generated.h +4822 -0
  35. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  36. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-param-util.h +619 -0
  37. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-port.h +1788 -0
  38. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-string.h +350 -0
  39. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-tuple.h +968 -0
  40. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-tuple.h.pump +336 -0
  41. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-type-util.h +3330 -0
  42. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-type-util.h.pump +296 -0
  43. data/ext/cppjieba/deps/gtest/src/.deps/.dirstamp +0 -0
  44. data/ext/cppjieba/deps/gtest/src/.deps/gtest-all.Plo +681 -0
  45. data/ext/cppjieba/deps/gtest/src/.deps/gtest_main.Plo +509 -0
  46. data/ext/cppjieba/deps/gtest/src/.dirstamp +0 -0
  47. data/ext/cppjieba/deps/gtest/src/gtest-all.cc +48 -0
  48. data/ext/cppjieba/deps/gtest/src/gtest-death-test.cc +1234 -0
  49. data/ext/cppjieba/deps/gtest/src/gtest-filepath.cc +380 -0
  50. data/ext/cppjieba/deps/gtest/src/gtest-internal-inl.h +1038 -0
  51. data/ext/cppjieba/deps/gtest/src/gtest-port.cc +746 -0
  52. data/ext/cppjieba/deps/gtest/src/gtest-printers.cc +356 -0
  53. data/ext/cppjieba/deps/gtest/src/gtest-test-part.cc +110 -0
  54. data/ext/cppjieba/deps/gtest/src/gtest-typed-test.cc +110 -0
  55. data/ext/cppjieba/deps/gtest/src/gtest.cc +4898 -0
  56. data/ext/cppjieba/deps/gtest/src/gtest_main.cc +39 -0
  57. data/ext/cppjieba/deps/limonp/ArgvContext.hpp +70 -0
  58. data/ext/cppjieba/deps/limonp/BlockingQueue.hpp +49 -0
  59. data/ext/cppjieba/deps/limonp/BoundedBlockingQueue.hpp +67 -0
  60. data/ext/cppjieba/deps/limonp/BoundedQueue.hpp +65 -0
  61. data/ext/cppjieba/deps/limonp/Closure.hpp +206 -0
  62. data/ext/cppjieba/deps/limonp/Colors.hpp +31 -0
  63. data/ext/cppjieba/deps/limonp/Condition.hpp +38 -0
  64. data/ext/cppjieba/deps/limonp/Config.hpp +103 -0
  65. data/ext/cppjieba/deps/limonp/FileLock.hpp +74 -0
  66. data/ext/cppjieba/deps/limonp/ForcePublic.hpp +7 -0
  67. data/ext/cppjieba/deps/limonp/LocalVector.hpp +139 -0
  68. data/ext/cppjieba/deps/limonp/Logging.hpp +76 -0
  69. data/ext/cppjieba/deps/limonp/Md5.hpp +411 -0
  70. data/ext/cppjieba/deps/limonp/MutexLock.hpp +51 -0
  71. data/ext/cppjieba/deps/limonp/NonCopyable.hpp +21 -0
  72. data/ext/cppjieba/deps/limonp/StdExtension.hpp +159 -0
  73. data/ext/cppjieba/deps/limonp/StringUtil.hpp +365 -0
  74. data/ext/cppjieba/deps/limonp/Thread.hpp +44 -0
  75. data/ext/cppjieba/deps/limonp/ThreadPool.hpp +86 -0
  76. data/ext/cppjieba/dict/README.md +31 -0
  77. data/ext/cppjieba/dict/hmm_model.utf8 +34 -0
  78. data/ext/cppjieba/dict/idf.utf8 +258826 -0
  79. data/ext/cppjieba/dict/jieba.dict.utf8 +348982 -0
  80. data/ext/cppjieba/dict/pos_dict/char_state_tab.utf8 +6653 -0
  81. data/ext/cppjieba/dict/pos_dict/prob_emit.utf8 +166 -0
  82. data/ext/cppjieba/dict/pos_dict/prob_start.utf8 +259 -0
  83. data/ext/cppjieba/dict/pos_dict/prob_trans.utf8 +5222 -0
  84. data/ext/cppjieba/dict/stop_words.utf8 +1534 -0
  85. data/ext/cppjieba/dict/user.dict.utf8 +4 -0
  86. data/ext/cppjieba/include/cppjieba/DictTrie.hpp +227 -0
  87. data/ext/cppjieba/include/cppjieba/FullSegment.hpp +93 -0
  88. data/ext/cppjieba/include/cppjieba/HMMModel.hpp +129 -0
  89. data/ext/cppjieba/include/cppjieba/HMMSegment.hpp +190 -0
  90. data/ext/cppjieba/include/cppjieba/Jieba.hpp +108 -0
  91. data/ext/cppjieba/include/cppjieba/KeywordExtractor.hpp +153 -0
  92. data/ext/cppjieba/include/cppjieba/MPSegment.hpp +137 -0
  93. data/ext/cppjieba/include/cppjieba/MixSegment.hpp +109 -0
  94. data/ext/cppjieba/include/cppjieba/PosTagger.hpp +77 -0
  95. data/ext/cppjieba/include/cppjieba/PreFilter.hpp +54 -0
  96. data/ext/cppjieba/include/cppjieba/QuerySegment.hpp +90 -0
  97. data/ext/cppjieba/include/cppjieba/SegmentBase.hpp +46 -0
  98. data/ext/cppjieba/include/cppjieba/SegmentTagged.hpp +23 -0
  99. data/ext/cppjieba/include/cppjieba/TextRankExtractor.hpp +190 -0
  100. data/ext/cppjieba/include/cppjieba/Trie.hpp +174 -0
  101. data/ext/cppjieba/include/cppjieba/Unicode.hpp +215 -0
  102. data/ext/cppjieba/test/CMakeLists.txt +5 -0
  103. data/ext/cppjieba/test/demo.cpp +80 -0
  104. data/ext/cppjieba/test/load_test.cpp +54 -0
  105. data/ext/cppjieba/test/testdata/curl.res +1 -0
  106. data/ext/cppjieba/test/testdata/extra_dict/jieba.dict.small.utf8 +109750 -0
  107. data/ext/cppjieba/test/testdata/gbk_dict/hmm_model.gbk +34 -0
  108. data/ext/cppjieba/test/testdata/gbk_dict/jieba.dict.gbk +348982 -0
  109. data/ext/cppjieba/test/testdata/jieba.dict.0.1.utf8 +93 -0
  110. data/ext/cppjieba/test/testdata/jieba.dict.0.utf8 +93 -0
  111. data/ext/cppjieba/test/testdata/jieba.dict.1.utf8 +67 -0
  112. data/ext/cppjieba/test/testdata/jieba.dict.2.utf8 +64 -0
  113. data/ext/cppjieba/test/testdata/load_test.urls +2 -0
  114. data/ext/cppjieba/test/testdata/review.100 +100 -0
  115. data/ext/cppjieba/test/testdata/review.100.res +200 -0
  116. data/ext/cppjieba/test/testdata/server.conf +19 -0
  117. data/ext/cppjieba/test/testdata/testlines.gbk +9 -0
  118. data/ext/cppjieba/test/testdata/testlines.utf8 +8 -0
  119. data/ext/cppjieba/test/testdata/userdict.2.utf8 +1 -0
  120. data/ext/cppjieba/test/testdata/userdict.english +2 -0
  121. data/ext/cppjieba/test/testdata/userdict.utf8 +8 -0
  122. data/ext/cppjieba/test/testdata/weicheng.utf8 +247 -0
  123. data/ext/cppjieba/test/unittest/CMakeLists.txt +24 -0
  124. data/ext/cppjieba/test/unittest/gtest_main.cpp +39 -0
  125. data/ext/cppjieba/test/unittest/jieba_test.cpp +133 -0
  126. data/ext/cppjieba/test/unittest/keyword_extractor_test.cpp +79 -0
  127. data/ext/cppjieba/test/unittest/pos_tagger_test.cpp +41 -0
  128. data/ext/cppjieba/test/unittest/pre_filter_test.cpp +43 -0
  129. data/ext/cppjieba/test/unittest/segments_test.cpp +256 -0
  130. data/ext/cppjieba/test/unittest/textrank_test.cpp +86 -0
  131. data/ext/cppjieba/test/unittest/trie_test.cpp +177 -0
  132. data/ext/cppjieba/test/unittest/unicode_test.cpp +43 -0
  133. data/ext/cppjieba_rb/cppjieba_rb.c +10 -0
  134. data/ext/cppjieba_rb/extconf.rb +26 -0
  135. data/ext/cppjieba_rb/internal.cc +148 -0
  136. data/lib/cppjieba_rb/segment.rb +20 -0
  137. data/lib/cppjieba_rb/version.rb +3 -0
  138. data/lib/cppjieba_rb.rb +34 -0
  139. data/test/test_keyword.rb +17 -0
  140. data/test/test_segment.rb +24 -0
  141. data/test/test_tagging.rb +19 -0
  142. metadata +244 -0
@@ -0,0 +1,1788 @@
1
+ // Copyright 2005, Google Inc.
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are
6
+ // met:
7
+ //
8
+ // * Redistributions of source code must retain the above copyright
9
+ // notice, this list of conditions and the following disclaimer.
10
+ // * Redistributions in binary form must reproduce the above
11
+ // copyright notice, this list of conditions and the following disclaimer
12
+ // in the documentation and/or other materials provided with the
13
+ // distribution.
14
+ // * Neither the name of Google Inc. nor the names of its
15
+ // contributors may be used to endorse or promote products derived from
16
+ // this software without specific prior written permission.
17
+ //
18
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ //
30
+ // Authors: wan@google.com (Zhanyong Wan)
31
+ //
32
+ // Low-level types and utilities for porting Google Test to various
33
+ // platforms. They are subject to change without notice. DO NOT USE
34
+ // THEM IN USER CODE.
35
+
36
+ #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
37
+ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
38
+
39
+ // The user can define the following macros in the build script to
40
+ // control Google Test's behavior. If the user doesn't define a macro
41
+ // in this list, Google Test will define it.
42
+ //
43
+ // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
44
+ // is/isn't available.
45
+ // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
46
+ // are enabled.
47
+ // GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
48
+ // is/isn't available (some systems define
49
+ // ::string, which is different to std::string).
50
+ // GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
51
+ // is/isn't available (some systems define
52
+ // ::wstring, which is different to std::wstring).
53
+ // GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
54
+ // expressions are/aren't available.
55
+ // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
56
+ // is/isn't available.
57
+ // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
58
+ // enabled.
59
+ // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
60
+ // std::wstring does/doesn't work (Google Test can
61
+ // be used where std::wstring is unavailable).
62
+ // GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
63
+ // is/isn't available.
64
+ // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
65
+ // compiler supports Microsoft's "Structured
66
+ // Exception Handling".
67
+ // GTEST_HAS_STREAM_REDIRECTION
68
+ // - Define it to 1/0 to indicate whether the
69
+ // platform supports I/O stream redirection using
70
+ // dup() and dup2().
71
+ // GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
72
+ // Test's own tr1 tuple implementation should be
73
+ // used. Unused when the user sets
74
+ // GTEST_HAS_TR1_TUPLE to 0.
75
+ // GTEST_LINKED_AS_SHARED_LIBRARY
76
+ // - Define to 1 when compiling tests that use
77
+ // Google Test as a shared library (known as
78
+ // DLL on Windows).
79
+ // GTEST_CREATE_SHARED_LIBRARY
80
+ // - Define to 1 when compiling Google Test itself
81
+ // as a shared library.
82
+
83
+ // This header defines the following utilities:
84
+ //
85
+ // Macros indicating the current platform (defined to 1 if compiled on
86
+ // the given platform; otherwise undefined):
87
+ // GTEST_OS_AIX - IBM AIX
88
+ // GTEST_OS_CYGWIN - Cygwin
89
+ // GTEST_OS_HPUX - HP-UX
90
+ // GTEST_OS_LINUX - Linux
91
+ // GTEST_OS_LINUX_ANDROID - Google Android
92
+ // GTEST_OS_MAC - Mac OS X
93
+ // GTEST_OS_NACL - Google Native Client (NaCl)
94
+ // GTEST_OS_SOLARIS - Sun Solaris
95
+ // GTEST_OS_SYMBIAN - Symbian
96
+ // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
97
+ // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
98
+ // GTEST_OS_WINDOWS_MINGW - MinGW
99
+ // GTEST_OS_WINDOWS_MOBILE - Windows Mobile
100
+ // GTEST_OS_ZOS - z/OS
101
+ //
102
+ // Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
103
+ // most stable support. Since core members of the Google Test project
104
+ // don't have access to other platforms, support for them may be less
105
+ // stable. If you notice any problems on your platform, please notify
106
+ // googletestframework@googlegroups.com (patches for fixing them are
107
+ // even more welcome!).
108
+ //
109
+ // Note that it is possible that none of the GTEST_OS_* macros are defined.
110
+ //
111
+ // Macros indicating available Google Test features (defined to 1 if
112
+ // the corresponding feature is supported; otherwise undefined):
113
+ // GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
114
+ // tests)
115
+ // GTEST_HAS_DEATH_TEST - death tests
116
+ // GTEST_HAS_PARAM_TEST - value-parameterized tests
117
+ // GTEST_HAS_TYPED_TEST - typed tests
118
+ // GTEST_HAS_TYPED_TEST_P - type-parameterized tests
119
+ // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
120
+ // GTEST_HAS_POSIX_RE (see above) which users can
121
+ // define themselves.
122
+ // GTEST_USES_SIMPLE_RE - our own simple regex is used;
123
+ // the above two are mutually exclusive.
124
+ // GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
125
+ //
126
+ // Macros for basic C++ coding:
127
+ // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
128
+ // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
129
+ // variable don't have to be used.
130
+ // GTEST_DISALLOW_ASSIGN_ - disables operator=.
131
+ // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
132
+ // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
133
+ //
134
+ // Synchronization:
135
+ // Mutex, MutexLock, ThreadLocal, GetThreadCount()
136
+ // - synchronization primitives.
137
+ // GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
138
+ // synchronization primitives have real implementations
139
+ // and Google Test is thread-safe; or 0 otherwise.
140
+ //
141
+ // Template meta programming:
142
+ // is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
143
+ // IteratorTraits - partial implementation of std::iterator_traits, which
144
+ // is not available in libCstd when compiled with Sun C++.
145
+ //
146
+ // Smart pointers:
147
+ // scoped_ptr - as in TR2.
148
+ //
149
+ // Regular expressions:
150
+ // RE - a simple regular expression class using the POSIX
151
+ // Extended Regular Expression syntax on UNIX-like
152
+ // platforms, or a reduced regular exception syntax on
153
+ // other platforms, including Windows.
154
+ //
155
+ // Logging:
156
+ // GTEST_LOG_() - logs messages at the specified severity level.
157
+ // LogToStderr() - directs all log messages to stderr.
158
+ // FlushInfoLog() - flushes informational log messages.
159
+ //
160
+ // Stdout and stderr capturing:
161
+ // CaptureStdout() - starts capturing stdout.
162
+ // GetCapturedStdout() - stops capturing stdout and returns the captured
163
+ // string.
164
+ // CaptureStderr() - starts capturing stderr.
165
+ // GetCapturedStderr() - stops capturing stderr and returns the captured
166
+ // string.
167
+ //
168
+ // Integer types:
169
+ // TypeWithSize - maps an integer to a int type.
170
+ // Int32, UInt32, Int64, UInt64, TimeInMillis
171
+ // - integers of known sizes.
172
+ // BiggestInt - the biggest signed integer type.
173
+ //
174
+ // Command-line utilities:
175
+ // GTEST_FLAG() - references a flag.
176
+ // GTEST_DECLARE_*() - declares a flag.
177
+ // GTEST_DEFINE_*() - defines a flag.
178
+ // GetArgvs() - returns the command line as a vector of strings.
179
+ //
180
+ // Environment variable utilities:
181
+ // GetEnv() - gets the value of an environment variable.
182
+ // BoolFromGTestEnv() - parses a bool environment variable.
183
+ // Int32FromGTestEnv() - parses an Int32 environment variable.
184
+ // StringFromGTestEnv() - parses a string environment variable.
185
+
186
+ #include <ctype.h> // for isspace, etc
187
+ #include <stddef.h> // for ptrdiff_t
188
+ #include <stdlib.h>
189
+ #include <stdio.h>
190
+ #include <string.h>
191
+ #ifndef _WIN32_WCE
192
+ # include <sys/types.h>
193
+ # include <sys/stat.h>
194
+ #endif // !_WIN32_WCE
195
+
196
+ #include <iostream> // NOLINT
197
+ #include <sstream> // NOLINT
198
+ #include <string> // NOLINT
199
+
200
+ #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
201
+ #define GTEST_FLAG_PREFIX_ "gtest_"
202
+ #define GTEST_FLAG_PREFIX_DASH_ "gtest-"
203
+ #define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
204
+ #define GTEST_NAME_ "Google Test"
205
+ #define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
206
+
207
+ // Determines the version of gcc that is used to compile this.
208
+ #ifdef __GNUC__
209
+ // 40302 means version 4.3.2.
210
+ # define GTEST_GCC_VER_ \
211
+ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
212
+ #endif // __GNUC__
213
+
214
+ // Determines the platform on which Google Test is compiled.
215
+ #ifdef __CYGWIN__
216
+ # define GTEST_OS_CYGWIN 1
217
+ #elif defined __SYMBIAN32__
218
+ # define GTEST_OS_SYMBIAN 1
219
+ #elif defined _WIN32
220
+ # define GTEST_OS_WINDOWS 1
221
+ # ifdef _WIN32_WCE
222
+ # define GTEST_OS_WINDOWS_MOBILE 1
223
+ # elif defined(__MINGW__) || defined(__MINGW32__)
224
+ # define GTEST_OS_WINDOWS_MINGW 1
225
+ # else
226
+ # define GTEST_OS_WINDOWS_DESKTOP 1
227
+ # endif // _WIN32_WCE
228
+ #elif defined __APPLE__
229
+ # define GTEST_OS_MAC 1
230
+ #elif defined __linux__
231
+ # define GTEST_OS_LINUX 1
232
+ # ifdef ANDROID
233
+ # define GTEST_OS_LINUX_ANDROID 1
234
+ # endif // ANDROID
235
+ #elif defined __MVS__
236
+ # define GTEST_OS_ZOS 1
237
+ #elif defined(__sun) && defined(__SVR4)
238
+ # define GTEST_OS_SOLARIS 1
239
+ #elif defined(_AIX)
240
+ # define GTEST_OS_AIX 1
241
+ #elif defined(__hpux)
242
+ # define GTEST_OS_HPUX 1
243
+ #elif defined __native_client__
244
+ # define GTEST_OS_NACL 1
245
+ #endif // __CYGWIN__
246
+
247
+ // Brings in definitions for functions used in the testing::internal::posix
248
+ // namespace (read, write, close, chdir, isatty, stat). We do not currently
249
+ // use them on Windows Mobile.
250
+ #if !GTEST_OS_WINDOWS
251
+ // This assumes that non-Windows OSes provide unistd.h. For OSes where this
252
+ // is not the case, we need to include headers that provide the functions
253
+ // mentioned above.
254
+ # include <unistd.h>
255
+ # if !GTEST_OS_NACL
256
+ // TODO(vladl@google.com): Remove this condition when Native Client SDK adds
257
+ // strings.h (tracked in
258
+ // http://code.google.com/p/nativeclient/issues/detail?id=1175).
259
+ # include <strings.h> // Native Client doesn't provide strings.h.
260
+ # endif
261
+ #elif !GTEST_OS_WINDOWS_MOBILE
262
+ # include <direct.h>
263
+ # include <io.h>
264
+ #endif
265
+
266
+ // Defines this to true iff Google Test can use POSIX regular expressions.
267
+ #ifndef GTEST_HAS_POSIX_RE
268
+ # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
269
+ #endif
270
+
271
+ #if GTEST_HAS_POSIX_RE
272
+
273
+ // On some platforms, <regex.h> needs someone to define size_t, and
274
+ // won't compile otherwise. We can #include it here as we already
275
+ // included <stdlib.h>, which is guaranteed to define size_t through
276
+ // <stddef.h>.
277
+ # include <regex.h> // NOLINT
278
+
279
+ # define GTEST_USES_POSIX_RE 1
280
+
281
+ #elif GTEST_OS_WINDOWS
282
+
283
+ // <regex.h> is not available on Windows. Use our own simple regex
284
+ // implementation instead.
285
+ # define GTEST_USES_SIMPLE_RE 1
286
+
287
+ #else
288
+
289
+ // <regex.h> may not be available on this platform. Use our own
290
+ // simple regex implementation instead.
291
+ # define GTEST_USES_SIMPLE_RE 1
292
+
293
+ #endif // GTEST_HAS_POSIX_RE
294
+
295
+ #ifndef GTEST_HAS_EXCEPTIONS
296
+ // The user didn't tell us whether exceptions are enabled, so we need
297
+ // to figure it out.
298
+ # if defined(_MSC_VER) || defined(__BORLANDC__)
299
+ // MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
300
+ // macro to enable exceptions, so we'll do the same.
301
+ // Assumes that exceptions are enabled by default.
302
+ # ifndef _HAS_EXCEPTIONS
303
+ # define _HAS_EXCEPTIONS 1
304
+ # endif // _HAS_EXCEPTIONS
305
+ # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
306
+ # elif defined(__GNUC__) && __EXCEPTIONS
307
+ // gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
308
+ # define GTEST_HAS_EXCEPTIONS 1
309
+ # elif defined(__SUNPRO_CC)
310
+ // Sun Pro CC supports exceptions. However, there is no compile-time way of
311
+ // detecting whether they are enabled or not. Therefore, we assume that
312
+ // they are enabled unless the user tells us otherwise.
313
+ # define GTEST_HAS_EXCEPTIONS 1
314
+ # elif defined(__IBMCPP__) && __EXCEPTIONS
315
+ // xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
316
+ # define GTEST_HAS_EXCEPTIONS 1
317
+ # elif defined(__HP_aCC)
318
+ // Exception handling is in effect by default in HP aCC compiler. It has to
319
+ // be turned of by +noeh compiler option if desired.
320
+ # define GTEST_HAS_EXCEPTIONS 1
321
+ # else
322
+ // For other compilers, we assume exceptions are disabled to be
323
+ // conservative.
324
+ # define GTEST_HAS_EXCEPTIONS 0
325
+ # endif // defined(_MSC_VER) || defined(__BORLANDC__)
326
+ #endif // GTEST_HAS_EXCEPTIONS
327
+
328
+ #if !defined(GTEST_HAS_STD_STRING)
329
+ // Even though we don't use this macro any longer, we keep it in case
330
+ // some clients still depend on it.
331
+ # define GTEST_HAS_STD_STRING 1
332
+ #elif !GTEST_HAS_STD_STRING
333
+ // The user told us that ::std::string isn't available.
334
+ # error "Google Test cannot be used where ::std::string isn't available."
335
+ #endif // !defined(GTEST_HAS_STD_STRING)
336
+
337
+ #ifndef GTEST_HAS_GLOBAL_STRING
338
+ // The user didn't tell us whether ::string is available, so we need
339
+ // to figure it out.
340
+
341
+ # define GTEST_HAS_GLOBAL_STRING 0
342
+
343
+ #endif // GTEST_HAS_GLOBAL_STRING
344
+
345
+ #ifndef GTEST_HAS_STD_WSTRING
346
+ // The user didn't tell us whether ::std::wstring is available, so we need
347
+ // to figure it out.
348
+ // TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
349
+ // is available.
350
+
351
+ // Cygwin 1.7 and below doesn't support ::std::wstring.
352
+ // Solaris' libc++ doesn't support it either. Android has
353
+ // no support for it at least as recent as Froyo (2.2).
354
+ # define GTEST_HAS_STD_WSTRING \
355
+ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
356
+
357
+ #endif // GTEST_HAS_STD_WSTRING
358
+
359
+ #ifndef GTEST_HAS_GLOBAL_WSTRING
360
+ // The user didn't tell us whether ::wstring is available, so we need
361
+ // to figure it out.
362
+ # define GTEST_HAS_GLOBAL_WSTRING \
363
+ (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
364
+ #endif // GTEST_HAS_GLOBAL_WSTRING
365
+
366
+ // Determines whether RTTI is available.
367
+ #ifndef GTEST_HAS_RTTI
368
+ // The user didn't tell us whether RTTI is enabled, so we need to
369
+ // figure it out.
370
+
371
+ # ifdef _MSC_VER
372
+
373
+ # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
374
+ # define GTEST_HAS_RTTI 1
375
+ # else
376
+ # define GTEST_HAS_RTTI 0
377
+ # endif
378
+
379
+ // Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
380
+ # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
381
+
382
+ # ifdef __GXX_RTTI
383
+ # define GTEST_HAS_RTTI 1
384
+ # else
385
+ # define GTEST_HAS_RTTI 0
386
+ # endif // __GXX_RTTI
387
+
388
+ // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
389
+ // both the typeid and dynamic_cast features are present.
390
+ # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
391
+
392
+ # ifdef __RTTI_ALL__
393
+ # define GTEST_HAS_RTTI 1
394
+ # else
395
+ # define GTEST_HAS_RTTI 0
396
+ # endif
397
+
398
+ # else
399
+
400
+ // For all other compilers, we assume RTTI is enabled.
401
+ # define GTEST_HAS_RTTI 1
402
+
403
+ # endif // _MSC_VER
404
+
405
+ #endif // GTEST_HAS_RTTI
406
+
407
+ // It's this header's responsibility to #include <typeinfo> when RTTI
408
+ // is enabled.
409
+ #if GTEST_HAS_RTTI
410
+ # include <typeinfo>
411
+ #endif
412
+
413
+ // Determines whether Google Test can use the pthreads library.
414
+ #ifndef GTEST_HAS_PTHREAD
415
+ // The user didn't tell us explicitly, so we assume pthreads support is
416
+ // available on Linux and Mac.
417
+ //
418
+ // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
419
+ // to your compiler flags.
420
+ # define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)
421
+ #endif // GTEST_HAS_PTHREAD
422
+
423
+ #if GTEST_HAS_PTHREAD
424
+ // gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
425
+ // true.
426
+ # include <pthread.h> // NOLINT
427
+
428
+ // For timespec and nanosleep, used below.
429
+ # include <time.h> // NOLINT
430
+ #endif
431
+
432
+ // Determines whether Google Test can use tr1/tuple. You can define
433
+ // this macro to 0 to prevent Google Test from using tuple (any
434
+ // feature depending on tuple with be disabled in this mode).
435
+ #ifndef GTEST_HAS_TR1_TUPLE
436
+ // The user didn't tell us not to do it, so we assume it's OK.
437
+ # define GTEST_HAS_TR1_TUPLE 1
438
+ #endif // GTEST_HAS_TR1_TUPLE
439
+
440
+ // Determines whether Google Test's own tr1 tuple implementation
441
+ // should be used.
442
+ #ifndef GTEST_USE_OWN_TR1_TUPLE
443
+ // The user didn't tell us, so we need to figure it out.
444
+
445
+ // We use our own TR1 tuple if we aren't sure the user has an
446
+ // implementation of it already. At this time, GCC 4.0.0+ and MSVC
447
+ // 2010 are the only mainstream compilers that come with a TR1 tuple
448
+ // implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by
449
+ // defining __GNUC__ and friends, but cannot compile GCC's tuple
450
+ // implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
451
+ // Feature Pack download, which we cannot assume the user has.
452
+ # if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \
453
+ || _MSC_VER >= 1600
454
+ # define GTEST_USE_OWN_TR1_TUPLE 0
455
+ # else
456
+ # define GTEST_USE_OWN_TR1_TUPLE 1
457
+ # endif
458
+
459
+ #endif // GTEST_USE_OWN_TR1_TUPLE
460
+
461
+ // To avoid conditional compilation everywhere, we make it
462
+ // gtest-port.h's responsibility to #include the header implementing
463
+ // tr1/tuple.
464
+ #if GTEST_HAS_TR1_TUPLE
465
+
466
+ # if GTEST_USE_OWN_TR1_TUPLE
467
+ # include "gtest/internal/gtest-tuple.h"
468
+ # elif GTEST_OS_SYMBIAN
469
+
470
+ // On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
471
+ // use STLport's tuple implementation, which unfortunately doesn't
472
+ // work as the copy of STLport distributed with Symbian is incomplete.
473
+ // By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
474
+ // use its own tuple implementation.
475
+ # ifdef BOOST_HAS_TR1_TUPLE
476
+ # undef BOOST_HAS_TR1_TUPLE
477
+ # endif // BOOST_HAS_TR1_TUPLE
478
+
479
+ // This prevents <boost/tr1/detail/config.hpp>, which defines
480
+ // BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
481
+ # define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
482
+ # include <tuple>
483
+
484
+ # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
485
+ // GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
486
+ // not conform to the TR1 spec, which requires the header to be <tuple>.
487
+
488
+ # if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
489
+ // Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
490
+ // which is #included by <tr1/tuple>, to not compile when RTTI is
491
+ // disabled. _TR1_FUNCTIONAL is the header guard for
492
+ // <tr1/functional>. Hence the following #define is a hack to prevent
493
+ // <tr1/functional> from being included.
494
+ # define _TR1_FUNCTIONAL 1
495
+ # include <tr1/tuple>
496
+ # undef _TR1_FUNCTIONAL // Allows the user to #include
497
+ // <tr1/functional> if he chooses to.
498
+ # else
499
+ # if defined (__cplusplus) && __cplusplus > 199711L
500
+ # include <tuple>
501
+ namespace std {
502
+ namespace tr1 {
503
+ using std::tuple;
504
+ using std::tuple_element;
505
+ using std::get;
506
+ using std::tuple_size;
507
+ using std::make_tuple;
508
+ }
509
+ }
510
+ # else
511
+ # include <tr1/tuple> // NOLINT
512
+ # endif
513
+ # endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
514
+
515
+ # else
516
+ // If the compiler is not GCC 4.0+, we assume the user is using a
517
+ // spec-conforming TR1 implementation.
518
+ # include <tuple> // NOLINT
519
+ # endif // GTEST_USE_OWN_TR1_TUPLE
520
+
521
+ #endif // GTEST_HAS_TR1_TUPLE
522
+
523
+ // Determines whether clone(2) is supported.
524
+ // Usually it will only be available on Linux, excluding
525
+ // Linux on the Itanium architecture.
526
+ // Also see http://linux.die.net/man/2/clone.
527
+ #ifndef GTEST_HAS_CLONE
528
+ // The user didn't tell us, so we need to figure it out.
529
+
530
+ # if GTEST_OS_LINUX && !defined(__ia64__)
531
+ # define GTEST_HAS_CLONE 1
532
+ # else
533
+ # define GTEST_HAS_CLONE 0
534
+ # endif // GTEST_OS_LINUX && !defined(__ia64__)
535
+
536
+ #endif // GTEST_HAS_CLONE
537
+
538
+ // Determines whether to support stream redirection. This is used to test
539
+ // output correctness and to implement death tests.
540
+ #ifndef GTEST_HAS_STREAM_REDIRECTION
541
+ // By default, we assume that stream redirection is supported on all
542
+ // platforms except known mobile ones.
543
+ # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
544
+ # define GTEST_HAS_STREAM_REDIRECTION 0
545
+ # else
546
+ # define GTEST_HAS_STREAM_REDIRECTION 1
547
+ # endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
548
+ #endif // GTEST_HAS_STREAM_REDIRECTION
549
+
550
+ // Determines whether to support death tests.
551
+ // Google Test does not support death tests for VC 7.1 and earlier as
552
+ // abort() in a VC 7.1 application compiled as GUI in debug config
553
+ // pops up a dialog window that cannot be suppressed programmatically.
554
+ #if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
555
+ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
556
+ GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)
557
+ # define GTEST_HAS_DEATH_TEST 1
558
+ # include <vector> // NOLINT
559
+ #endif
560
+
561
+ // We don't support MSVC 7.1 with exceptions disabled now. Therefore
562
+ // all the compilers we care about are adequate for supporting
563
+ // value-parameterized tests.
564
+ #define GTEST_HAS_PARAM_TEST 1
565
+
566
+ // Determines whether to support type-driven tests.
567
+
568
+ // Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
569
+ // Sun Pro CC, IBM Visual Age, and HP aCC support.
570
+ #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
571
+ defined(__IBMCPP__) || defined(__HP_aCC)
572
+ # define GTEST_HAS_TYPED_TEST 1
573
+ # define GTEST_HAS_TYPED_TEST_P 1
574
+ #endif
575
+
576
+ // Determines whether to support Combine(). This only makes sense when
577
+ // value-parameterized tests are enabled. The implementation doesn't
578
+ // work on Sun Studio since it doesn't understand templated conversion
579
+ // operators.
580
+ #if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
581
+ # define GTEST_HAS_COMBINE 1
582
+ #endif
583
+
584
+ // Determines whether the system compiler uses UTF-16 for encoding wide strings.
585
+ #define GTEST_WIDE_STRING_USES_UTF16_ \
586
+ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
587
+
588
+ // Determines whether test results can be streamed to a socket.
589
+ #if GTEST_OS_LINUX
590
+ # define GTEST_CAN_STREAM_RESULTS_ 1
591
+ #endif
592
+
593
+ // Defines some utility macros.
594
+
595
+ // The GNU compiler emits a warning if nested "if" statements are followed by
596
+ // an "else" statement and braces are not used to explicitly disambiguate the
597
+ // "else" binding. This leads to problems with code like:
598
+ //
599
+ // if (gate)
600
+ // ASSERT_*(condition) << "Some message";
601
+ //
602
+ // The "switch (0) case 0:" idiom is used to suppress this.
603
+ #ifdef __INTEL_COMPILER
604
+ # define GTEST_AMBIGUOUS_ELSE_BLOCKER_
605
+ #else
606
+ # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
607
+ #endif
608
+
609
+ // Use this annotation at the end of a struct/class definition to
610
+ // prevent the compiler from optimizing away instances that are never
611
+ // used. This is useful when all interesting logic happens inside the
612
+ // c'tor and / or d'tor. Example:
613
+ //
614
+ // struct Foo {
615
+ // Foo() { ... }
616
+ // } GTEST_ATTRIBUTE_UNUSED_;
617
+ //
618
+ // Also use it after a variable or parameter declaration to tell the
619
+ // compiler the variable/parameter does not have to be used.
620
+ #if defined(__GNUC__) && !defined(COMPILER_ICC)
621
+ # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
622
+ #else
623
+ # define GTEST_ATTRIBUTE_UNUSED_
624
+ #endif
625
+
626
+ // A macro to disallow operator=
627
+ // This should be used in the private: declarations for a class.
628
+ #define GTEST_DISALLOW_ASSIGN_(type)\
629
+ void operator=(type const &)
630
+
631
+ // A macro to disallow copy constructor and operator=
632
+ // This should be used in the private: declarations for a class.
633
+ #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
634
+ type(type const &);\
635
+ GTEST_DISALLOW_ASSIGN_(type)
636
+
637
+ // Tell the compiler to warn about unused return values for functions declared
638
+ // with this macro. The macro should be used on function declarations
639
+ // following the argument list:
640
+ //
641
+ // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
642
+ #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
643
+ # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
644
+ #else
645
+ # define GTEST_MUST_USE_RESULT_
646
+ #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
647
+
648
+ // Determine whether the compiler supports Microsoft's Structured Exception
649
+ // Handling. This is supported by several Windows compilers but generally
650
+ // does not exist on any other system.
651
+ #ifndef GTEST_HAS_SEH
652
+ // The user didn't tell us, so we need to figure it out.
653
+
654
+ # if defined(_MSC_VER) || defined(__BORLANDC__)
655
+ // These two compilers are known to support SEH.
656
+ # define GTEST_HAS_SEH 1
657
+ # else
658
+ // Assume no SEH.
659
+ # define GTEST_HAS_SEH 0
660
+ # endif
661
+
662
+ #endif // GTEST_HAS_SEH
663
+
664
+ #ifdef _MSC_VER
665
+
666
+ # if GTEST_LINKED_AS_SHARED_LIBRARY
667
+ # define GTEST_API_ __declspec(dllimport)
668
+ # elif GTEST_CREATE_SHARED_LIBRARY
669
+ # define GTEST_API_ __declspec(dllexport)
670
+ # endif
671
+
672
+ #endif // _MSC_VER
673
+
674
+ #ifndef GTEST_API_
675
+ # define GTEST_API_
676
+ #endif
677
+
678
+ #ifdef __GNUC__
679
+ // Ask the compiler to never inline a given function.
680
+ # define GTEST_NO_INLINE_ __attribute__((noinline))
681
+ #else
682
+ # define GTEST_NO_INLINE_
683
+ #endif
684
+
685
+ namespace testing {
686
+
687
+ class Message;
688
+
689
+ namespace internal {
690
+
691
+ class String;
692
+
693
+ // The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
694
+ // expression is true. For example, you could use it to verify the
695
+ // size of a static array:
696
+ //
697
+ // GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
698
+ // content_type_names_incorrect_size);
699
+ //
700
+ // or to make sure a struct is smaller than a certain size:
701
+ //
702
+ // GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
703
+ //
704
+ // The second argument to the macro is the name of the variable. If
705
+ // the expression is false, most compilers will issue a warning/error
706
+ // containing the name of the variable.
707
+
708
+ template <bool>
709
+ struct CompileAssert {
710
+ };
711
+
712
+ #define GTEST_COMPILE_ASSERT_(expr, msg) \
713
+ typedef ::testing::internal::CompileAssert<(bool(expr))> \
714
+ msg[bool(expr) ? 1 : -1]
715
+
716
+ // Implementation details of GTEST_COMPILE_ASSERT_:
717
+ //
718
+ // - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
719
+ // elements (and thus is invalid) when the expression is false.
720
+ //
721
+ // - The simpler definition
722
+ //
723
+ // #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
724
+ //
725
+ // does not work, as gcc supports variable-length arrays whose sizes
726
+ // are determined at run-time (this is gcc's extension and not part
727
+ // of the C++ standard). As a result, gcc fails to reject the
728
+ // following code with the simple definition:
729
+ //
730
+ // int foo;
731
+ // GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
732
+ // // not a compile-time constant.
733
+ //
734
+ // - By using the type CompileAssert<(bool(expr))>, we ensures that
735
+ // expr is a compile-time constant. (Template arguments must be
736
+ // determined at compile-time.)
737
+ //
738
+ // - The outter parentheses in CompileAssert<(bool(expr))> are necessary
739
+ // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
740
+ //
741
+ // CompileAssert<bool(expr)>
742
+ //
743
+ // instead, these compilers will refuse to compile
744
+ //
745
+ // GTEST_COMPILE_ASSERT_(5 > 0, some_message);
746
+ //
747
+ // (They seem to think the ">" in "5 > 0" marks the end of the
748
+ // template argument list.)
749
+ //
750
+ // - The array size is (bool(expr) ? 1 : -1), instead of simply
751
+ //
752
+ // ((expr) ? 1 : -1).
753
+ //
754
+ // This is to avoid running into a bug in MS VC 7.1, which
755
+ // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
756
+
757
+ // StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
758
+ //
759
+ // This template is declared, but intentionally undefined.
760
+ template <typename T1, typename T2>
761
+ struct StaticAssertTypeEqHelper;
762
+
763
+ template <typename T>
764
+ struct StaticAssertTypeEqHelper<T, T> {};
765
+
766
+ #if GTEST_HAS_GLOBAL_STRING
767
+ typedef ::string string;
768
+ #else
769
+ typedef ::std::string string;
770
+ #endif // GTEST_HAS_GLOBAL_STRING
771
+
772
+ #if GTEST_HAS_GLOBAL_WSTRING
773
+ typedef ::wstring wstring;
774
+ #elif GTEST_HAS_STD_WSTRING
775
+ typedef ::std::wstring wstring;
776
+ #endif // GTEST_HAS_GLOBAL_WSTRING
777
+
778
+ // A helper for suppressing warnings on constant condition. It just
779
+ // returns 'condition'.
780
+ GTEST_API_ bool IsTrue(bool condition);
781
+
782
+ // Defines scoped_ptr.
783
+
784
+ // This implementation of scoped_ptr is PARTIAL - it only contains
785
+ // enough stuff to satisfy Google Test's need.
786
+ template <typename T>
787
+ class scoped_ptr {
788
+ public:
789
+ typedef T element_type;
790
+
791
+ explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
792
+ ~scoped_ptr() { reset(); }
793
+
794
+ T& operator*() const { return *ptr_; }
795
+ T* operator->() const { return ptr_; }
796
+ T* get() const { return ptr_; }
797
+
798
+ T* release() {
799
+ T* const ptr = ptr_;
800
+ ptr_ = NULL;
801
+ return ptr;
802
+ }
803
+
804
+ void reset(T* p = NULL) {
805
+ if (p != ptr_) {
806
+ if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type.
807
+ delete ptr_;
808
+ }
809
+ ptr_ = p;
810
+ }
811
+ }
812
+ private:
813
+ T* ptr_;
814
+
815
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
816
+ };
817
+
818
+ // Defines RE.
819
+
820
+ // A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
821
+ // Regular Expression syntax.
822
+ class GTEST_API_ RE {
823
+ public:
824
+ // A copy constructor is required by the Standard to initialize object
825
+ // references from r-values.
826
+ RE(const RE& other) { Init(other.pattern()); }
827
+
828
+ // Constructs an RE from a string.
829
+ RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
830
+
831
+ #if GTEST_HAS_GLOBAL_STRING
832
+
833
+ RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT
834
+
835
+ #endif // GTEST_HAS_GLOBAL_STRING
836
+
837
+ RE(const char* regex) { Init(regex); } // NOLINT
838
+ ~RE();
839
+
840
+ // Returns the string representation of the regex.
841
+ const char* pattern() const { return pattern_; }
842
+
843
+ // FullMatch(str, re) returns true iff regular expression re matches
844
+ // the entire str.
845
+ // PartialMatch(str, re) returns true iff regular expression re
846
+ // matches a substring of str (including str itself).
847
+ //
848
+ // TODO(wan@google.com): make FullMatch() and PartialMatch() work
849
+ // when str contains NUL characters.
850
+ static bool FullMatch(const ::std::string& str, const RE& re) {
851
+ return FullMatch(str.c_str(), re);
852
+ }
853
+ static bool PartialMatch(const ::std::string& str, const RE& re) {
854
+ return PartialMatch(str.c_str(), re);
855
+ }
856
+
857
+ #if GTEST_HAS_GLOBAL_STRING
858
+
859
+ static bool FullMatch(const ::string& str, const RE& re) {
860
+ return FullMatch(str.c_str(), re);
861
+ }
862
+ static bool PartialMatch(const ::string& str, const RE& re) {
863
+ return PartialMatch(str.c_str(), re);
864
+ }
865
+
866
+ #endif // GTEST_HAS_GLOBAL_STRING
867
+
868
+ static bool FullMatch(const char* str, const RE& re);
869
+ static bool PartialMatch(const char* str, const RE& re);
870
+
871
+ private:
872
+ void Init(const char* regex);
873
+
874
+ // We use a const char* instead of a string, as Google Test may be used
875
+ // where string is not available. We also do not use Google Test's own
876
+ // String type here, in order to simplify dependencies between the
877
+ // files.
878
+ const char* pattern_;
879
+ bool is_valid_;
880
+
881
+ #if GTEST_USES_POSIX_RE
882
+
883
+ regex_t full_regex_; // For FullMatch().
884
+ regex_t partial_regex_; // For PartialMatch().
885
+
886
+ #else // GTEST_USES_SIMPLE_RE
887
+
888
+ const char* full_pattern_; // For FullMatch();
889
+
890
+ #endif
891
+
892
+ GTEST_DISALLOW_ASSIGN_(RE);
893
+ };
894
+
895
+ // Formats a source file path and a line number as they would appear
896
+ // in an error message from the compiler used to compile this code.
897
+ GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
898
+
899
+ // Formats a file location for compiler-independent XML output.
900
+ // Although this function is not platform dependent, we put it next to
901
+ // FormatFileLocation in order to contrast the two functions.
902
+ GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
903
+ int line);
904
+
905
+ // Defines logging utilities:
906
+ // GTEST_LOG_(severity) - logs messages at the specified severity level. The
907
+ // message itself is streamed into the macro.
908
+ // LogToStderr() - directs all log messages to stderr.
909
+ // FlushInfoLog() - flushes informational log messages.
910
+
911
+ enum GTestLogSeverity {
912
+ GTEST_INFO,
913
+ GTEST_WARNING,
914
+ GTEST_ERROR,
915
+ GTEST_FATAL
916
+ };
917
+
918
+ // Formats log entry severity, provides a stream object for streaming the
919
+ // log message, and terminates the message with a newline when going out of
920
+ // scope.
921
+ class GTEST_API_ GTestLog {
922
+ public:
923
+ GTestLog(GTestLogSeverity severity, const char* file, int line);
924
+
925
+ // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
926
+ ~GTestLog();
927
+
928
+ ::std::ostream& GetStream() { return ::std::cerr; }
929
+
930
+ private:
931
+ const GTestLogSeverity severity_;
932
+
933
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
934
+ };
935
+
936
+ #define GTEST_LOG_(severity) \
937
+ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
938
+ __FILE__, __LINE__).GetStream()
939
+
940
+ inline void LogToStderr() {}
941
+ inline void FlushInfoLog() { fflush(NULL); }
942
+
943
+ // INTERNAL IMPLEMENTATION - DO NOT USE.
944
+ //
945
+ // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
946
+ // is not satisfied.
947
+ // Synopsys:
948
+ // GTEST_CHECK_(boolean_condition);
949
+ // or
950
+ // GTEST_CHECK_(boolean_condition) << "Additional message";
951
+ //
952
+ // This checks the condition and if the condition is not satisfied
953
+ // it prints message about the condition violation, including the
954
+ // condition itself, plus additional message streamed into it, if any,
955
+ // and then it aborts the program. It aborts the program irrespective of
956
+ // whether it is built in the debug mode or not.
957
+ #define GTEST_CHECK_(condition) \
958
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
959
+ if (::testing::internal::IsTrue(condition)) \
960
+ ; \
961
+ else \
962
+ GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
963
+
964
+ // An all-mode assert to verify that the given POSIX-style function
965
+ // call returns 0 (indicating success). Known limitation: this
966
+ // doesn't expand to a balanced 'if' statement, so enclose the macro
967
+ // in {} if you need to use it as the only statement in an 'if'
968
+ // branch.
969
+ #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
970
+ if (const int gtest_error = (posix_call)) \
971
+ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
972
+ << gtest_error
973
+
974
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
975
+ //
976
+ // Use ImplicitCast_ as a safe version of static_cast for upcasting in
977
+ // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
978
+ // const Foo*). When you use ImplicitCast_, the compiler checks that
979
+ // the cast is safe. Such explicit ImplicitCast_s are necessary in
980
+ // surprisingly many situations where C++ demands an exact type match
981
+ // instead of an argument type convertable to a target type.
982
+ //
983
+ // The syntax for using ImplicitCast_ is the same as for static_cast:
984
+ //
985
+ // ImplicitCast_<ToType>(expr)
986
+ //
987
+ // ImplicitCast_ would have been part of the C++ standard library,
988
+ // but the proposal was submitted too late. It will probably make
989
+ // its way into the language in the future.
990
+ //
991
+ // This relatively ugly name is intentional. It prevents clashes with
992
+ // similar functions users may have (e.g., implicit_cast). The internal
993
+ // namespace alone is not enough because the function can be found by ADL.
994
+ template<typename To>
995
+ inline To ImplicitCast_(To x) { return x; }
996
+
997
+ // When you upcast (that is, cast a pointer from type Foo to type
998
+ // SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
999
+ // always succeed. When you downcast (that is, cast a pointer from
1000
+ // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
1001
+ // how do you know the pointer is really of type SubclassOfFoo? It
1002
+ // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
1003
+ // when you downcast, you should use this macro. In debug mode, we
1004
+ // use dynamic_cast<> to double-check the downcast is legal (we die
1005
+ // if it's not). In normal mode, we do the efficient static_cast<>
1006
+ // instead. Thus, it's important to test in debug mode to make sure
1007
+ // the cast is legal!
1008
+ // This is the only place in the code we should use dynamic_cast<>.
1009
+ // In particular, you SHOULDN'T be using dynamic_cast<> in order to
1010
+ // do RTTI (eg code like this:
1011
+ // if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
1012
+ // if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
1013
+ // You should design the code some other way not to need this.
1014
+ //
1015
+ // This relatively ugly name is intentional. It prevents clashes with
1016
+ // similar functions users may have (e.g., down_cast). The internal
1017
+ // namespace alone is not enough because the function can be found by ADL.
1018
+ template<typename To, typename From> // use like this: DownCast_<T*>(foo);
1019
+ inline To DownCast_(From* f) { // so we only accept pointers
1020
+ // Ensures that To is a sub-type of From *. This test is here only
1021
+ // for compile-time type checking, and has no overhead in an
1022
+ // optimized build at run-time, as it will be optimized away
1023
+ // completely.
1024
+ if (false) {
1025
+ const To to = NULL;
1026
+ ::testing::internal::ImplicitCast_<From*>(to);
1027
+ }
1028
+
1029
+ #if GTEST_HAS_RTTI
1030
+ // RTTI: debug mode only!
1031
+ GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
1032
+ #endif
1033
+ return static_cast<To>(f);
1034
+ }
1035
+
1036
+ // Downcasts the pointer of type Base to Derived.
1037
+ // Derived must be a subclass of Base. The parameter MUST
1038
+ // point to a class of type Derived, not any subclass of it.
1039
+ // When RTTI is available, the function performs a runtime
1040
+ // check to enforce this.
1041
+ template <class Derived, class Base>
1042
+ Derived* CheckedDowncastToActualType(Base* base) {
1043
+ #if GTEST_HAS_RTTI
1044
+ GTEST_CHECK_(typeid(*base) == typeid(Derived));
1045
+ return dynamic_cast<Derived*>(base); // NOLINT
1046
+ #else
1047
+ return static_cast<Derived*>(base); // Poor man's downcast.
1048
+ #endif
1049
+ }
1050
+
1051
+ #if GTEST_HAS_STREAM_REDIRECTION
1052
+
1053
+ // Defines the stderr capturer:
1054
+ // CaptureStdout - starts capturing stdout.
1055
+ // GetCapturedStdout - stops capturing stdout and returns the captured string.
1056
+ // CaptureStderr - starts capturing stderr.
1057
+ // GetCapturedStderr - stops capturing stderr and returns the captured string.
1058
+ //
1059
+ GTEST_API_ void CaptureStdout();
1060
+ GTEST_API_ String GetCapturedStdout();
1061
+ GTEST_API_ void CaptureStderr();
1062
+ GTEST_API_ String GetCapturedStderr();
1063
+
1064
+ #endif // GTEST_HAS_STREAM_REDIRECTION
1065
+
1066
+
1067
+ #if GTEST_HAS_DEATH_TEST
1068
+
1069
+ // A copy of all command line arguments. Set by InitGoogleTest().
1070
+ extern ::std::vector<String> g_argvs;
1071
+
1072
+ // GTEST_HAS_DEATH_TEST implies we have ::std::string.
1073
+ const ::std::vector<String>& GetArgvs();
1074
+
1075
+ #endif // GTEST_HAS_DEATH_TEST
1076
+
1077
+ // Defines synchronization primitives.
1078
+
1079
+ #if GTEST_HAS_PTHREAD
1080
+
1081
+ // Sleeps for (roughly) n milli-seconds. This function is only for
1082
+ // testing Google Test's own constructs. Don't use it in user tests,
1083
+ // either directly or indirectly.
1084
+ inline void SleepMilliseconds(int n) {
1085
+ const timespec time = {
1086
+ 0, // 0 seconds.
1087
+ n * 1000L * 1000L, // And n ms.
1088
+ };
1089
+ nanosleep(&time, NULL);
1090
+ }
1091
+
1092
+ // Allows a controller thread to pause execution of newly created
1093
+ // threads until notified. Instances of this class must be created
1094
+ // and destroyed in the controller thread.
1095
+ //
1096
+ // This class is only for testing Google Test's own constructs. Do not
1097
+ // use it in user tests, either directly or indirectly.
1098
+ class Notification {
1099
+ public:
1100
+ Notification() : notified_(false) {}
1101
+
1102
+ // Notifies all threads created with this notification to start. Must
1103
+ // be called from the controller thread.
1104
+ void Notify() { notified_ = true; }
1105
+
1106
+ // Blocks until the controller thread notifies. Must be called from a test
1107
+ // thread.
1108
+ void WaitForNotification() {
1109
+ while (!notified_) {
1110
+ SleepMilliseconds(10);
1111
+ }
1112
+ }
1113
+
1114
+ private:
1115
+ volatile bool notified_;
1116
+
1117
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1118
+ };
1119
+
1120
+ // As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
1121
+ // Consequently, it cannot select a correct instantiation of ThreadWithParam
1122
+ // in order to call its Run(). Introducing ThreadWithParamBase as a
1123
+ // non-templated base class for ThreadWithParam allows us to bypass this
1124
+ // problem.
1125
+ class ThreadWithParamBase {
1126
+ public:
1127
+ virtual ~ThreadWithParamBase() {}
1128
+ virtual void Run() = 0;
1129
+ };
1130
+
1131
+ // pthread_create() accepts a pointer to a function type with the C linkage.
1132
+ // According to the Standard (7.5/1), function types with different linkages
1133
+ // are different even if they are otherwise identical. Some compilers (for
1134
+ // example, SunStudio) treat them as different types. Since class methods
1135
+ // cannot be defined with C-linkage we need to define a free C-function to
1136
+ // pass into pthread_create().
1137
+ extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
1138
+ static_cast<ThreadWithParamBase*>(thread)->Run();
1139
+ return NULL;
1140
+ }
1141
+
1142
+ // Helper class for testing Google Test's multi-threading constructs.
1143
+ // To use it, write:
1144
+ //
1145
+ // void ThreadFunc(int param) { /* Do things with param */ }
1146
+ // Notification thread_can_start;
1147
+ // ...
1148
+ // // The thread_can_start parameter is optional; you can supply NULL.
1149
+ // ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
1150
+ // thread_can_start.Notify();
1151
+ //
1152
+ // These classes are only for testing Google Test's own constructs. Do
1153
+ // not use them in user tests, either directly or indirectly.
1154
+ template <typename T>
1155
+ class ThreadWithParam : public ThreadWithParamBase {
1156
+ public:
1157
+ typedef void (*UserThreadFunc)(T);
1158
+
1159
+ ThreadWithParam(
1160
+ UserThreadFunc func, T param, Notification* thread_can_start)
1161
+ : func_(func),
1162
+ param_(param),
1163
+ thread_can_start_(thread_can_start),
1164
+ finished_(false) {
1165
+ ThreadWithParamBase* const base = this;
1166
+ // The thread can be created only after all fields except thread_
1167
+ // have been initialized.
1168
+ GTEST_CHECK_POSIX_SUCCESS_(
1169
+ pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
1170
+ }
1171
+ ~ThreadWithParam() { Join(); }
1172
+
1173
+ void Join() {
1174
+ if (!finished_) {
1175
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
1176
+ finished_ = true;
1177
+ }
1178
+ }
1179
+
1180
+ virtual void Run() {
1181
+ if (thread_can_start_ != NULL)
1182
+ thread_can_start_->WaitForNotification();
1183
+ func_(param_);
1184
+ }
1185
+
1186
+ private:
1187
+ const UserThreadFunc func_; // User-supplied thread function.
1188
+ const T param_; // User-supplied parameter to the thread function.
1189
+ // When non-NULL, used to block execution until the controller thread
1190
+ // notifies.
1191
+ Notification* const thread_can_start_;
1192
+ bool finished_; // true iff we know that the thread function has finished.
1193
+ pthread_t thread_; // The native thread object.
1194
+
1195
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1196
+ };
1197
+
1198
+ // MutexBase and Mutex implement mutex on pthreads-based platforms. They
1199
+ // are used in conjunction with class MutexLock:
1200
+ //
1201
+ // Mutex mutex;
1202
+ // ...
1203
+ // MutexLock lock(&mutex); // Acquires the mutex and releases it at the end
1204
+ // // of the current scope.
1205
+ //
1206
+ // MutexBase implements behavior for both statically and dynamically
1207
+ // allocated mutexes. Do not use MutexBase directly. Instead, write
1208
+ // the following to define a static mutex:
1209
+ //
1210
+ // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
1211
+ //
1212
+ // You can forward declare a static mutex like this:
1213
+ //
1214
+ // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
1215
+ //
1216
+ // To create a dynamic mutex, just define an object of type Mutex.
1217
+ class MutexBase {
1218
+ public:
1219
+ // Acquires this mutex.
1220
+ void Lock() {
1221
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
1222
+ owner_ = pthread_self();
1223
+ }
1224
+
1225
+ // Releases this mutex.
1226
+ void Unlock() {
1227
+ // We don't protect writing to owner_ here, as it's the caller's
1228
+ // responsibility to ensure that the current thread holds the
1229
+ // mutex when this is called.
1230
+ owner_ = 0;
1231
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
1232
+ }
1233
+
1234
+ // Does nothing if the current thread holds the mutex. Otherwise, crashes
1235
+ // with high probability.
1236
+ void AssertHeld() const {
1237
+ GTEST_CHECK_(owner_ == pthread_self())
1238
+ << "The current thread is not holding the mutex @" << this;
1239
+ }
1240
+
1241
+ // A static mutex may be used before main() is entered. It may even
1242
+ // be used before the dynamic initialization stage. Therefore we
1243
+ // must be able to initialize a static mutex object at link time.
1244
+ // This means MutexBase has to be a POD and its member variables
1245
+ // have to be public.
1246
+ public:
1247
+ pthread_mutex_t mutex_; // The underlying pthread mutex.
1248
+ pthread_t owner_; // The thread holding the mutex; 0 means no one holds it.
1249
+ };
1250
+
1251
+ // Forward-declares a static mutex.
1252
+ # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1253
+ extern ::testing::internal::MutexBase mutex
1254
+
1255
+ // Defines and statically (i.e. at link time) initializes a static mutex.
1256
+ # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
1257
+ ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }
1258
+
1259
+ // The Mutex class can only be used for mutexes created at runtime. It
1260
+ // shares its API with MutexBase otherwise.
1261
+ class Mutex : public MutexBase {
1262
+ public:
1263
+ Mutex() {
1264
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
1265
+ owner_ = 0;
1266
+ }
1267
+ ~Mutex() {
1268
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
1269
+ }
1270
+
1271
+ private:
1272
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1273
+ };
1274
+
1275
+ // We cannot name this class MutexLock as the ctor declaration would
1276
+ // conflict with a macro named MutexLock, which is defined on some
1277
+ // platforms. Hence the typedef trick below.
1278
+ class GTestMutexLock {
1279
+ public:
1280
+ explicit GTestMutexLock(MutexBase* mutex)
1281
+ : mutex_(mutex) { mutex_->Lock(); }
1282
+
1283
+ ~GTestMutexLock() { mutex_->Unlock(); }
1284
+
1285
+ private:
1286
+ MutexBase* const mutex_;
1287
+
1288
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
1289
+ };
1290
+
1291
+ typedef GTestMutexLock MutexLock;
1292
+
1293
+ // Helpers for ThreadLocal.
1294
+
1295
+ // pthread_key_create() requires DeleteThreadLocalValue() to have
1296
+ // C-linkage. Therefore it cannot be templatized to access
1297
+ // ThreadLocal<T>. Hence the need for class
1298
+ // ThreadLocalValueHolderBase.
1299
+ class ThreadLocalValueHolderBase {
1300
+ public:
1301
+ virtual ~ThreadLocalValueHolderBase() {}
1302
+ };
1303
+
1304
+ // Called by pthread to delete thread-local data stored by
1305
+ // pthread_setspecific().
1306
+ extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
1307
+ delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
1308
+ }
1309
+
1310
+ // Implements thread-local storage on pthreads-based systems.
1311
+ //
1312
+ // // Thread 1
1313
+ // ThreadLocal<int> tl(100); // 100 is the default value for each thread.
1314
+ //
1315
+ // // Thread 2
1316
+ // tl.set(150); // Changes the value for thread 2 only.
1317
+ // EXPECT_EQ(150, tl.get());
1318
+ //
1319
+ // // Thread 1
1320
+ // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
1321
+ // tl.set(200);
1322
+ // EXPECT_EQ(200, tl.get());
1323
+ //
1324
+ // The template type argument T must have a public copy constructor.
1325
+ // In addition, the default ThreadLocal constructor requires T to have
1326
+ // a public default constructor.
1327
+ //
1328
+ // An object managed for a thread by a ThreadLocal instance is deleted
1329
+ // when the thread exits. Or, if the ThreadLocal instance dies in
1330
+ // that thread, when the ThreadLocal dies. It's the user's
1331
+ // responsibility to ensure that all other threads using a ThreadLocal
1332
+ // have exited when it dies, or the per-thread objects for those
1333
+ // threads will not be deleted.
1334
+ //
1335
+ // Google Test only uses global ThreadLocal objects. That means they
1336
+ // will die after main() has returned. Therefore, no per-thread
1337
+ // object managed by Google Test will be leaked as long as all threads
1338
+ // using Google Test have exited when main() returns.
1339
+ template <typename T>
1340
+ class ThreadLocal {
1341
+ public:
1342
+ ThreadLocal() : key_(CreateKey()),
1343
+ default_() {}
1344
+ explicit ThreadLocal(const T& value) : key_(CreateKey()),
1345
+ default_(value) {}
1346
+
1347
+ ~ThreadLocal() {
1348
+ // Destroys the managed object for the current thread, if any.
1349
+ DeleteThreadLocalValue(pthread_getspecific(key_));
1350
+
1351
+ // Releases resources associated with the key. This will *not*
1352
+ // delete managed objects for other threads.
1353
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
1354
+ }
1355
+
1356
+ T* pointer() { return GetOrCreateValue(); }
1357
+ const T* pointer() const { return GetOrCreateValue(); }
1358
+ const T& get() const { return *pointer(); }
1359
+ void set(const T& value) { *pointer() = value; }
1360
+
1361
+ private:
1362
+ // Holds a value of type T.
1363
+ class ValueHolder : public ThreadLocalValueHolderBase {
1364
+ public:
1365
+ explicit ValueHolder(const T& value) : value_(value) {}
1366
+
1367
+ T* pointer() { return &value_; }
1368
+
1369
+ private:
1370
+ T value_;
1371
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
1372
+ };
1373
+
1374
+ static pthread_key_t CreateKey() {
1375
+ pthread_key_t key;
1376
+ // When a thread exits, DeleteThreadLocalValue() will be called on
1377
+ // the object managed for that thread.
1378
+ GTEST_CHECK_POSIX_SUCCESS_(
1379
+ pthread_key_create(&key, &DeleteThreadLocalValue));
1380
+ return key;
1381
+ }
1382
+
1383
+ T* GetOrCreateValue() const {
1384
+ ThreadLocalValueHolderBase* const holder =
1385
+ static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
1386
+ if (holder != NULL) {
1387
+ return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
1388
+ }
1389
+
1390
+ ValueHolder* const new_holder = new ValueHolder(default_);
1391
+ ThreadLocalValueHolderBase* const holder_base = new_holder;
1392
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
1393
+ return new_holder->pointer();
1394
+ }
1395
+
1396
+ // A key pthreads uses for looking up per-thread values.
1397
+ const pthread_key_t key_;
1398
+ const T default_; // The default value for each thread.
1399
+
1400
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
1401
+ };
1402
+
1403
+ # define GTEST_IS_THREADSAFE 1
1404
+
1405
+ #else // GTEST_HAS_PTHREAD
1406
+
1407
+ // A dummy implementation of synchronization primitives (mutex, lock,
1408
+ // and thread-local variable). Necessary for compiling Google Test where
1409
+ // mutex is not supported - using Google Test in multiple threads is not
1410
+ // supported on such platforms.
1411
+
1412
+ class Mutex {
1413
+ public:
1414
+ Mutex() {}
1415
+ void AssertHeld() const {}
1416
+ };
1417
+
1418
+ # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
1419
+ extern ::testing::internal::Mutex mutex
1420
+
1421
+ # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
1422
+
1423
+ class GTestMutexLock {
1424
+ public:
1425
+ explicit GTestMutexLock(Mutex*) {} // NOLINT
1426
+ };
1427
+
1428
+ typedef GTestMutexLock MutexLock;
1429
+
1430
+ template <typename T>
1431
+ class ThreadLocal {
1432
+ public:
1433
+ ThreadLocal() : value_() {}
1434
+ explicit ThreadLocal(const T& value) : value_(value) {}
1435
+ T* pointer() { return &value_; }
1436
+ const T* pointer() const { return &value_; }
1437
+ const T& get() const { return value_; }
1438
+ void set(const T& value) { value_ = value; }
1439
+ private:
1440
+ T value_;
1441
+ };
1442
+
1443
+ // The above synchronization primitives have dummy implementations.
1444
+ // Therefore Google Test is not thread-safe.
1445
+ # define GTEST_IS_THREADSAFE 0
1446
+
1447
+ #endif // GTEST_HAS_PTHREAD
1448
+
1449
+ // Returns the number of threads running in the process, or 0 to indicate that
1450
+ // we cannot detect it.
1451
+ GTEST_API_ size_t GetThreadCount();
1452
+
1453
+ // Passing non-POD classes through ellipsis (...) crashes the ARM
1454
+ // compiler and generates a warning in Sun Studio. The Nokia Symbian
1455
+ // and the IBM XL C/C++ compiler try to instantiate a copy constructor
1456
+ // for objects passed through ellipsis (...), failing for uncopyable
1457
+ // objects. We define this to ensure that only POD is passed through
1458
+ // ellipsis on these systems.
1459
+ #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
1460
+ // We lose support for NULL detection where the compiler doesn't like
1461
+ // passing non-POD classes through ellipsis (...).
1462
+ # define GTEST_ELLIPSIS_NEEDS_POD_ 1
1463
+ #else
1464
+ # define GTEST_CAN_COMPARE_NULL 1
1465
+ #endif
1466
+
1467
+ // The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
1468
+ // const T& and const T* in a function template. These compilers
1469
+ // _can_ decide between class template specializations for T and T*,
1470
+ // so a tr1::type_traits-like is_pointer works.
1471
+ #if defined(__SYMBIAN32__) || defined(__IBMCPP__)
1472
+ # define GTEST_NEEDS_IS_POINTER_ 1
1473
+ #endif
1474
+
1475
+ template <bool bool_value>
1476
+ struct bool_constant {
1477
+ typedef bool_constant<bool_value> type;
1478
+ static const bool value = bool_value;
1479
+ };
1480
+ template <bool bool_value> const bool bool_constant<bool_value>::value;
1481
+
1482
+ typedef bool_constant<false> false_type;
1483
+ typedef bool_constant<true> true_type;
1484
+
1485
+ template <typename T>
1486
+ struct is_pointer : public false_type {};
1487
+
1488
+ template <typename T>
1489
+ struct is_pointer<T*> : public true_type {};
1490
+
1491
+ template <typename Iterator>
1492
+ struct IteratorTraits {
1493
+ typedef typename Iterator::value_type value_type;
1494
+ };
1495
+
1496
+ template <typename T>
1497
+ struct IteratorTraits<T*> {
1498
+ typedef T value_type;
1499
+ };
1500
+
1501
+ template <typename T>
1502
+ struct IteratorTraits<const T*> {
1503
+ typedef T value_type;
1504
+ };
1505
+
1506
+ #if GTEST_OS_WINDOWS
1507
+ # define GTEST_PATH_SEP_ "\\"
1508
+ # define GTEST_HAS_ALT_PATH_SEP_ 1
1509
+ // The biggest signed integer type the compiler supports.
1510
+ typedef __int64 BiggestInt;
1511
+ #else
1512
+ # define GTEST_PATH_SEP_ "/"
1513
+ # define GTEST_HAS_ALT_PATH_SEP_ 0
1514
+ typedef long long BiggestInt; // NOLINT
1515
+ #endif // GTEST_OS_WINDOWS
1516
+
1517
+ // Utilities for char.
1518
+
1519
+ // isspace(int ch) and friends accept an unsigned char or EOF. char
1520
+ // may be signed, depending on the compiler (or compiler flags).
1521
+ // Therefore we need to cast a char to unsigned char before calling
1522
+ // isspace(), etc.
1523
+
1524
+ inline bool IsAlpha(char ch) {
1525
+ return isalpha(static_cast<unsigned char>(ch)) != 0;
1526
+ }
1527
+ inline bool IsAlNum(char ch) {
1528
+ return isalnum(static_cast<unsigned char>(ch)) != 0;
1529
+ }
1530
+ inline bool IsDigit(char ch) {
1531
+ return isdigit(static_cast<unsigned char>(ch)) != 0;
1532
+ }
1533
+ inline bool IsLower(char ch) {
1534
+ return islower(static_cast<unsigned char>(ch)) != 0;
1535
+ }
1536
+ inline bool IsSpace(char ch) {
1537
+ return isspace(static_cast<unsigned char>(ch)) != 0;
1538
+ }
1539
+ inline bool IsUpper(char ch) {
1540
+ return isupper(static_cast<unsigned char>(ch)) != 0;
1541
+ }
1542
+ inline bool IsXDigit(char ch) {
1543
+ return isxdigit(static_cast<unsigned char>(ch)) != 0;
1544
+ }
1545
+
1546
+ inline char ToLower(char ch) {
1547
+ return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
1548
+ }
1549
+ inline char ToUpper(char ch) {
1550
+ return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
1551
+ }
1552
+
1553
+ // The testing::internal::posix namespace holds wrappers for common
1554
+ // POSIX functions. These wrappers hide the differences between
1555
+ // Windows/MSVC and POSIX systems. Since some compilers define these
1556
+ // standard functions as macros, the wrapper cannot have the same name
1557
+ // as the wrapped function.
1558
+
1559
+ namespace posix {
1560
+
1561
+ // Functions with a different name on Windows.
1562
+
1563
+ #if GTEST_OS_WINDOWS
1564
+
1565
+ typedef struct _stat StatStruct;
1566
+
1567
+ # ifdef __BORLANDC__
1568
+ inline int IsATTY(int fd) { return isatty(fd); }
1569
+ inline int StrCaseCmp(const char* s1, const char* s2) {
1570
+ return stricmp(s1, s2);
1571
+ }
1572
+ inline char* StrDup(const char* src) { return strdup(src); }
1573
+ # else // !__BORLANDC__
1574
+ # if GTEST_OS_WINDOWS_MOBILE
1575
+ inline int IsATTY(int /* fd */) { return 0; }
1576
+ # else
1577
+ inline int IsATTY(int fd) { return _isatty(fd); }
1578
+ # endif // GTEST_OS_WINDOWS_MOBILE
1579
+ inline int StrCaseCmp(const char* s1, const char* s2) {
1580
+ return _stricmp(s1, s2);
1581
+ }
1582
+ inline char* StrDup(const char* src) { return _strdup(src); }
1583
+ # endif // __BORLANDC__
1584
+
1585
+ # if GTEST_OS_WINDOWS_MOBILE
1586
+ inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
1587
+ // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
1588
+ // time and thus not defined there.
1589
+ # else
1590
+ inline int FileNo(FILE* file) { return _fileno(file); }
1591
+ inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
1592
+ inline int RmDir(const char* dir) { return _rmdir(dir); }
1593
+ inline bool IsDir(const StatStruct& st) {
1594
+ return (_S_IFDIR & st.st_mode) != 0;
1595
+ }
1596
+ # endif // GTEST_OS_WINDOWS_MOBILE
1597
+
1598
+ #else
1599
+
1600
+ typedef struct stat StatStruct;
1601
+
1602
+ inline int FileNo(FILE* file) { return fileno(file); }
1603
+ inline int IsATTY(int fd) { return isatty(fd); }
1604
+ inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
1605
+ inline int StrCaseCmp(const char* s1, const char* s2) {
1606
+ return strcasecmp(s1, s2);
1607
+ }
1608
+ inline char* StrDup(const char* src) { return strdup(src); }
1609
+ inline int RmDir(const char* dir) { return rmdir(dir); }
1610
+ inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
1611
+
1612
+ #endif // GTEST_OS_WINDOWS
1613
+
1614
+ // Functions deprecated by MSVC 8.0.
1615
+
1616
+ #ifdef _MSC_VER
1617
+ // Temporarily disable warning 4996 (deprecated function).
1618
+ # pragma warning(push)
1619
+ # pragma warning(disable:4996)
1620
+ #endif
1621
+
1622
+ inline const char* StrNCpy(char* dest, const char* src, size_t n) {
1623
+ return strncpy(dest, src, n);
1624
+ }
1625
+
1626
+ // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
1627
+ // StrError() aren't needed on Windows CE at this time and thus not
1628
+ // defined there.
1629
+
1630
+ #if !GTEST_OS_WINDOWS_MOBILE
1631
+ inline int ChDir(const char* dir) { return chdir(dir); }
1632
+ #endif
1633
+ inline FILE* FOpen(const char* path, const char* mode) {
1634
+ return fopen(path, mode);
1635
+ }
1636
+ #if !GTEST_OS_WINDOWS_MOBILE
1637
+ inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
1638
+ return freopen(path, mode, stream);
1639
+ }
1640
+ inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
1641
+ #endif
1642
+ inline int FClose(FILE* fp) { return fclose(fp); }
1643
+ #if !GTEST_OS_WINDOWS_MOBILE
1644
+ inline int Read(int fd, void* buf, unsigned int count) {
1645
+ return static_cast<int>(read(fd, buf, count));
1646
+ }
1647
+ inline int Write(int fd, const void* buf, unsigned int count) {
1648
+ return static_cast<int>(write(fd, buf, count));
1649
+ }
1650
+ inline int Close(int fd) { return close(fd); }
1651
+ inline const char* StrError(int errnum) { return strerror(errnum); }
1652
+ #endif
1653
+ inline const char* GetEnv(const char* name) {
1654
+ #if GTEST_OS_WINDOWS_MOBILE
1655
+ // We are on Windows CE, which has no environment variables.
1656
+ return NULL;
1657
+ #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
1658
+ // Environment variables which we programmatically clear will be set to the
1659
+ // empty string rather than unset (NULL). Handle that case.
1660
+ const char* const env = getenv(name);
1661
+ return (env != NULL && env[0] != '\0') ? env : NULL;
1662
+ #else
1663
+ return getenv(name);
1664
+ #endif
1665
+ }
1666
+
1667
+ #ifdef _MSC_VER
1668
+ # pragma warning(pop) // Restores the warning state.
1669
+ #endif
1670
+
1671
+ #if GTEST_OS_WINDOWS_MOBILE
1672
+ // Windows CE has no C library. The abort() function is used in
1673
+ // several places in Google Test. This implementation provides a reasonable
1674
+ // imitation of standard behaviour.
1675
+ void Abort();
1676
+ #else
1677
+ inline void Abort() { abort(); }
1678
+ #endif // GTEST_OS_WINDOWS_MOBILE
1679
+
1680
+ } // namespace posix
1681
+
1682
+ // The maximum number a BiggestInt can represent. This definition
1683
+ // works no matter BiggestInt is represented in one's complement or
1684
+ // two's complement.
1685
+ //
1686
+ // We cannot rely on numeric_limits in STL, as __int64 and long long
1687
+ // are not part of standard C++ and numeric_limits doesn't need to be
1688
+ // defined for them.
1689
+ const BiggestInt kMaxBiggestInt =
1690
+ ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
1691
+
1692
+ // This template class serves as a compile-time function from size to
1693
+ // type. It maps a size in bytes to a primitive type with that
1694
+ // size. e.g.
1695
+ //
1696
+ // TypeWithSize<4>::UInt
1697
+ //
1698
+ // is typedef-ed to be unsigned int (unsigned integer made up of 4
1699
+ // bytes).
1700
+ //
1701
+ // Such functionality should belong to STL, but I cannot find it
1702
+ // there.
1703
+ //
1704
+ // Google Test uses this class in the implementation of floating-point
1705
+ // comparison.
1706
+ //
1707
+ // For now it only handles UInt (unsigned int) as that's all Google Test
1708
+ // needs. Other types can be easily added in the future if need
1709
+ // arises.
1710
+ template <size_t size>
1711
+ class TypeWithSize {
1712
+ public:
1713
+ // This prevents the user from using TypeWithSize<N> with incorrect
1714
+ // values of N.
1715
+ typedef void UInt;
1716
+ };
1717
+
1718
+ // The specialization for size 4.
1719
+ template <>
1720
+ class TypeWithSize<4> {
1721
+ public:
1722
+ // unsigned int has size 4 in both gcc and MSVC.
1723
+ //
1724
+ // As base/basictypes.h doesn't compile on Windows, we cannot use
1725
+ // uint32, uint64, and etc here.
1726
+ typedef int Int;
1727
+ typedef unsigned int UInt;
1728
+ };
1729
+
1730
+ // The specialization for size 8.
1731
+ template <>
1732
+ class TypeWithSize<8> {
1733
+ public:
1734
+
1735
+ #if GTEST_OS_WINDOWS
1736
+ typedef __int64 Int;
1737
+ typedef unsigned __int64 UInt;
1738
+ #else
1739
+ typedef long long Int; // NOLINT
1740
+ typedef unsigned long long UInt; // NOLINT
1741
+ #endif // GTEST_OS_WINDOWS
1742
+ };
1743
+
1744
+ // Integer types of known sizes.
1745
+ typedef TypeWithSize<4>::Int Int32;
1746
+ typedef TypeWithSize<4>::UInt UInt32;
1747
+ typedef TypeWithSize<8>::Int Int64;
1748
+ typedef TypeWithSize<8>::UInt UInt64;
1749
+ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
1750
+
1751
+ // Utilities for command line flags and environment variables.
1752
+
1753
+ // Macro for referencing flags.
1754
+ #define GTEST_FLAG(name) FLAGS_gtest_##name
1755
+
1756
+ // Macros for declaring flags.
1757
+ #define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
1758
+ #define GTEST_DECLARE_int32_(name) \
1759
+ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
1760
+ #define GTEST_DECLARE_string_(name) \
1761
+ GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)
1762
+
1763
+ // Macros for defining flags.
1764
+ #define GTEST_DEFINE_bool_(name, default_val, doc) \
1765
+ GTEST_API_ bool GTEST_FLAG(name) = (default_val)
1766
+ #define GTEST_DEFINE_int32_(name, default_val, doc) \
1767
+ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
1768
+ #define GTEST_DEFINE_string_(name, default_val, doc) \
1769
+ GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
1770
+
1771
+ // Parses 'str' for a 32-bit signed integer. If successful, writes the result
1772
+ // to *value and returns true; otherwise leaves *value unchanged and returns
1773
+ // false.
1774
+ // TODO(chandlerc): Find a better way to refactor flag and environment parsing
1775
+ // out of both gtest-port.cc and gtest.cc to avoid exporting this utility
1776
+ // function.
1777
+ bool ParseInt32(const Message& src_text, const char* str, Int32* value);
1778
+
1779
+ // Parses a bool/Int32/string from the environment variable
1780
+ // corresponding to the given Google Test flag.
1781
+ bool BoolFromGTestEnv(const char* flag, bool default_val);
1782
+ GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
1783
+ const char* StringFromGTestEnv(const char* flag, const char* default_val);
1784
+
1785
+ } // namespace internal
1786
+ } // namespace testing
1787
+
1788
+ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_