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