blob: 6997a6c1b8ffa93ed076fa7281dab89e2eeadd64 [file] [log] [blame]
shiqiane35fdd92008-12-10 05:08:54 +00001// Copyright 2007, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14// * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29//
30// Author: wan@google.com (Zhanyong Wan)
31
32// Google Mock - a framework for writing C++ mock classes.
33//
34// This file implements a universal value printer that can print a
35// value of any type T:
36//
37// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
38//
zhanyong.wan7e571ef2009-03-31 18:26:29 +000039// A user can teach this function how to print a class type T by
40// defining either operator<<() or PrintTo() in the namespace that
41// defines T. More specifically, the FIRST defined function in the
42// following list will be used (assuming T is defined in namespace
43// foo):
44//
45// 1. foo::PrintTo(const T&, ostream*)
46// 2. operator<<(ostream&, const T&) defined in either foo or the
47// global namespace.
48//
49// If none of the above is defined, it will print the debug string of
50// the value if it is a protocol buffer, or print the raw bytes in the
51// value otherwise.
zhanyong.wan4a5330d2009-02-19 00:36:44 +000052//
53// To aid debugging: when T is a reference type, the address of the
54// value is also printed; when T is a (const) char pointer, both the
55// pointer value and the NUL-terminated string it points to are
shiqiane35fdd92008-12-10 05:08:54 +000056// printed.
57//
zhanyong.wance198ff2009-02-12 01:34:27 +000058// We also provide some convenient wrappers:
shiqiane35fdd92008-12-10 05:08:54 +000059//
zhanyong.wan4a5330d2009-02-19 00:36:44 +000060// // Prints a value as the given type to a string.
61// string ::testing::internal::UniversalPrinter<T>::PrintToString(value);
62//
63// // Prints a value tersely: for a reference type, the referenced
64// // value (but not the address) is printed; for a (const) char
65// // pointer, the NUL-terminated string (but not the pointer) is
66// // printed.
67// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
68//
69// // Prints the fields of a tuple tersely to a string vector, one
70// // element for each field.
71// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
72// const Tuple& value);
shiqiane35fdd92008-12-10 05:08:54 +000073
74#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_
75#define GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_
76
77#include <ostream> // NOLINT
zhanyong.wan4a5330d2009-02-19 00:36:44 +000078#include <sstream>
shiqiane35fdd92008-12-10 05:08:54 +000079#include <string>
80#include <utility>
zhanyong.wan4a5330d2009-02-19 00:36:44 +000081#include <vector>
shiqiane35fdd92008-12-10 05:08:54 +000082
83#include <gmock/internal/gmock-internal-utils.h>
84#include <gmock/internal/gmock-port.h>
85#include <gtest/gtest.h>
86
shiqiane35fdd92008-12-10 05:08:54 +000087namespace testing {
88
89// Definitions in the 'internal' and 'internal2' name spaces are
90// subject to change without notice. DO NOT USE THEM IN USER CODE!
91namespace internal2 {
92
93// Prints the given number of bytes in the given object to the given
94// ostream.
95void PrintBytesInObjectTo(const unsigned char* obj_bytes,
96 size_t count,
97 ::std::ostream* os);
98
99// TypeWithoutFormatter<T, kIsProto>::PrintValue(value, os) is called
100// by the universal printer to print a value of type T when neither
101// operator<< nor PrintTo() is defined for type T. When T is
102// ProtocolMessage, proto2::Message, or a subclass of those, kIsProto
103// will be true and the short debug string of the protocol message
104// value will be printed; otherwise kIsProto will be false and the
105// bytes in the value will be printed.
106template <typename T, bool kIsProto>
107class TypeWithoutFormatter {
108 public:
109 static void PrintValue(const T& value, ::std::ostream* os) {
110 PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
111 sizeof(value), os);
112 }
113};
114template <typename T>
115class TypeWithoutFormatter<T, true> {
116 public:
117 static void PrintValue(const T& value, ::std::ostream* os) {
118 // Both ProtocolMessage and proto2::Message have the
119 // ShortDebugString() method, so the same implementation works for
120 // both.
121 ::std::operator<<(*os, "<" + value.ShortDebugString() + ">");
122 }
123};
124
125// Prints the given value to the given ostream. If the value is a
126// protocol message, its short debug string is printed; otherwise the
127// bytes in the value are printed. This is what
128// UniversalPrinter<T>::Print() does when it knows nothing about type
129// T and T has no << operator.
130//
131// A user can override this behavior for a class type Foo by defining
132// a << operator in the namespace where Foo is defined.
133//
134// We put this operator in namespace 'internal2' instead of 'internal'
135// to simplify the implementation, as much code in 'internal' needs to
136// use << in STL, which would conflict with our own << were it defined
137// in 'internal'.
zhanyong.wan2f0849f2009-02-11 18:06:37 +0000138//
139// Note that this operator<< takes a generic std::basic_ostream<Char,
140// CharTraits> type instead of the more restricted std::ostream. If
141// we define it to take an std::ostream instead, we'll get an
142// "ambiguous overloads" compiler error when trying to print a type
143// Foo that supports streaming to std::basic_ostream<Char,
144// CharTraits>, as the compiler cannot tell whether
145// operator<<(std::ostream&, const T&) or
146// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
147// specific.
148template <typename Char, typename CharTraits, typename T>
149::std::basic_ostream<Char, CharTraits>& operator<<(
150 ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
shiqiane35fdd92008-12-10 05:08:54 +0000151 TypeWithoutFormatter<T, ::testing::internal::IsAProtocolMessage<T>::value>::
152 PrintValue(x, &os);
153 return os;
154}
155
156} // namespace internal2
zhanyong.wan7e571ef2009-03-31 18:26:29 +0000157} // namespace testing
shiqiane35fdd92008-12-10 05:08:54 +0000158
zhanyong.wan7e571ef2009-03-31 18:26:29 +0000159// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
160// magic needed for implementing UniversalPrinter won't work.
161namespace testing_internal {
162
163// Used to print a value that is not an STL-style container when the
164// user doesn't define PrintTo() for it.
165template <typename T>
166void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
167 // With the following statement, during unqualified name lookup,
168 // testing::internal2::operator<< appears as if it was declared in
169 // the nearest enclosing namespace that contains both
170 // ::testing_internal and ::testing::internal2, i.e. the global
171 // namespace. For more details, refer to the C++ Standard section
172 // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
173 // testing::internal2::operator<< in case T doesn't come with a <<
174 // operator.
175 //
176 // We cannot write 'using ::testing::internal2::operator<<;', which
177 // gcc 3.3 fails to compile due to a compiler bug.
178 using namespace ::testing::internal2; // NOLINT
179
180 // Assuming T is defined in namespace foo, in the next statement,
181 // the compiler will consider all of:
182 //
183 // 1. foo::operator<< (thanks to Koenig look-up),
184 // 2. ::operator<< (as the current namespace is enclosed in ::),
185 // 3. testing::internal2::operator<< (thanks to the using statement above).
186 //
187 // The operator<< whose type matches T best will be picked.
188 //
189 // We deliberately allow #2 to be a candidate, as sometimes it's
190 // impossible to define #1 (e.g. when foo is ::std, defining
191 // anything in it is undefined behavior unless you are a compiler
192 // vendor.).
193 *os << value;
194}
195
196} // namespace testing_internal
197
198namespace testing {
shiqiane35fdd92008-12-10 05:08:54 +0000199namespace internal {
200
201// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
202// value to the given ostream. The caller must ensure that
203// 'ostream_ptr' is not NULL, or the behavior is undefined.
204//
205// We define UniversalPrinter as a class template (as opposed to a
206// function template), as we need to partially specialize it for
207// reference types, which cannot be done with function templates.
208template <typename T>
209class UniversalPrinter;
210
211// Used to print an STL-style container when the user doesn't define
212// a PrintTo() for it.
213template <typename C>
zhanyong.wanc6a41232009-05-13 23:38:40 +0000214void DefaultPrintTo(IsContainer /* dummy */,
215 false_type /* is not a pointer */,
216 const C& container, ::std::ostream* os) {
shiqiane35fdd92008-12-10 05:08:54 +0000217 const size_t kMaxCount = 32; // The maximum number of elements to print.
218 *os << '{';
219 size_t count = 0;
220 for (typename C::const_iterator it = container.begin();
221 it != container.end(); ++it, ++count) {
222 if (count > 0) {
223 *os << ',';
224 if (count == kMaxCount) { // Enough has been printed.
225 *os << " ...";
226 break;
227 }
228 }
229 *os << ' ';
230 PrintTo(*it, os);
231 }
232
233 if (count > 0) {
234 *os << ' ';
235 }
236 *os << '}';
237}
238
zhanyong.wanc6a41232009-05-13 23:38:40 +0000239// Used to print a pointer that is neither a char pointer nor a member
240// pointer, when the user doesn't define PrintTo() for it. (A member
241// variable pointer or member function pointer doesn't really point to
242// a location in the address space. Their representation is
243// implementation-defined. Therefore they will be printed as raw
244// bytes.)
shiqiane35fdd92008-12-10 05:08:54 +0000245template <typename T>
zhanyong.wanc6a41232009-05-13 23:38:40 +0000246void DefaultPrintTo(IsNotContainer /* dummy */,
247 true_type /* is a pointer */,
248 T* p, ::std::ostream* os) {
249 if (p == NULL) {
250 *os << "NULL";
251 } else {
252 // We cannot use implicit_cast or static_cast here, as they don't
253 // work when p is a function pointer.
254 *os << reinterpret_cast<const void*>(p);
255 }
256}
257
258// Used to print a non-container, non-pointer value when the user
259// doesn't define PrintTo() for it.
260template <typename T>
261void DefaultPrintTo(IsNotContainer /* dummy */,
262 false_type /* is not a pointer */,
263 const T& value, ::std::ostream* os) {
zhanyong.wan7e571ef2009-03-31 18:26:29 +0000264 ::testing_internal::DefaultPrintNonContainerTo(value, os);
shiqiane35fdd92008-12-10 05:08:54 +0000265}
266
267// Prints the given value using the << operator if it has one;
268// otherwise prints the bytes in it. This is what
269// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
270// or overloaded for type T.
271//
272// A user can override this behavior for a class type Foo by defining
273// an overload of PrintTo() in the namespace where Foo is defined. We
274// give the user this option as sometimes defining a << operator for
275// Foo is not desirable (e.g. the coding style may prevent doing it,
276// or there is already a << operator but it doesn't do what the user
277// wants).
278template <typename T>
279void PrintTo(const T& value, ::std::ostream* os) {
zhanyong.wanc6a41232009-05-13 23:38:40 +0000280 // DefaultPrintTo() is overloaded. The type of its first two
281 // arguments determine which version will be picked. If T is an
282 // STL-style container, the version for container will be called; if
283 // T is a pointer, the pointer version will be called; otherwise the
284 // generic version will be called.
shiqiane35fdd92008-12-10 05:08:54 +0000285 //
286 // Note that we check for container types here, prior to we check
287 // for protocol message types in our operator<<. The rationale is:
288 //
289 // For protocol messages, we want to give people a chance to
290 // override Google Mock's format by defining a PrintTo() or
zhanyong.wan18490652009-05-11 18:54:08 +0000291 // operator<<. For STL containers, other formats can be
292 // incompatible with Google Mock's format for the container
293 // elements; therefore we check for container types here to ensure
294 // that our format is used.
zhanyong.wanc6a41232009-05-13 23:38:40 +0000295 //
296 // The second argument of DefaultPrintTo() is needed to bypass a bug
297 // in Symbian's C++ compiler that prevents it from picking the right
298 // overload between:
299 //
300 // PrintTo(const T& x, ...);
301 // PrintTo(T* x, ...);
302 DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
shiqiane35fdd92008-12-10 05:08:54 +0000303}
304
305// The following list of PrintTo() overloads tells
306// UniversalPrinter<T>::Print() how to print standard types (built-in
307// types, strings, plain arrays, and pointers).
308
309// Overloads for various char types.
310void PrintCharTo(char c, int char_code, ::std::ostream* os);
311inline void PrintTo(unsigned char c, ::std::ostream* os) {
312 PrintCharTo(c, c, os);
313}
314inline void PrintTo(signed char c, ::std::ostream* os) {
315 PrintCharTo(c, c, os);
316}
317inline void PrintTo(char c, ::std::ostream* os) {
318 // When printing a plain char, we always treat it as unsigned. This
319 // way, the output won't be affected by whether the compiler thinks
320 // char is signed or not.
321 PrintTo(static_cast<unsigned char>(c), os);
322}
323
324// Overloads for other simple built-in types.
325inline void PrintTo(bool x, ::std::ostream* os) {
326 *os << (x ? "true" : "false");
327}
328
329// Overload for wchar_t type.
330// Prints a wchar_t as a symbol if it is printable or as its internal
331// code otherwise and also as its decimal code (except for L'\0').
332// The L'\0' char is printed as "L'\\0'". The decimal code is printed
333// as signed integer when wchar_t is implemented by the compiler
334// as a signed type and is printed as an unsigned integer when wchar_t
335// is implemented as an unsigned type.
336void PrintTo(wchar_t wc, ::std::ostream* os);
337
338// Overloads for C strings.
339void PrintTo(const char* s, ::std::ostream* os);
340inline void PrintTo(char* s, ::std::ostream* os) {
341 PrintTo(implicit_cast<const char*>(s), os);
342}
343
344// MSVC compiler can be configured to define whar_t as a typedef
345// of unsigned short. Defining an overload for const wchar_t* in that case
346// would cause pointers to unsigned shorts be printed as wide strings,
347// possibly accessing more memory than intended and causing invalid
348// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
349// wchar_t is implemented as a native type.
350#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
351// Overloads for wide C strings
352void PrintTo(const wchar_t* s, ::std::ostream* os);
353inline void PrintTo(wchar_t* s, ::std::ostream* os) {
354 PrintTo(implicit_cast<const wchar_t*>(s), os);
355}
356#endif
357
shiqiane35fdd92008-12-10 05:08:54 +0000358// Overload for C arrays. Multi-dimensional arrays are printed
359// properly.
360
361// Prints the given number of elements in an array, without printing
362// the curly braces.
363template <typename T>
364void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
365 UniversalPrinter<T>::Print(a[0], os);
366 for (size_t i = 1; i != count; i++) {
367 *os << ", ";
368 UniversalPrinter<T>::Print(a[i], os);
369 }
370}
371
372// Overloads for ::string and ::std::string.
373#if GTEST_HAS_GLOBAL_STRING
374void PrintStringTo(const ::string&s, ::std::ostream* os);
375inline void PrintTo(const ::string& s, ::std::ostream* os) {
376 PrintStringTo(s, os);
377}
378#endif // GTEST_HAS_GLOBAL_STRING
379
380#if GTEST_HAS_STD_STRING
381void PrintStringTo(const ::std::string&s, ::std::ostream* os);
382inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
383 PrintStringTo(s, os);
384}
385#endif // GTEST_HAS_STD_STRING
386
387// Overloads for ::wstring and ::std::wstring.
388#if GTEST_HAS_GLOBAL_WSTRING
389void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
390inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
391 PrintWideStringTo(s, os);
392}
393#endif // GTEST_HAS_GLOBAL_WSTRING
394
395#if GTEST_HAS_STD_WSTRING
396void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
397inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
398 PrintWideStringTo(s, os);
399}
400#endif // GTEST_HAS_STD_WSTRING
401
402// Overload for ::std::tr1::tuple. Needed for printing function
403// arguments, which are packed as tuples.
404
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000405typedef ::std::vector<string> Strings;
406
407// This helper template allows PrintTo() for tuples and
408// UniversalTersePrintTupleFieldsToStrings() to be defined by
shiqiane35fdd92008-12-10 05:08:54 +0000409// induction on the number of tuple fields. The idea is that
410// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
411// fields in tuple t, and can be defined in terms of
412// TuplePrefixPrinter<N - 1>.
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000413
414// The inductive case.
shiqiane35fdd92008-12-10 05:08:54 +0000415template <size_t N>
416struct TuplePrefixPrinter {
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000417 // Prints the first N fields of a tuple.
shiqiane35fdd92008-12-10 05:08:54 +0000418 template <typename Tuple>
419 static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
420 TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
421 *os << ", ";
422 UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
423 ::Print(::std::tr1::get<N - 1>(t), os);
424 }
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000425
426 // Tersely prints the first N fields of a tuple to a string vector,
427 // one element for each field.
428 template <typename Tuple>
429 static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
430 TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
431 ::std::stringstream ss;
432 UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
433 strings->push_back(ss.str());
434 }
shiqiane35fdd92008-12-10 05:08:54 +0000435};
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000436
437// Base cases.
shiqiane35fdd92008-12-10 05:08:54 +0000438template <>
439struct TuplePrefixPrinter<0> {
440 template <typename Tuple>
441 static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000442
443 template <typename Tuple>
444 static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
shiqiane35fdd92008-12-10 05:08:54 +0000445};
446template <>
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000447template <typename Tuple>
448void TuplePrefixPrinter<1>::PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
449 UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
450 Print(::std::tr1::get<0>(t), os);
451}
shiqiane35fdd92008-12-10 05:08:54 +0000452
shiqianc97f2f52008-12-11 17:22:59 +0000453// Helper function for printing a tuple. T must be instantiated with
454// a tuple type.
455template <typename T>
456void PrintTupleTo(const T& t, ::std::ostream* os) {
457 *os << "(";
458 TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
459 PrintPrefixTo(t, os);
460 *os << ")";
461}
462
463// Overloaded PrintTo() for tuples of various arities. We support
464// tuples of up-to 10 fields. The following implementation works
465// regardless of whether tr1::tuple is implemented using the
466// non-standard variadic template feature or not.
467
468inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
469 PrintTupleTo(t, os);
470}
471
472template <typename T1>
473void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
474 PrintTupleTo(t, os);
475}
476
477template <typename T1, typename T2>
478void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
479 PrintTupleTo(t, os);
480}
481
482template <typename T1, typename T2, typename T3>
483void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
484 PrintTupleTo(t, os);
485}
486
487template <typename T1, typename T2, typename T3, typename T4>
488void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
489 PrintTupleTo(t, os);
490}
491
492template <typename T1, typename T2, typename T3, typename T4, typename T5>
493void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
494 ::std::ostream* os) {
495 PrintTupleTo(t, os);
496}
497
498template <typename T1, typename T2, typename T3, typename T4, typename T5,
499 typename T6>
500void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
501 ::std::ostream* os) {
502 PrintTupleTo(t, os);
503}
504
505template <typename T1, typename T2, typename T3, typename T4, typename T5,
506 typename T6, typename T7>
507void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
508 ::std::ostream* os) {
509 PrintTupleTo(t, os);
510}
511
512template <typename T1, typename T2, typename T3, typename T4, typename T5,
513 typename T6, typename T7, typename T8>
514void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
515 ::std::ostream* os) {
516 PrintTupleTo(t, os);
517}
518
519template <typename T1, typename T2, typename T3, typename T4, typename T5,
520 typename T6, typename T7, typename T8, typename T9>
521void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
522 ::std::ostream* os) {
523 PrintTupleTo(t, os);
524}
525
shiqiane35fdd92008-12-10 05:08:54 +0000526template <typename T1, typename T2, typename T3, typename T4, typename T5,
527 typename T6, typename T7, typename T8, typename T9, typename T10>
528void PrintTo(
529 const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
530 ::std::ostream* os) {
shiqianc97f2f52008-12-11 17:22:59 +0000531 PrintTupleTo(t, os);
shiqiane35fdd92008-12-10 05:08:54 +0000532}
533
534// Overload for std::pair.
535template <typename T1, typename T2>
536void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
537 *os << '(';
538 UniversalPrinter<T1>::Print(value.first, os);
539 *os << ", ";
540 UniversalPrinter<T2>::Print(value.second, os);
541 *os << ')';
542}
543
544// Implements printing a non-reference type T by letting the compiler
545// pick the right overload of PrintTo() for T.
546template <typename T>
547class UniversalPrinter {
548 public:
549 // MSVC warns about adding const to a function type, so we want to
550 // disable the warning.
551#ifdef _MSC_VER
552#pragma warning(push) // Saves the current warning state.
553#pragma warning(disable:4180) // Temporarily disables warning 4180.
554#endif // _MSC_VER
555
556 // Note: we deliberately don't call this PrintTo(), as that name
557 // conflicts with ::testing::internal::PrintTo in the body of the
558 // function.
559 static void Print(const T& value, ::std::ostream* os) {
560 // By default, ::testing::internal::PrintTo() is used for printing
561 // the value.
562 //
563 // Thanks to Koenig look-up, if T is a class and has its own
564 // PrintTo() function defined in its namespace, that function will
565 // be visible here. Since it is more specific than the generic ones
566 // in ::testing::internal, it will be picked by the compiler in the
567 // following statement - exactly what we want.
568 PrintTo(value, os);
569 }
570
571 // A convenient wrapper for Print() that returns the print-out as a
572 // string.
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000573 static string PrintToString(const T& value) {
shiqiane35fdd92008-12-10 05:08:54 +0000574 ::std::stringstream ss;
575 Print(value, &ss);
576 return ss.str();
577 }
578
579#ifdef _MSC_VER
580#pragma warning(pop) // Restores the warning state.
581#endif // _MSC_VER
582};
583
584// Implements printing an array type T[N].
585template <typename T, size_t N>
586class UniversalPrinter<T[N]> {
587 public:
588 // Prints the given array, omitting some elements when there are too
589 // many.
590 static void Print(const T (&a)[N], ::std::ostream* os) {
591 // Prints a char array as a C string. Note that we compare 'const
592 // T' with 'const char' instead of comparing T with char, in case
593 // that T is already a const type.
594 if (internal::type_equals<const T, const char>::value) {
595 UniversalPrinter<const T*>::Print(a, os);
596 return;
597 }
598
599 if (N == 0) {
600 *os << "{}";
601 } else {
602 *os << "{ ";
603 const size_t kThreshold = 18;
604 const size_t kChunkSize = 8;
605 // If the array has more than kThreshold elements, we'll have to
606 // omit some details by printing only the first and the last
607 // kChunkSize elements.
608 // TODO(wan): let the user control the threshold using a flag.
609 if (N <= kThreshold) {
610 PrintRawArrayTo(a, N, os);
611 } else {
612 PrintRawArrayTo(a, kChunkSize, os);
613 *os << ", ..., ";
614 PrintRawArrayTo(a + N - kChunkSize, kChunkSize, os);
615 }
616 *os << " }";
617 }
618 }
619
620 // A convenient wrapper for Print() that returns the print-out as a
621 // string.
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000622 static string PrintToString(const T (&a)[N]) {
shiqiane35fdd92008-12-10 05:08:54 +0000623 ::std::stringstream ss;
624 Print(a, &ss);
625 return ss.str();
626 }
627};
628
629// Implements printing a reference type T&.
630template <typename T>
631class UniversalPrinter<T&> {
632 public:
633 // MSVC warns about adding const to a function type, so we want to
634 // disable the warning.
635#ifdef _MSC_VER
636#pragma warning(push) // Saves the current warning state.
637#pragma warning(disable:4180) // Temporarily disables warning 4180.
638#endif // _MSC_VER
639
640 static void Print(const T& value, ::std::ostream* os) {
641 // Prints the address of the value. We use reinterpret_cast here
642 // as static_cast doesn't compile when T is a function type.
643 *os << "@" << reinterpret_cast<const void*>(&value) << " ";
644
645 // Then prints the value itself.
646 UniversalPrinter<T>::Print(value, os);
647 }
648
649 // A convenient wrapper for Print() that returns the print-out as a
650 // string.
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000651 static string PrintToString(const T& value) {
shiqiane35fdd92008-12-10 05:08:54 +0000652 ::std::stringstream ss;
653 Print(value, &ss);
654 return ss.str();
655 }
656
657#ifdef _MSC_VER
658#pragma warning(pop) // Restores the warning state.
659#endif // _MSC_VER
660};
661
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000662// Prints a value tersely: for a reference type, the referenced value
663// (but not the address) is printed; for a (const) char pointer, the
664// NUL-terminated string (but not the pointer) is printed.
zhanyong.wance198ff2009-02-12 01:34:27 +0000665template <typename T>
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000666void UniversalTersePrint(const T& value, ::std::ostream* os) {
zhanyong.wance198ff2009-02-12 01:34:27 +0000667 UniversalPrinter<T>::Print(value, os);
668}
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000669inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
670 if (str == NULL) {
671 *os << "NULL";
672 } else {
673 UniversalPrinter<string>::Print(string(str), os);
674 }
675}
676inline void UniversalTersePrint(char* str, ::std::ostream* os) {
677 UniversalTersePrint(static_cast<const char*>(str), os);
678}
679
680// Prints the fields of a tuple tersely to a string vector, one
681// element for each field. See the comment before
682// UniversalTersePrint() for how we define "tersely".
683template <typename Tuple>
684Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
685 Strings result;
686 TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
687 TersePrintPrefixToStrings(value, &result);
688 return result;
689}
zhanyong.wance198ff2009-02-12 01:34:27 +0000690
shiqiane35fdd92008-12-10 05:08:54 +0000691} // namespace internal
692} // namespace testing
693
694#endif // GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_