141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Copyright 2007, Google Inc.
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// All rights reserved.
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Redistribution and use in source and binary forms, with or without
541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// modification, are permitted provided that the following conditions are
641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// met:
741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions of source code must retain the above copyright
941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// notice, this list of conditions and the following disclaimer.
1041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions in binary form must reproduce the above
1141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// copyright notice, this list of conditions and the following disclaimer
1241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in the documentation and/or other materials provided with the
1341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// distribution.
1441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Neither the name of Google Inc. nor the names of its
1541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// contributors may be used to endorse or promote products derived from
1641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// this software without specific prior written permission.
1741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
1841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Author: wan@google.com (Zhanyong Wan)
3141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Google Test - The Google C++ Testing Framework
3341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This file implements a universal value printer that can print a
3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value of any type T:
3641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
3841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A user can teach this function how to print a class type T by
4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// defining either operator<<() or PrintTo() in the namespace that
4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// defines T.  More specifically, the FIRST defined function in the
4241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// following list will be used (assuming T is defined in namespace
4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// foo):
4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   1. foo::PrintTo(const T&, ostream*)
4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   2. operator<<(ostream&, const T&) defined in either foo or the
4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//      global namespace.
4841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// If none of the above is defined, it will print the debug string of
5041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the value if it is a protocol buffer, or print the raw bytes in the
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value otherwise.
5241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// To aid debugging: when T is a reference type, the address of the
5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value is also printed; when T is a (const) char pointer, both the
5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pointer value and the NUL-terminated string it points to are
5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// printed.
5741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We also provide some convenient wrappers:
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // Prints a value to a string.  For a (const or not) char
6141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // pointer, the NUL-terminated string (but not the pointer) is
6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // printed.
6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   std::string ::testing::PrintToString(const T& value);
6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // Prints a value tersely: for a reference type, the referenced
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // value (but not the address) is printed; for a (const or not) char
6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // pointer, the NUL-terminated string (but not the pointer) is
6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // printed.
6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // Prints value using the type inferred by the compiler.  The difference
7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // from UniversalTersePrint() is that this function prints both the
7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // pointer and the NUL-terminated string for a (const or not) char pointer.
7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // Prints the fields of a tuple tersely to a string vector, one
7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // element for each field. Tuple support must be enabled in
7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   // gtest-port.h.
7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
8041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//       const Tuple& value);
8141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
8241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Known limitation:
8341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
8441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The print primitives print the elements of an STL-style container
8541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// using the compiler-inferred type of *iter where iter is a
8641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// const_iterator of the container.  When const_iterator is an input
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// iterator but not a forward iterator, this inferred type may not
8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// match value_type, and the print output may be incorrect.  In
8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// practice, this is rarely a problem as for most containers
9041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// const_iterator is a forward iterator.  We'll fix this if there's an
9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// actual need for it.  Note that this fix cannot rely on value_type
9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// being defined as many user-defined container types don't have
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value_type.
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <ostream>  // NOLINT
9941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <sstream>
10041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <string>
10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <utility>
10241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <vector>
10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-port.h"
10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-internal.h"
10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace testing {
10741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Definitions in the 'internal' and 'internal2' name spaces are
10941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// subject to change without notice.  DO NOT USE THEM IN USER CODE!
11041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace internal2 {
11141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints the given number of bytes in the given object to the given
11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ostream.
11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                                     size_t count,
11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                                     ::std::ostream* os);
11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// For selecting which printer to use when a given type has neither <<
11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// nor PrintTo().
12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotenum TypeKind {
12141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  kProtobuf,              // a protobuf type
12241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                          // (e.g. a named or unnamed enum type)
12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  kOtherType              // anything else
12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// by the universal printer to print a value of type T when neither
12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// operator<< nor PrintTo() is defined for T, where kTypeKind is the
13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// "kind" of T as defined by enum TypeKind.
13141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T, TypeKind kTypeKind>
13241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass TypeWithoutFormatter {
13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // This default version is called when kTypeKind is kOtherType.
13541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void PrintValue(const T& value, ::std::ostream* os) {
13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                         sizeof(value), os);
13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We print a protobuf using its ShortDebugString() when the string
14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// doesn't exceed this many characters; otherwise we print it using
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DebugString() for better readability.
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotconst size_t kProtobufOneLinerMaxLength = 50;
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass TypeWithoutFormatter<T, kProtobuf> {
14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void PrintValue(const T& value, ::std::ostream* os) {
15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const ::testing::internal::string short_str = value.ShortDebugString();
15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const ::testing::internal::string pretty_str =
15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        short_str.length() <= kProtobufOneLinerMaxLength ?
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        short_str : ("\n" + value.DebugString());
15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << ("<" + pretty_str + ">");
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass TypeWithoutFormatter<T, kConvertibleToInteger> {
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Since T has no << operator or PrintTo() but can be implicitly
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // converted to BiggestInt, we print it as a BiggestInt.
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Most likely T is an enum type (either named or unnamed), in which
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // case printing it as an integer is the desired behavior.  In case
16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // T is not an enum, printing it as an integer is the best we can do
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // given that it has no user-defined printer.
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void PrintValue(const T& value, ::std::ostream* os) {
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const internal::BiggestInt kBigInt = value;
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << kBigInt;
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints the given value to the given ostream.  If the value is a
17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// protocol message, its debug string is printed; if it's an enum or
17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// of a type implicitly convertible to BiggestInt, it's printed as an
17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// integer; otherwise the bytes in the value are printed.  This is
17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// what UniversalPrinter<T>::Print() does when it knows nothing about
17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// type T and T has neither << operator nor PrintTo().
18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A user can override this behavior for a class type Foo by defining
18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// a << operator in the namespace where Foo is defined.
18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We put this operator in namespace 'internal2' instead of 'internal'
18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// to simplify the implementation, as much code in 'internal' needs to
18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// use << in STL, which would conflict with our own << were it defined
18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in 'internal'.
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Note that this operator<< takes a generic std::basic_ostream<Char,
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// CharTraits> type instead of the more restricted std::ostream.  If
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// we define it to take an std::ostream instead, we'll get an
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// "ambiguous overloads" compiler error when trying to print a type
19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Foo that supports streaming to std::basic_ostream<Char,
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// CharTraits>, as the compiler cannot tell whether
19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// operator<<(std::ostream&, const T&) or
19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// specific.
19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename Char, typename CharTraits, typename T>
19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot::std::basic_ostream<Char, CharTraits>& operator<<(
20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  TypeWithoutFormatter<T,
20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return os;
20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
20741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace internal2
20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace testing
21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
21241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// magic needed for implementing UniversalPrinter won't work.
21341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace testing_internal {
21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Used to print a value that is not an STL-style container when the
21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// user doesn't define PrintTo() for it.
21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // With the following statement, during unqualified name lookup,
22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // testing::internal2::operator<< appears as if it was declared in
22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // the nearest enclosing namespace that contains both
22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // ::testing_internal and ::testing::internal2, i.e. the global
22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // namespace.  For more details, refer to the C++ Standard section
22441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
22541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // testing::internal2::operator<< in case T doesn't come with a <<
22641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // operator.
22741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
22841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // We cannot write 'using ::testing::internal2::operator<<;', which
22941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // gcc 3.3 fails to compile due to a compiler bug.
23041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  using namespace ::testing::internal2;  // NOLINT
23141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
23241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Assuming T is defined in namespace foo, in the next statement,
23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // the compiler will consider all of:
23441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //   1. foo::operator<< (thanks to Koenig look-up),
23641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //   2. ::operator<< (as the current namespace is enclosed in ::),
23741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //   3. testing::internal2::operator<< (thanks to the using statement above).
23841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
23941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // The operator<< whose type matches T best will be picked.
24041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
24141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // We deliberately allow #2 to be a candidate, as sometimes it's
24241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // impossible to define #1 (e.g. when foo is ::std, defining
24341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // anything in it is undefined behavior unless you are a compiler
24441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // vendor.).
24541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << value;
24641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace testing_internal
24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace testing {
25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace internal {
25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// value to the given ostream.  The caller must ensure that
25541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// 'ostream_ptr' is not NULL, or the behavior is undefined.
25641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
25741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We define UniversalPrinter as a class template (as opposed to a
25841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// function template), as we need to partially specialize it for
25941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// reference types, which cannot be done with function templates.
26041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
26141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass UniversalPrinter;
26241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
26341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
26441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid UniversalPrint(const T& value, ::std::ostream* os);
26541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
26641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Used to print an STL-style container when the user doesn't define
26741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// a PrintTo() for it.
26841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename C>
26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid DefaultPrintTo(IsContainer /* dummy */,
27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                    false_type /* is not a pointer */,
27141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                    const C& container, ::std::ostream* os) {
27241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const size_t kMaxCount = 32;  // The maximum number of elements to print.
27341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << '{';
27441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  size_t count = 0;
27541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  for (typename C::const_iterator it = container.begin();
27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot       it != container.end(); ++it, ++count) {
27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    if (count > 0) {
27841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      *os << ',';
27941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      if (count == kMaxCount) {  // Enough has been printed.
28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        *os << " ...";
28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        break;
28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      }
28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    }
28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << ' ';
28541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
28641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // handle *it being a native array.
28741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    internal::UniversalPrint(*it, os);
28841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
28941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
29041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (count > 0) {
29141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << ' ';
29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
29341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << '}';
29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Used to print a pointer that is neither a char pointer nor a member
29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pointer, when the user doesn't define PrintTo() for it.  (A member
29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// variable pointer or member function pointer doesn't really point to
29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// a location in the address space.  Their representation is
30041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// implementation-defined.  Therefore they will be printed as raw
30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// bytes.)
30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid DefaultPrintTo(IsNotContainer /* dummy */,
30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                    true_type /* is a pointer */,
30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                    T* p, ::std::ostream* os) {
30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (p == NULL) {
30741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << "NULL";
30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  } else {
30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // C++ doesn't allow casting from a function pointer to any object
31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // pointer.
31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    //
31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // IsTrue() silences warnings: "Condition is always true",
31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // "unreachable code".
31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // T is not a function type.  We just call << to print p,
31641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // relying on ADL to pick up user-defined << for their pointer
31741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // types, if any.
31841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      *os << p;
31941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    } else {
32041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // T is a function type, so '*os << p' doesn't do what we want
32141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // (it just prints p as bool).  We want to print p as a const
32241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // void*.  However, we cannot cast it to const void* directly,
32341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // even using reinterpret_cast, as earlier versions of gcc
32441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // (e.g. 3.4.5) cannot compile the cast when p is a function
32541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      // pointer.  Casting to UInt64 first solves the problem.
32641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      *os << reinterpret_cast<const void*>(
32741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot          reinterpret_cast<internal::UInt64>(p));
32841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    }
32941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
33041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
33141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
33241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Used to print a non-container, non-pointer value when the user
33341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// doesn't define PrintTo() for it.
33441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
33541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid DefaultPrintTo(IsNotContainer /* dummy */,
33641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                    false_type /* is not a pointer */,
33741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                    const T& value, ::std::ostream* os) {
33841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ::testing_internal::DefaultPrintNonContainerTo(value, os);
33941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
34041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
34141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints the given value using the << operator if it has one;
34241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// otherwise prints the bytes in it.  This is what
34341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
34441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// or overloaded for type T.
34541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
34641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A user can override this behavior for a class type Foo by defining
34741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// an overload of PrintTo() in the namespace where Foo is defined.  We
34841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// give the user this option as sometimes defining a << operator for
34941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Foo is not desirable (e.g. the coding style may prevent doing it,
35041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// or there is already a << operator but it doesn't do what the user
35141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// wants).
35241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
35341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const T& value, ::std::ostream* os) {
35441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // DefaultPrintTo() is overloaded.  The type of its first two
35541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // arguments determine which version will be picked.  If T is an
35641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // STL-style container, the version for container will be called; if
35741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // T is a pointer, the pointer version will be called; otherwise the
35841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // generic version will be called.
35941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
36041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Note that we check for container types here, prior to we check
36141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // for protocol message types in our operator<<.  The rationale is:
36241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
36341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // For protocol messages, we want to give people a chance to
36441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // override Google Mock's format by defining a PrintTo() or
36541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // operator<<.  For STL containers, other formats can be
36641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // incompatible with Google Mock's format for the container
36741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // elements; therefore we check for container types here to ensure
36841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // that our format is used.
36941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
37041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // The second argument of DefaultPrintTo() is needed to bypass a bug
37141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // in Symbian's C++ compiler that prevents it from picking the right
37241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // overload between:
37341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //
37441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //   PrintTo(const T& x, ...);
37541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  //   PrintTo(T* x, ...);
37641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
37741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
37841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
37941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The following list of PrintTo() overloads tells
38041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UniversalPrinter<T>::Print() how to print standard types (built-in
38141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// types, strings, plain arrays, and pointers).
38241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
38341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloads for various char types.
38441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
38541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
38641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(char c, ::std::ostream* os) {
38741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // When printing a plain char, we always treat it as unsigned.  This
38841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // way, the output won't be affected by whether the compiler thinks
38941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // char is signed or not.
39041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(static_cast<unsigned char>(c), os);
39141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
39241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
39341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloads for other simple built-in types.
39441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(bool x, ::std::ostream* os) {
39541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << (x ? "true" : "false");
39641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
39741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
39841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overload for wchar_t type.
39941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints a wchar_t as a symbol if it is printable or as its internal
40041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// code otherwise and also as its decimal code (except for L'\0').
40141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The L'\0' char is printed as "L'\\0'". The decimal code is printed
40241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// as signed integer when wchar_t is implemented by the compiler
40341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// as a signed type and is printed as an unsigned integer when wchar_t
40441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// is implemented as an unsigned type.
40541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
40641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
40741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloads for C strings.
40841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
40941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(char* s, ::std::ostream* os) {
41041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(ImplicitCast_<const char*>(s), os);
41141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
41241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
41341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// signed/unsigned char is often used for representing binary data, so
41441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// we print pointers to it as void* to be safe.
41541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const signed char* s, ::std::ostream* os) {
41641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(ImplicitCast_<const void*>(s), os);
41741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
41841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(signed char* s, ::std::ostream* os) {
41941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(ImplicitCast_<const void*>(s), os);
42041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
42141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const unsigned char* s, ::std::ostream* os) {
42241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(ImplicitCast_<const void*>(s), os);
42341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
42441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(unsigned char* s, ::std::ostream* os) {
42541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(ImplicitCast_<const void*>(s), os);
42641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
42741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
42841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// MSVC can be configured to define wchar_t as a typedef of unsigned
42941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
43041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// type.  When wchar_t is a typedef, defining an overload for const
43141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// wchar_t* would cause unsigned short* be printed as a wide string,
43241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// possibly causing invalid memory accesses.
43341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
43441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloads for wide C strings
43541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
43641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(wchar_t* s, ::std::ostream* os) {
43741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
43841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
43941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif
44041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
44141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overload for C arrays.  Multi-dimensional arrays are printed
44241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// properly.
44341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
44441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints the given number of elements in an array, without printing
44541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the curly braces.
44641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
44741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
44841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UniversalPrint(a[0], os);
44941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  for (size_t i = 1; i != count; i++) {
45041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << ", ";
45141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalPrint(a[i], os);
45241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
45341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
45441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
45541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloads for ::string and ::std::string.
45641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_GLOBAL_STRING
45741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
45841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const ::string& s, ::std::ostream* os) {
45941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintStringTo(s, os);
46041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
46141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_GLOBAL_STRING
46241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
46341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
46441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const ::std::string& s, ::std::ostream* os) {
46541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintStringTo(s, os);
46641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
46741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
46841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloads for ::wstring and ::std::wstring.
46941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_GLOBAL_WSTRING
47041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
47141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const ::wstring& s, ::std::ostream* os) {
47241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintWideStringTo(s, os);
47341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
47441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_GLOBAL_WSTRING
47541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
47641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_STD_WSTRING
47741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
47841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
47941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintWideStringTo(s, os);
48041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
48141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_STD_WSTRING
48241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
48341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TR1_TUPLE
48441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
48541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// which are packed as tuples.
48641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
48741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Helper function for printing a tuple.  T must be instantiated with
48841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// a tuple type.
48941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
49041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTupleTo(const T& t, ::std::ostream* os);
49141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
49241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overloaded PrintTo() for tuples of various arities.  We support
49341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// tuples of up-to 10 fields.  The following implementation works
49441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// regardless of whether tr1::tuple is implemented using the
49541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// non-standard variadic template feature or not.
49641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
49741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
49841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
49941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
50041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
50141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1>
50241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
50341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
50441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
50541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
50641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2>
50741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
50841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
50941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
51041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
51141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3>
51241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
51341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
51441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
51541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
51641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4>
51741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
51841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
51941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
52041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
52141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
52241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
52341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot             ::std::ostream* os) {
52441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
52541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
52641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
52741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot          typename T6>
52941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
53041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot             ::std::ostream* os) {
53141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
53241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
53341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
53441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
53541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot          typename T6, typename T7>
53641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
53741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot             ::std::ostream* os) {
53841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
53941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
54041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
54141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
54241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot          typename T6, typename T7, typename T8>
54341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
54441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot             ::std::ostream* os) {
54541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
54641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
54741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
54841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
54941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot          typename T6, typename T7, typename T8, typename T9>
55041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
55141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot             ::std::ostream* os) {
55241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
55341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
55441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
55541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
55641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot          typename T6, typename T7, typename T8, typename T9, typename T10>
55741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(
55841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
55941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ::std::ostream* os) {
56041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  PrintTupleTo(t, os);
56141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
56241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TR1_TUPLE
56341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
56441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Overload for std::pair.
56541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T1, typename T2>
56641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
56741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << '(';
56841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
56941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // a reference type.  The same for printing value.second.
57041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UniversalPrinter<T1>::Print(value.first, os);
57141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << ", ";
57241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UniversalPrinter<T2>::Print(value.second, os);
57341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << ')';
57441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
57541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
57641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Implements printing a non-reference type T by letting the compiler
57741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// pick the right overload of PrintTo() for T.
57841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
57941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass UniversalPrinter {
58041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
58141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // MSVC warns about adding const to a function type, so we want to
58241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // disable the warning.
58341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER
58441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(push)          // Saves the current warning state.
58541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(disable:4180)  // Temporarily disables warning 4180.
58641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // _MSC_VER
58741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
58841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Note: we deliberately don't call this PrintTo(), as that name
58941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // conflicts with ::testing::internal::PrintTo in the body of the
59041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // function.
59141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void Print(const T& value, ::std::ostream* os) {
59241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // By default, ::testing::internal::PrintTo() is used for printing
59341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // the value.
59441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    //
59541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // Thanks to Koenig look-up, if T is a class and has its own
59641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // PrintTo() function defined in its namespace, that function will
59741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // be visible here.  Since it is more specific than the generic ones
59841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // in ::testing::internal, it will be picked by the compiler in the
59941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // following statement - exactly what we want.
60041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    PrintTo(value, os);
60141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
60241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
60341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER
60441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(pop)           // Restores the warning state.
60541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // _MSC_VER
60641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
60741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
60841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UniversalPrintArray(begin, len, os) prints an array of 'len'
60941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// elements, starting at address 'begin'.
61041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
61141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
61241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (len == 0) {
61341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << "{}";
61441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  } else {
61541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << "{ ";
61641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const size_t kThreshold = 18;
61741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const size_t kChunkSize = 8;
61841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // If the array has more than kThreshold elements, we'll have to
61941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // omit some details by printing only the first and the last
62041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // kChunkSize elements.
62141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // TODO(wan@google.com): let the user control the threshold using a flag.
62241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    if (len <= kThreshold) {
62341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      PrintRawArrayTo(begin, len, os);
62441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    } else {
62541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      PrintRawArrayTo(begin, kChunkSize, os);
62641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      *os << ", ..., ";
62741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
62841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    }
62941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << " }";
63041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
63141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
63241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This overload prints a (const) char array compactly.
63341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGTEST_API_ void UniversalPrintArray(const char* begin,
63441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                                    size_t len,
63541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                                    ::std::ostream* os);
63641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
63741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Implements printing an array type T[N].
63841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T, size_t N>
63941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass UniversalPrinter<T[N]> {
64041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
64141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Prints the given array, omitting some elements when there are too
64241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // many.
64341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void Print(const T (&a)[N], ::std::ostream* os) {
64441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalPrintArray(a, N, os);
64541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
64641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
64741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
64841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Implements printing a reference type T&.
64941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
65041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass UniversalPrinter<T&> {
65141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
65241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // MSVC warns about adding const to a function type, so we want to
65341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // disable the warning.
65441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER
65541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(push)          // Saves the current warning state.
65641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(disable:4180)  // Temporarily disables warning 4180.
65741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // _MSC_VER
65841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
65941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void Print(const T& value, ::std::ostream* os) {
66041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // Prints the address of the value.  We use reinterpret_cast here
66141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // as static_cast doesn't compile when T is a function type.
66241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
66341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
66441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // Then prints the value itself.
66541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalPrint(value, os);
66641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
66741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
66841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#ifdef _MSC_VER
66941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# pragma warning(pop)           // Restores the warning state.
67041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // _MSC_VER
67141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
67241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
67341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints a value tersely: for a reference type, the referenced value
67441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (but not the address) is printed; for a (const) char pointer, the
67541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// NUL-terminated string (but not the pointer) is printed.
67641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
67741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid UniversalTersePrint(const T& value, ::std::ostream* os) {
67841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UniversalPrint(value, os);
67941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
68041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void UniversalTersePrint(const char* str, ::std::ostream* os) {
68141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (str == NULL) {
68241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << "NULL";
68341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  } else {
68441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalPrint(string(str), os);
68541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
68641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
68741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotinline void UniversalTersePrint(char* str, ::std::ostream* os) {
68841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UniversalTersePrint(static_cast<const char*>(str), os);
68941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
69041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
69141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints a value using the type inferred by the compiler.  The
69241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// difference between this and UniversalTersePrint() is that for a
69341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (const) char pointer, this prints both the pointer and the
69441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// NUL-terminated string.
69541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
69641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid UniversalPrint(const T& value, ::std::ostream* os) {
69741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UniversalPrinter<T>::Print(value, os);
69841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
69941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
70041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TR1_TUPLE
70141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef ::std::vector<string> Strings;
70241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
70341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This helper template allows PrintTo() for tuples and
70441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UniversalTersePrintTupleFieldsToStrings() to be defined by
70541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// induction on the number of tuple fields.  The idea is that
70641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
70741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// fields in tuple t, and can be defined in terms of
70841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TuplePrefixPrinter<N - 1>.
70941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
71041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The inductive case.
71141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <size_t N>
71241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct TuplePrefixPrinter {
71341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Prints the first N fields of a tuple.
71441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  template <typename Tuple>
71541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
71641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
71741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    *os << ", ";
71841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
71941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        ::Print(::std::tr1::get<N - 1>(t), os);
72041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
72141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
72241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Tersely prints the first N fields of a tuple to a string vector,
72341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // one element for each field.
72441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  template <typename Tuple>
72541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
72641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
72741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ::std::stringstream ss;
72841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
72941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    strings->push_back(ss.str());
73041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
73141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
73241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
73341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Base cases.
73441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <>
73541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct TuplePrefixPrinter<0> {
73641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  template <typename Tuple>
73741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
73841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
73941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  template <typename Tuple>
74041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
74141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
74241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We have to specialize the entire TuplePrefixPrinter<> class
74341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// template here, even though the definition of
74441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TersePrintPrefixToStrings() is the same as the generic version, as
74541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
74641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// support specializing a method template of a class template.
74741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <>
74841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct TuplePrefixPrinter<1> {
74941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  template <typename Tuple>
75041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
75141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
75241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        Print(::std::tr1::get<0>(t), os);
75341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
75441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
75541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  template <typename Tuple>
75641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
75741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ::std::stringstream ss;
75841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
75941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    strings->push_back(ss.str());
76041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
76141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
76241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
76341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Helper function for printing a tuple.  T must be instantiated with
76441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// a tuple type.
76541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
76641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid PrintTupleTo(const T& t, ::std::ostream* os) {
76741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << "(";
76841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
76941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      PrintPrefixTo(t, os);
77041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  *os << ")";
77141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
77241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
77341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Prints the fields of a tuple tersely to a string vector, one
77441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// element for each field.  See the comment before
77541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UniversalTersePrint() for how we define "tersely".
77641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename Tuple>
77741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
77841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  Strings result;
77941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
78041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      TersePrintPrefixToStrings(value, &result);
78141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return result;
78241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
78341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TR1_TUPLE
78441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
78541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace internal
78641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
78741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
78841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot::std::string PrintToString(const T& value) {
78941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ::std::stringstream ss;
79041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  internal::UniversalTersePrint(value, &ss);
79141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return ss.str();
79241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
79341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
79441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace testing
79541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
79641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
797