1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2005, Google Inc.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// All rights reserved.
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Redistribution and use in source and binary forms, with or without
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// modification, are permitted provided that the following conditions are
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// met:
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     * Redistributions of source code must retain the above copyright
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// notice, this list of conditions and the following disclaimer.
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     * Redistributions in binary form must reproduce the above
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// copyright notice, this list of conditions and the following disclaimer
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in the documentation and/or other materials provided with the
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distribution.
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     * Neither the name of Google Inc. nor the names of its
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// contributors may be used to endorse or promote products derived from
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// this software without specific prior written permission.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The Google C++ Testing Framework (Google Test)
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This header file declares functions and macros used internally by
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test.  They are subject to change without notice.
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/internal/gtest-port.h>
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_LINUX
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h>
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h>
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/wait.h>
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h>
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_OS_LINUX
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <iomanip>  // NOLINT
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <limits>   // NOLINT
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/internal/gtest-string.h>
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/internal/gtest-filepath.h>
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Due to C++ preprocessor weirdness, we need double indirection to
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// concatenate two tokens when one of them is __LINE__.  Writing
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   foo ## __LINE__
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// will result in the token foo__LINE__, instead of foo followed by
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the current line number.  For more details, see
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_CONCAT_TOKEN(foo, bar) GTEST_CONCAT_TOKEN_IMPL(foo, bar)
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_CONCAT_TOKEN_IMPL(foo, bar) foo ## bar
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test defines the testing::Message class to allow construction of
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test messages via the << operator.  The idea is that anything
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// streamable to std::ostream can be streamed to a testing::Message.
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This allows a user to use his own types in Google Test assertions by
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overloading the << operator.
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// util/gtl/stl_logging-inl.h overloads << for STL containers.  These
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overloads cannot be defined in the std namespace, as that will be
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// undefined behavior.  Therefore, they are defined in the global
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace instead.
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overloads are visible in either the std namespace or the global
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace, but not other namespaces, including the testing
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace which Google Test's Message class is in.
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// To allow STL containers (and other types that has a << operator
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// defined in the global namespace) to be used in Google Test assertions,
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// testing::Message must access the custom << operator from the global
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace.  Hence this helper function.
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Note: Jeffrey Yasskin suggested an alternative fix by "using
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ::operator<<;" in the definition of Message's operator<<.  That fix
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// doesn't require a helper function, but unfortunately doesn't
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compile with MSVC.
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline void GTestStreamToHelper(std::ostream* os, const T& val) {
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *os << val;
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace testing {
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Forward declaration of classes.
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Message;                         // Represents a failure message.
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestCase;                        // A collection of related tests.
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResult;                  // Result of a test part.
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestInfo;                        // Information about a test.
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTest;                        // A collection of test cases.
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTestEventListenerInterface;  // Listens to Google Test events.
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass AssertionResult;                 // Result of an assertion.
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal {
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct TraceInfo;                      // Information about a trace point.
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ScopedTrace;                     // Implements scoped trace.
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestInfoImpl;                    // Opaque implementation of TestInfo
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestResult;                      // Result of a single Test.
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTestImpl;                    // Opaque implementation of UnitTest
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename E> class List;      // A generic list.
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename E> class ListNode;  // A node in a generic list.
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A secret type that Google Test users don't know about.  It has no
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// definition on purpose.  Therefore it's impossible to create a
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Secret object, which is what we want.
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Secret;
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Two overloaded helpers for checking at compile time whether an
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// expression is a null pointer literal (i.e. NULL or any 0-valued
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compile-time integral constant).  Their return values have
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// different sizes, so we can use sizeof() to test which version is
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// picked by the compiler.  These helpers have no implementations, as
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// we only need their signatures.
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Given IsNullLiteralHelper(x), the compiler will pick the first
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// version if x can be implicitly converted to Secret*, and pick the
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// second version otherwise.  Since Secret is a secret and incomplete
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type, the only expression a user can write that has type Secret* is
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a null pointer literal.  Therefore, we know that x is a null
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// pointer literal if and only if the first version is picked by the
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compiler.
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchar IsNullLiteralHelper(Secret* p);
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchar (&IsNullLiteralHelper(...))[2];  // NOLINT
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A compile-time bool constant that is true if and only if x is a
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// null pointer literal (i.e. NULL or any 0-valued compile-time
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// integral constant).
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __SYMBIAN32__  // Symbian
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Passing non-POD classes through ellipsis (...) crashes the ARM compiler.
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The Nokia Symbian compiler tries to instantiate a copy constructor for
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// objects passed through ellipsis (...), failing for uncopyable objects.
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Hence we define this to false (and lose support for NULL detection).
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_IS_NULL_LITERAL(x) false
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else  // ! __SYMBIAN32__
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_IS_NULL_LITERAL(x) \
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // __SYMBIAN32__
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Appends the user-supplied message to the Google-Test-generated message.
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString AppendUserMessage(const String& gtest_msg,
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                         const Message& user_msg);
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A helper class for creating scoped traces in user programs.
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ScopedTrace {
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The c'tor pushes the given source file location and message onto
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // a trace stack maintained by Google Test.
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedTrace(const char* file, int line, const Message& message);
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The d'tor pops the info pushed by the c'tor.
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Note that the d'tor is not virtual in order to be efficient.
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Don't inherit from ScopedTrace!
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ~ScopedTrace();
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedTrace);
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} GTEST_ATTRIBUTE_UNUSED;  // A ScopedTrace object does its job in its
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           // c'tor and d'tor.  Therefore it doesn't
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           // need to be used otherwise.
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts a streamable value to a String.  A NULL pointer is
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// converted to "(null)".  When the input value is a ::string,
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ::std::string, ::wstring, or ::std::wstring object, each NUL
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// character in it is replaced with "\\0".
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Declared here but defined in gtest.h, so that it has access
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to the definition of the Message class, required by the ARM
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compiler.
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString StreamableToString(const T& streamable);
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats a value to be used in a failure message.
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __SYMBIAN32__
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These are needed as the Nokia Symbian Compiler cannot decide between
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// const T& and const T* in a function template. The Nokia compiler _can_
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// decide between class template specializations for T and T*, so a
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tr1::type_traits-like is_pointer works, and we can overload on that.
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This overload makes sure that all pointers (including
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// those to char or wchar_t) are printed as raw pointers.
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatValueForFailureMessage(internal::true_type dummy,
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           T* pointer) {
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return StreamableToString(static_cast<const void*>(pointer));
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatValueForFailureMessage(internal::false_type dummy,
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           const T& value) {
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return StreamableToString(value);
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForFailureMessage(const T& value) {
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return FormatValueForFailureMessage(
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      typename internal::is_pointer<T>::type(), value);
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForFailureMessage(const T& value) {
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return StreamableToString(value);
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This overload makes sure that all pointers (including
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// those to char or wchar_t) are printed as raw pointers.
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForFailureMessage(T* pointer) {
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return StreamableToString(static_cast<const void*>(pointer));
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // __SYMBIAN32__
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These overloaded versions handle narrow and wide characters.
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString FormatForFailureMessage(char ch);
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString FormatForFailureMessage(wchar_t wchar);
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// When this operand is a const char* or char*, and the other operand
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is a ::std::string or ::string, we print this operand as a C string
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// rather than a pointer.  We do the same for wide strings.
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This internal macro is used to avoid duplicated code.
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_FORMAT_IMPL(operand2_type, operand1_printer)\
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForComparisonFailureMessage(\
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    operand2_type::value_type* str, const operand2_type& /*operand2*/) {\
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return operand1_printer(str);\
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}\
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForComparisonFailureMessage(\
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const operand2_type::value_type* str, const operand2_type& /*operand2*/) {\
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return operand1_printer(str);\
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_STRING
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::std::string, String::ShowCStringQuoted)
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_STD_STRING
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_WSTRING
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::std::wstring, String::ShowWideCStringQuoted)
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_STD_WSTRING
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_GLOBAL_STRING
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::string, String::ShowCStringQuoted)
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_GLOBAL_STRING
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_GLOBAL_WSTRING
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::wstring, String::ShowWideCStringQuoted)
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_GLOBAL_WSTRING
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef GTEST_FORMAT_IMPL
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constructs and returns the message for an equality assertion
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The first four parameters are the expressions used in the assertion
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// where foo is 5 and bar is 6, we have:
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   expected_expression: "foo"
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   actual_expression:   "bar"
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   expected_value:      "5"
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   actual_value:        "6"
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The ignoring_case parameter is true iff the assertion is a
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// be inserted into the message.
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult EqFailure(const char* expected_expression,
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          const char* actual_expression,
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          const String& expected_value,
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          const String& actual_value,
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          bool ignoring_case);
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This template class represents an IEEE floating-point number
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (either single-precision or double-precision, depending on the
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// template parameters).
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The purpose of this class is to do more sophisticated number
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// comparison.  (Due to round-off error, etc, it's very unlikely that
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// two floating-points will be equal exactly.  Hence a naive
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// comparison by the == operation often doesn't work.)
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Format of IEEE floating-point:
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   The most-significant bit being the leftmost, an IEEE
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   floating-point looks like
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     sign_bit exponent_bits fraction_bits
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   Here, sign_bit is a single bit that designates the sign of the
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   number.
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   For float, there are 8 exponent bits and 23 fraction bits.
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   For double, there are 11 exponent bits and 52 fraction bits.
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   More details can be found at
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Template parameter:
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   RawType: the raw floating-point type (either float or double)
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename RawType>
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FloatingPoint {
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Defines the unsigned integer type that has the same size as the
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // floating point number.
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Constants.
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // # of bits in a number.
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const size_t kBitCount = 8*sizeof(RawType);
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // # of fraction bits in a number.
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const size_t kFractionBitCount =
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::numeric_limits<RawType>::digits - 1;
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // # of exponent bits in a number.
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The mask for the sign bit.
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The mask for the fraction bits.
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const Bits kFractionBitMask =
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The mask for the exponent bits.
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // How many ULP's (Units in the Last Place) we want to tolerate when
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // comparing two numbers.  The larger the value, the more error we
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // allow.  A 0 value means that two numbers must be exactly the same
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to be considered equal.
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The maximum error of a single floating-point operation is 0.5
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // units in the last place.  On Intel CPU's, all floating-point
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // calculations are done with 80-bit precision, while double has 64
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // bits.  Therefore, 4 should be enough for ordinary use.
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // See the following article for more details on ULP:
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const size_t kMaxUlps = 4;
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Constructs a FloatingPoint from a raw floating-point number.
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // around may change its bits, although the new value is guaranteed
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to be also a NAN.  Therefore, don't expect this constructor to
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // preserve the bits in x when x is a NAN.
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit FloatingPoint(const RawType& x) : value_(x) {}
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Static methods
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Reinterprets a bit pattern as a floating-point number.
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This function is needed to test the AlmostEquals() method.
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static RawType ReinterpretBits(const Bits bits) {
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    FloatingPoint fp(0);
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fp.bits_ = bits;
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return fp.value_;
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the floating-point number that represent positive infinity.
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static RawType Infinity() {
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ReinterpretBits(kExponentBitMask);
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Non-static methods
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the bits that represents this number.
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const Bits &bits() const { return bits_; }
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the exponent bits of this number.
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Bits exponent_bits() const { return kExponentBitMask & bits_; }
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the fraction bits of this number.
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Bits fraction_bits() const { return kFractionBitMask & bits_; }
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the sign bit of this number.
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Bits sign_bit() const { return kSignBitMask & bits_; }
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true iff this is NAN (not a number).
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_nan() const {
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // It's a NAN if the exponent bits are all ones and the fraction
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // bits are not entirely zeros.
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true iff this number is at most kMaxUlps ULP's away from
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // rhs.  In particular, this function:
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   - returns false if either number is (or both are) NAN.
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   - treats really large numbers as almost equal to infinity.
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool AlmostEquals(const FloatingPoint& rhs) const {
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // The IEEE standard says that any comparison operation involving
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // a NAN must return false.
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (is_nan() || rhs.is_nan()) return false;
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return DistanceBetweenSignAndMagnitudeNumbers(bits_, rhs.bits_) <= kMaxUlps;
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts an integer from the sign-and-magnitude representation to
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the biased representation.  More precisely, let N be 2 to the
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // power of (kBitCount - 1), an integer x is represented by the
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // unsigned number x + N.
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For instance,
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   -N + 1 (the most negative number representable using
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //          sign-and-magnitude) is represented by 1;
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   0      is represented by N; and
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   N - 1  (the biggest number representable using
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //          sign-and-magnitude) is represented by 2N - 1.
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Read http://en.wikipedia.org/wiki/Signed_number_representations
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // for more details on signed number representations.
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (kSignBitMask & sam) {
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // sam represents a negative number.
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      return ~sam + 1;
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    } else {
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // sam represents a positive number.
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      return kSignBitMask | sam;
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Given two numbers in the sign-and-magnitude representation,
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // returns the distance between them as an unsigned number.
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     const Bits &sam2) {
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  union {
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    RawType value_;  // The raw floating-point number.
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    Bits bits_;      // The bits that represent the number.
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Typedefs the instances of the FloatingPoint template class that we
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// care to use.
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef FloatingPoint<float> Float;
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef FloatingPoint<double> Double;
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// In order to catch the mistake of putting tests that use different
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test fixture classes in the same test case, we need to assign
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// unique IDs to fixture classes and compare them.  The TypeId type is
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// used to hold such IDs.  The user should treat TypeId as an opaque
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type: the only operation allowed on TypeId values is to compare
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// them for equality using the == operator.
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void* TypeId;
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// GetTypeId<T>() returns the ID of type T.  Different values will be
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// returned for different types.  Calling the function twice with the
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// same type argument is guaranteed to return the same ID.
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TypeId GetTypeId() {
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static bool dummy = false;
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The compiler is required to create an instance of the static
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // variable dummy for each T used to instantiate the template.
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Therefore, the address of dummy is guaranteed to be unique.
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return &dummy;
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Predicate-formatters for implementing the HRESULT checking macros
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We pass a long instead of HRESULT to avoid causing an
492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// include dependency for the HRESULT type.
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsHRESULTSuccess(const char* expr, long hr);  // NOLINT
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsHRESULTFailure(const char* expr, long hr);  // NOLINT
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_OS_WINDOWS
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace internal
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace testing
500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_MESSAGE(message, result_type) \
502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::testing::internal::AssertHelper(result_type, __FILE__, __LINE__, message) \
503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    = ::testing::Message()
504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_FATAL_FAILURE(message) \
506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return GTEST_MESSAGE(message, ::testing::TPRT_FATAL_FAILURE)
507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_NONFATAL_FAILURE(message) \
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_MESSAGE(message, ::testing::TPRT_NONFATAL_FAILURE)
510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_SUCCESS(message) \
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_MESSAGE(message, ::testing::TPRT_SUCCESS)
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_TEST_BOOLEAN(boolexpr, booltext, actual, expected, fail) \
515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_AMBIGUOUS_ELSE_BLOCKER \
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (boolexpr) \
517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ; \
518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  else \
519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fail("Value of: " booltext "\n  Actual: " #actual "\nExpected: " #expected)
520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper macro for defining tests.
522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_TEST(test_case_name, test_name, parent_class)\
523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass test_case_name##_##test_name##_Test : public parent_class {\
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:\
525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  test_case_name##_##test_name##_Test() {}\
526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static ::testing::Test* NewTest() {\
527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return new test_case_name##_##test_name##_Test;\
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }\
529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:\
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void TestBody();\
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static ::testing::TestInfo* const test_info_;\
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_DISALLOW_COPY_AND_ASSIGN(test_case_name##_##test_name##_Test);\
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};\
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott\
535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott::testing::TestInfo* const test_case_name##_##test_name##_Test::test_info_ =\
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::testing::TestInfo::MakeAndRegisterInstance(\
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    #test_case_name, \
538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    #test_name, \
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::testing::internal::GetTypeId< parent_class >(), \
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    parent_class::SetUpTestCase, \
541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    parent_class::TearDownTestCase, \
542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    test_case_name##_##test_name##_Test::NewTest);\
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid test_case_name##_##test_name##_Test::TestBody()
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
547