14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2005, Google Inc. 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved. 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met: 74b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions of source code must retain the above copyright 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer. 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions in binary form must reproduce the above 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer 124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the 134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution. 144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Neither the name of Google Inc. nor the names of its 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from 164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission. 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Author: wan@google.com (Zhanyong Wan) 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The Google C++ Testing Framework (Google Test) 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This header file defines the Message class. 354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// IMPORTANT NOTE: Due to limitation of the C++ language, we have to 374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// leave some internal implementation details in this header file. 384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// They are clearly marked by comments like this: 394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Such code is NOT meant to be used by a user directly, and is subject 434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user 444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// program! 454b6829f0d28990dd645e16386eb226d0f10c8731shiqian 464b6829f0d28990dd645e16386eb226d0f10c8731shiqian#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 474b6829f0d28990dd645e16386eb226d0f10c8731shiqian#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4965de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan#include <limits> 5065de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan 512733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan#include "gtest/internal/gtest-port.h" 522733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan 532733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// Ensures that there is at least one operator<< in the global namespace. 542733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// See Message& operator<<(...) below for why. 552733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanvoid operator<<(const testing::internal::Secret&, int); 564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 574b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing { 584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The Message class works like an ostream repeater. 604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Typical usage: 624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 1. You stream a bunch of values to a Message object. 64b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan// It will remember the text in a stringstream. 654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2. Then you stream the Message object to an ostream. 664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This causes the text in the Message to be streamed 674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// to the ostream. 684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// For example; 704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// testing::Message foo; 724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// foo << 1 << " != " << 2; 734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// std::cout << foo; 744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// will print "1 != 2". 764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Message is not intended to be inherited from. In particular, its 784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// destructor is not virtual. 794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 80b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan// Note that stringstream behaves differently in gcc and in MSVC. You 814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// can stream a NULL char pointer to it in the former, but not in the 824b6829f0d28990dd645e16386eb226d0f10c8731shiqian// latter (it causes an access violation if you do). The Message 834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class hides this difference by treating a NULL char pointer as 844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "(null)". 85e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanclass GTEST_API_ Message { 864b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The type of basic IO manipulators (endl, ends, and flush) for 884b6829f0d28990dd645e16386eb226d0f10c8731shiqian // narrow streams. 894b6829f0d28990dd645e16386eb226d0f10c8731shiqian typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); 904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 914b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 924b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Constructs an empty Message. 932733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan Message(); 944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Copy constructor. 96b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT 974b6829f0d28990dd645e16386eb226d0f10c8731shiqian *ss_ << msg.GetString(); 984b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 994b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1004b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Constructs a Message from a C-string. 101b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan explicit Message(const char* str) : ss_(new ::std::stringstream) { 1024b6829f0d28990dd645e16386eb226d0f10c8731shiqian *ss_ << str; 1034b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1054cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_SYMBIAN 1064b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Streams a value (either a pointer or not) to this object. 1074b6829f0d28990dd645e16386eb226d0f10c8731shiqian template <typename T> 1084b6829f0d28990dd645e16386eb226d0f10c8731shiqian inline Message& operator <<(const T& value) { 1094b6829f0d28990dd645e16386eb226d0f10c8731shiqian StreamHelper(typename internal::is_pointer<T>::type(), value); 1104b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this; 1114b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1124b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 1134b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Streams a non-pointer value to this object. 1144b6829f0d28990dd645e16386eb226d0f10c8731shiqian template <typename T> 1154b6829f0d28990dd645e16386eb226d0f10c8731shiqian inline Message& operator <<(const T& val) { 1162733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // Some libraries overload << for STL containers. These 1172733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // overloads are defined in the global namespace instead of ::std. 1182733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // 1192733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // C++'s symbol lookup rule (i.e. Koenig lookup) says that these 1202733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // overloads are visible in either the std namespace or the global 1212733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // namespace, but not other namespaces, including the testing 1222733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // namespace which Google Test's Message class is in. 1232733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // 1242733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // To allow STL containers (and other types that has a << operator 1252733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // defined in the global namespace) to be used in Google Test 1262733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // assertions, testing::Message must access the custom << operator 1272733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // from the global namespace. With this using declaration, 1282733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // overloads of << defined in the global namespace and those 1292733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // visible via Koenig lookup are both exposed in this function. 1302733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan using ::operator <<; 1312733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan *ss_ << val; 1324b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this; 1334b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1344b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1354b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Streams a pointer value to this object. 1364b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 1374b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This function is an overload of the previous one. When you 1384b6829f0d28990dd645e16386eb226d0f10c8731shiqian // stream a pointer to a Message, this definition will be used as it 1394b6829f0d28990dd645e16386eb226d0f10c8731shiqian // is more specialized. (The C++ Standard, section 1404b6829f0d28990dd645e16386eb226d0f10c8731shiqian // [temp.func.order].) If you stream a non-pointer, then the 1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian // previous definition will be used. 1424b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 1434b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The reason for this overload is that streaming a NULL pointer to 1444b6829f0d28990dd645e16386eb226d0f10c8731shiqian // ostream is undefined behavior. Depending on the compiler, you 1454b6829f0d28990dd645e16386eb226d0f10c8731shiqian // may get "0", "(nil)", "(null)", or an access violation. To 1464b6829f0d28990dd645e16386eb226d0f10c8731shiqian // ensure consistent result across compilers, we always treat NULL 1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian // as "(null)". 1484b6829f0d28990dd645e16386eb226d0f10c8731shiqian template <typename T> 1494b6829f0d28990dd645e16386eb226d0f10c8731shiqian inline Message& operator <<(T* const& pointer) { // NOLINT 1504b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (pointer == NULL) { 1514b6829f0d28990dd645e16386eb226d0f10c8731shiqian *ss_ << "(null)"; 1524b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 1532733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan *ss_ << pointer; 1544b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1554b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this; 1564b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 157e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#endif // GTEST_OS_SYMBIAN 1584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1594b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Since the basic IO manipulators are overloaded for both narrow 1604b6829f0d28990dd645e16386eb226d0f10c8731shiqian // and wide streams, we have to provide this specialized definition 1614b6829f0d28990dd645e16386eb226d0f10c8731shiqian // of operator <<, even though its body is the same as the 1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian // templatized version above. Without this definition, streaming 1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian // endl or other basic IO manipulators to Message will confuse the 1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian // compiler. 1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message& operator <<(BasicNarrowIoManip val) { 1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian *ss_ << val; 1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this; 1684b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1704b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Instead of 1/0, we want to see true/false for bool values. 1714b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message& operator <<(bool b) { 1724b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this << (b ? "true" : "false"); 1734b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian // These two overloads allow streaming a wide C string to a Message 1764b6829f0d28990dd645e16386eb226d0f10c8731shiqian // using the UTF-8 encoding. 1772733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan Message& operator <<(const wchar_t* wide_c_str); 1782733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan Message& operator <<(wchar_t* wide_c_str); 1794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1804b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING 1814b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Converts the given wide string to a narrow string using the UTF-8 1824b6829f0d28990dd645e16386eb226d0f10c8731shiqian // encoding, and streams the result to this Message object. 1834b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message& operator <<(const ::std::wstring& wstr); 1844b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_STD_WSTRING 1854b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1864b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_GLOBAL_WSTRING 1874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Converts the given wide string to a narrow string using the UTF-8 1884b6829f0d28990dd645e16386eb226d0f10c8731shiqian // encoding, and streams the result to this Message object. 1894b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message& operator <<(const ::wstring& wstr); 1904b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_GLOBAL_WSTRING 1914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 19203c314931649a999b0cf5deb0a434a1009157416jgm@google.com // Gets the text streamed to this object so far as an std::string. 1934b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Each '\0' character in the buffer is replaced with "\\0". 1944b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 1954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 1962733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan std::string GetString() const; 1974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1984b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 199733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 2004cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_SYMBIAN 2014b6829f0d28990dd645e16386eb226d0f10c8731shiqian // These are needed as the Nokia Symbian Compiler cannot decide between 2024b6829f0d28990dd645e16386eb226d0f10c8731shiqian // const T& and const T* in a function template. The Nokia compiler _can_ 2034b6829f0d28990dd645e16386eb226d0f10c8731shiqian // decide between class template specializations for T and T*, so a 2044b6829f0d28990dd645e16386eb226d0f10c8731shiqian // tr1::type_traits-like is_pointer works, and we can overload on that. 2054b6829f0d28990dd645e16386eb226d0f10c8731shiqian template <typename T> 2062733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) { 2074b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (pointer == NULL) { 2084b6829f0d28990dd645e16386eb226d0f10c8731shiqian *ss_ << "(null)"; 2094b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 2102733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan *ss_ << pointer; 2114b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 2124b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 2134b6829f0d28990dd645e16386eb226d0f10c8731shiqian template <typename T> 2142733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan inline void StreamHelper(internal::false_type /*is_pointer*/, 2152733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan const T& value) { 2162733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // See the comments in Message& operator <<(const T&) above for why 2172733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // we need this using statement. 2182733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan using ::operator <<; 2192733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan *ss_ << value; 2204b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 221e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#endif // GTEST_OS_SYMBIAN 2224b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2234b6829f0d28990dd645e16386eb226d0f10c8731shiqian // We'll hold the text streamed to this object here. 224b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan const internal::scoped_ptr< ::std::stringstream> ss_; 2254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2264b6829f0d28990dd645e16386eb226d0f10c8731shiqian // We declare (but don't implement) this to prevent the compiler 2274b6829f0d28990dd645e16386eb226d0f10c8731shiqian // from implementing the assignment operator. 2284b6829f0d28990dd645e16386eb226d0f10c8731shiqian void operator=(const Message&); 2294b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 2304b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Streams a Message to an ostream. 2324b6829f0d28990dd645e16386eb226d0f10c8731shiqianinline std::ostream& operator <<(std::ostream& os, const Message& sb) { 2334b6829f0d28990dd645e16386eb226d0f10c8731shiqian return os << sb.GetString(); 2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2362733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wannamespace internal { 2372733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan 2382733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// Converts a streamable value to an std::string. A NULL pointer is 2392733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// converted to "(null)". When the input value is a ::string, 2402733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// ::std::string, ::wstring, or ::std::wstring object, each NUL 2412733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// character in it is replaced with "\\0". 2422733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wantemplate <typename T> 2432733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanstd::string StreamableToString(const T& streamable) { 2442733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan return (Message() << streamable).GetString(); 2452733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan} 2462733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan 2472733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan} // namespace internal 2484b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace testing 2494b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2504b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 251