95 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
96 #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
106 #if GTEST_HAS_STD_TUPLE_
114 namespace internal2 {
135 template <
typename T, TypeKind kTypeKind>
150 template <
typename T>
157 short_str : (
"\n" + value.DebugString());
158 *os << (
"<" + pretty_str +
">");
162 template <
typename T>
202 template <
typename Char,
typename CharTraits,
typename T>
204 ::std::basic_ostream<Char, CharTraits>& os,
const T&
x) {
217 namespace testing_internal {
221 template <
typename T>
234 using namespace ::testing::internal2;
272 template <
typename ToPr
int,
typename OtherOperand>
281 template <
typename ToPr
int,
size_t N,
typename OtherOperand>
292 #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \
293 template <typename OtherOperand> \
294 class FormatForComparison<CharType*, OtherOperand> { \
296 static ::std::string Format(CharType* value) { \
297 return ::testing::PrintToString(static_cast<const void*>(value)); \
306 #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
311 #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
313 class FormatForComparison<CharType*, OtherStringType> { \
315 static ::std::string Format(CharType* value) { \
316 return ::testing::PrintToString(value); \
323 #if GTEST_HAS_GLOBAL_STRING
328 #if GTEST_HAS_GLOBAL_WSTRING
333 #if GTEST_HAS_STD_WSTRING
338 #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
348 template <
typename T1,
typename T2>
361 template <
typename T>
364 template <
typename T>
369 template <
typename C>
373 const size_t kMaxCount = 32;
376 for (
typename C::const_iterator
it = container.begin();
380 if (count == kMaxCount) {
403 template <
typename T>
406 T*
p, ::std::ostream*
os) {
427 *os << reinterpret_cast<const void*>(
435 template <
typename T>
438 const T&
value, ::std::ostream*
os) {
453 template <
typename T>
491 PrintTo(static_cast<unsigned char>(c), os);
496 *os << (x ?
"true" :
"false");
511 PrintTo(ImplicitCast_<const char*>(s), os);
516 inline void PrintTo(
const signed char*
s, ::std::ostream*
os) {
517 PrintTo(ImplicitCast_<const void*>(s), os);
520 PrintTo(ImplicitCast_<const void*>(s), os);
522 inline void PrintTo(
const unsigned char*
s, ::std::ostream*
os) {
523 PrintTo(ImplicitCast_<const void*>(s), os);
526 PrintTo(ImplicitCast_<const void*>(s), os);
534 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
538 PrintTo(ImplicitCast_<const wchar_t*>(s), os);
547 template <
typename T>
550 for (
size_t i = 1;
i !=
count;
i++) {
557 #if GTEST_HAS_GLOBAL_STRING
562 #endif // GTEST_HAS_GLOBAL_STRING
570 #if GTEST_HAS_GLOBAL_WSTRING
573 PrintWideStringTo(s, os);
575 #endif // GTEST_HAS_GLOBAL_WSTRING
577 #if GTEST_HAS_STD_WSTRING
580 PrintWideStringTo(s, os);
582 #endif // GTEST_HAS_STD_WSTRING
584 #if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
587 template <
typename T>
588 void PrintTupleTo(
const T&
t, ::std::ostream*
os);
589 #endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
591 #if GTEST_HAS_TR1_TUPLE
600 inline void PrintTo(const ::std::tr1::tuple<>&
t, ::std::ostream*
os) {
604 template <
typename T1>
605 void PrintTo(const ::std::tr1::tuple<T1>&
t, ::std::ostream*
os) {
609 template <
typename T1,
typename T2>
610 void PrintTo(const ::std::tr1::tuple<T1, T2>&
t, ::std::ostream*
os) {
614 template <
typename T1,
typename T2,
typename T3>
615 void PrintTo(const ::std::tr1::tuple<T1, T2, T3>&
t, ::std::ostream*
os) {
619 template <
typename T1,
typename T2,
typename T3,
typename T4>
620 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>&
t, ::std::ostream*
os) {
624 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
625 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>&
t,
626 ::std::ostream*
os) {
630 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
632 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>&
t,
633 ::std::ostream*
os) {
637 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
638 typename T6,
typename T7>
639 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>&
t,
640 ::std::ostream*
os) {
644 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
645 typename T6,
typename T7,
typename T8>
646 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>&
t,
647 ::std::ostream*
os) {
651 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
652 typename T6,
typename T7,
typename T8,
typename T9>
653 void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>&
t,
654 ::std::ostream*
os) {
658 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
659 typename T6,
typename T7,
typename T8,
typename T9,
typename T10>
661 const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>&
t,
662 ::std::ostream*
os) {
665 #endif // GTEST_HAS_TR1_TUPLE
667 #if GTEST_HAS_STD_TUPLE_
668 template <
typename... Types>
669 void PrintTo(const ::std::tuple<Types...>&
t, ::std::ostream*
os) {
672 #endif // GTEST_HAS_STD_TUPLE_
675 template <
typename T1,
typename T2>
688 template <
typename T>
715 template <
typename T>
721 const size_t kThreshold = 18;
722 const size_t kChunkSize = 8;
727 if (len <= kThreshold) {
739 const char*
begin,
size_t len, ::std::ostream*
os);
743 const wchar_t*
begin,
size_t len, ::std::ostream*
os);
746 template <
typename T,
size_t N>
757 template <
typename T>
767 *os <<
"@" <<
reinterpret_cast<const void*
>(&
value) <<
" ";
780 template <
typename T>
787 template <
typename T>
794 template <
typename T,
size_t N>
820 #if GTEST_HAS_STD_WSTRING
822 class UniversalTersePrinter<const wchar_t*> {
824 static void Print(
const wchar_t*
str, ::std::ostream*
os) {
837 static void Print(
wchar_t* str, ::std::ostream* os) {
842 template <
typename T>
851 template <
typename T>
868 template <
typename TupleT>
871 #if GTEST_HAS_TR1_TUPLE
872 template <
typename TupleT>
874 typedef TupleT Tuple;
881 static typename AddReference<
883 const Tuple&
tuple) {
884 return ::std::tr1::get<I>(
tuple);
887 template <
typename TupleT>
889 #endif // GTEST_HAS_TR1_TUPLE
891 #if GTEST_HAS_STD_TUPLE_
892 template <
typename... Types>
894 typedef ::std::tuple<Types...> Tuple;
898 struct tuple_element : ::std::tuple_element<I, Tuple> {};
902 const Tuple&
tuple) {
903 return ::std::get<I>(
tuple);
906 template <
typename... Types>
908 #endif // GTEST_HAS_STD_TUPLE_
910 #if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
920 struct TuplePrefixPrinter {
922 template <
typename Tuple>
923 static void PrintPrefixTo(
const Tuple&
t, ::std::ostream* os) {
924 TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
937 template <
typename Tuple>
938 static void TersePrintPrefixToStrings(
const Tuple& t,
Strings* strings) {
939 TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
940 ::std::stringstream ss;
942 strings->push_back(ss.str());
948 struct TuplePrefixPrinter<0> {
949 template <
typename Tuple>
950 static void PrintPrefixTo(
const Tuple&, ::std::ostream*) {}
952 template <
typename Tuple>
953 static void TersePrintPrefixToStrings(
const Tuple&,
Strings*) {}
958 template <
typename Tuple>
959 void PrintTupleTo(
const Tuple& t, ::std::ostream* os) {
961 TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::PrintPrefixTo(t, os);
968 template <
typename Tuple>
969 Strings UniversalTersePrintTupleFieldsToStrings(
const Tuple&
value) {
971 TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::
972 TersePrintPrefixToStrings(value, &result);
975 #endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
979 template <
typename T>
981 ::std::stringstream ss;
993 #endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_