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