13d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Copyright 2005, Google Inc. 23d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// All rights reserved. 33d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 43d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Redistribution and use in source and binary forms, with or without 53d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// modification, are permitted provided that the following conditions are 63d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// met: 73d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 83d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// * Redistributions of source code must retain the above copyright 93d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// notice, this list of conditions and the following disclaimer. 103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// * Redistributions in binary form must reproduce the above 113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyright notice, this list of conditions and the following disclaimer 123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the documentation and/or other materials provided with the 133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// distribution. 143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// * Neither the name of Google Inc. nor the names of its 153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// contributors may be used to endorse or promote products derived from 163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// this software without specific prior written permission. 173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Author: wan@google.com (Zhanyong Wan) 313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The Google C++ Testing Framework (Google Test) 333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This header file defines the Message class. 353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// IMPORTANT NOTE: Due to limitation of the C++ language, we have to 373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// leave some internal implementation details in this header file. 383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// They are clearly marked by comments like this: 393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Such code is NOT meant to be used by a user directly, and is subject 433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user 443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// program! 453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include <limits> 503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-string.h" 523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-internal.h" 533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace testing { 553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The Message class works like an ostream repeater. 573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Typical usage: 593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 1. You stream a bunch of values to a Message object. 613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// It will remember the text in a stringstream. 623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 2. Then you stream the Message object to an ostream. 633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This causes the text in the Message to be streamed 643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// to the ostream. 653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// For example; 673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// testing::Message foo; 693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// foo << 1 << " != " << 2; 703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// std::cout << foo; 713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// will print "1 != 2". 733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Message is not intended to be inherited from. In particular, its 753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// destructor is not virtual. 763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Note that stringstream behaves differently in gcc and in MSVC. You 783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// can stream a NULL char pointer to it in the former, but not in the 793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// latter (it causes an access violation if you do). The Message 803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// class hides this difference by treating a NULL char pointer as 813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "(null)". 823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_API_ Message { 833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private: 843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // The type of basic IO manipulators (endl, ends, and flush) for 853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // narrow streams. 863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); 873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public: 893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Constructs an empty Message. 903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // We allocate the stringstream separately because otherwise each use of 913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's 923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // stack frame leading to huge stack frames in some cases; gcc does not reuse 933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // the stack space. 943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message() : ss_(new ::std::stringstream) { 953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // By default, we want there to be enough precision when printing 963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // a double to a Message. 973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2); 983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Copy constructor. 1013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT 1023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick *ss_ << msg.GetString(); 1033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Constructs a Message from a C-string. 1063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick explicit Message(const char* str) : ss_(new ::std::stringstream) { 1073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick *ss_ << str; 1083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if GTEST_OS_SYMBIAN 1113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Streams a value (either a pointer or not) to this object. 1123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename T> 1133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick inline Message& operator <<(const T& value) { 1143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick StreamHelper(typename internal::is_pointer<T>::type(), value); 1153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this; 1163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#else 1183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Streams a non-pointer value to this object. 1193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename T> 1203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick inline Message& operator <<(const T& val) { 1213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick ::GTestStreamToHelper(ss_.get(), val); 1223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this; 1233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Streams a pointer value to this object. 1263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // 1273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // This function is an overload of the previous one. When you 1283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // stream a pointer to a Message, this definition will be used as it 1293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // is more specialized. (The C++ Standard, section 1303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // [temp.func.order].) If you stream a non-pointer, then the 1313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // previous definition will be used. 1323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // 1333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // The reason for this overload is that streaming a NULL pointer to 1343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // ostream is undefined behavior. Depending on the compiler, you 1353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // may get "0", "(nil)", "(null)", or an access violation. To 1363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // ensure consistent result across compilers, we always treat NULL 1373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // as "(null)". 1383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename T> 1393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick inline Message& operator <<(T* const& pointer) { // NOLINT 1403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick if (pointer == NULL) { 1413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick *ss_ << "(null)"; 1423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } else { 1433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick ::GTestStreamToHelper(ss_.get(), pointer); 1443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this; 1463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif // GTEST_OS_SYMBIAN 1483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Since the basic IO manipulators are overloaded for both narrow 1503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // and wide streams, we have to provide this specialized definition 1513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // of operator <<, even though its body is the same as the 1523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // templatized version above. Without this definition, streaming 1533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // endl or other basic IO manipulators to Message will confuse the 1543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // compiler. 1553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message& operator <<(BasicNarrowIoManip val) { 1563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick *ss_ << val; 1573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this; 1583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Instead of 1/0, we want to see true/false for bool values. 1613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message& operator <<(bool b) { 1623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this << (b ? "true" : "false"); 1633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // These two overloads allow streaming a wide C string to a Message 1663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // using the UTF-8 encoding. 1673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message& operator <<(const wchar_t* wide_c_str) { 1683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this << internal::String::ShowWideCString(wide_c_str); 1693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message& operator <<(wchar_t* wide_c_str) { 1713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this << internal::String::ShowWideCString(wide_c_str); 1723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if GTEST_HAS_STD_WSTRING 1753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Converts the given wide string to a narrow string using the UTF-8 1763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // encoding, and streams the result to this Message object. 1773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message& operator <<(const ::std::wstring& wstr); 1783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif // GTEST_HAS_STD_WSTRING 1793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if GTEST_HAS_GLOBAL_WSTRING 1813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Converts the given wide string to a narrow string using the UTF-8 1823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // encoding, and streams the result to this Message object. 1833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick Message& operator <<(const ::wstring& wstr); 1843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif // GTEST_HAS_GLOBAL_WSTRING 1853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Gets the text streamed to this object so far as a String. 1873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Each '\0' character in the buffer is replaced with "\\0". 1883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // 1893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 1903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick internal::String GetString() const { 1913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return internal::StringStreamToString(ss_.get()); 1923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private: 1953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if GTEST_OS_SYMBIAN 1973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // These are needed as the Nokia Symbian Compiler cannot decide between 1983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // const T& and const T* in a function template. The Nokia compiler _can_ 1993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // decide between class template specializations for T and T*, so a 2003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // tr1::type_traits-like is_pointer works, and we can overload on that. 2013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename T> 2023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) { 2033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick if (pointer == NULL) { 2043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick *ss_ << "(null)"; 2053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } else { 2063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick ::GTestStreamToHelper(ss_.get(), pointer); 2073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 2083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 2093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename T> 2103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick inline void StreamHelper(internal::false_type /*dummy*/, const T& value) { 2113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick ::GTestStreamToHelper(ss_.get(), value); 2123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 2133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif // GTEST_OS_SYMBIAN 2143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // We'll hold the text streamed to this object here. 2163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick const internal::scoped_ptr< ::std::stringstream> ss_; 2173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // We declare (but don't implement) this to prevent the compiler 2193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // from implementing the assignment operator. 2203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick void operator=(const Message&); 2213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}; 2223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Streams a Message to an ostream. 2243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline std::ostream& operator <<(std::ostream& os, const Message& sb) { 2253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return os << sb.GetString(); 2263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} 2273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} // namespace testing 2293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 231