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