| OLD | NEW |
| 1 // Copyright 2007, Google Inc. | 1 // Copyright 2007, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 } | 402 } |
| 403 | 403 |
| 404 // Overloads for ::string and ::std::string. | 404 // Overloads for ::string and ::std::string. |
| 405 #if GTEST_HAS_GLOBAL_STRING | 405 #if GTEST_HAS_GLOBAL_STRING |
| 406 void PrintStringTo(const ::string&s, ::std::ostream* os); | 406 void PrintStringTo(const ::string&s, ::std::ostream* os); |
| 407 inline void PrintTo(const ::string& s, ::std::ostream* os) { | 407 inline void PrintTo(const ::string& s, ::std::ostream* os) { |
| 408 PrintStringTo(s, os); | 408 PrintStringTo(s, os); |
| 409 } | 409 } |
| 410 #endif // GTEST_HAS_GLOBAL_STRING | 410 #endif // GTEST_HAS_GLOBAL_STRING |
| 411 | 411 |
| 412 #if GTEST_HAS_STD_STRING | |
| 413 void PrintStringTo(const ::std::string&s, ::std::ostream* os); | 412 void PrintStringTo(const ::std::string&s, ::std::ostream* os); |
| 414 inline void PrintTo(const ::std::string& s, ::std::ostream* os) { | 413 inline void PrintTo(const ::std::string& s, ::std::ostream* os) { |
| 415 PrintStringTo(s, os); | 414 PrintStringTo(s, os); |
| 416 } | 415 } |
| 417 #endif // GTEST_HAS_STD_STRING | |
| 418 | 416 |
| 419 // Overloads for ::wstring and ::std::wstring. | 417 // Overloads for ::wstring and ::std::wstring. |
| 420 #if GTEST_HAS_GLOBAL_WSTRING | 418 #if GTEST_HAS_GLOBAL_WSTRING |
| 421 void PrintWideStringTo(const ::wstring&s, ::std::ostream* os); | 419 void PrintWideStringTo(const ::wstring&s, ::std::ostream* os); |
| 422 inline void PrintTo(const ::wstring& s, ::std::ostream* os) { | 420 inline void PrintTo(const ::wstring& s, ::std::ostream* os) { |
| 423 PrintWideStringTo(s, os); | 421 PrintWideStringTo(s, os); |
| 424 } | 422 } |
| 425 #endif // GTEST_HAS_GLOBAL_WSTRING | 423 #endif // GTEST_HAS_GLOBAL_WSTRING |
| 426 | 424 |
| 427 #if GTEST_HAS_STD_WSTRING | 425 #if GTEST_HAS_STD_WSTRING |
| 428 void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); | 426 void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); |
| 429 inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { | 427 inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { |
| 430 PrintWideStringTo(s, os); | 428 PrintWideStringTo(s, os); |
| 431 } | 429 } |
| 432 #endif // GTEST_HAS_STD_WSTRING | 430 #endif // GTEST_HAS_STD_WSTRING |
| 433 | 431 |
| 434 // Overload for ::std::tr1::tuple. Needed for printing function | 432 // Overload for ::std::tr1::tuple. Needed for printing function |
| 435 // arguments, which are packed as tuples. | 433 // arguments, which are packed as tuples. |
| 436 | 434 |
| 437 typedef ::std::vector<string> Strings; | |
| 438 | |
| 439 // This helper template allows PrintTo() for tuples and | |
| 440 // UniversalTersePrintTupleFieldsToStrings() to be defined by | |
| 441 // induction on the number of tuple fields. The idea is that | |
| 442 // TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N | |
| 443 // fields in tuple t, and can be defined in terms of | |
| 444 // TuplePrefixPrinter<N - 1>. | |
| 445 | |
| 446 // The inductive case. | |
| 447 template <size_t N> | |
| 448 struct TuplePrefixPrinter { | |
| 449 // Prints the first N fields of a tuple. | |
| 450 template <typename Tuple> | |
| 451 static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { | |
| 452 TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os); | |
| 453 *os << ", "; | |
| 454 UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type> | |
| 455 ::Print(::std::tr1::get<N - 1>(t), os); | |
| 456 } | |
| 457 | |
| 458 // Tersely prints the first N fields of a tuple to a string vector, | |
| 459 // one element for each field. | |
| 460 template <typename Tuple> | |
| 461 static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { | |
| 462 TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings); | |
| 463 ::std::stringstream ss; | |
| 464 UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss); | |
| 465 strings->push_back(ss.str()); | |
| 466 } | |
| 467 }; | |
| 468 | |
| 469 // Base cases. | |
| 470 template <> | |
| 471 struct TuplePrefixPrinter<0> { | |
| 472 template <typename Tuple> | |
| 473 static void PrintPrefixTo(const Tuple&, ::std::ostream*) {} | |
| 474 | |
| 475 template <typename Tuple> | |
| 476 static void TersePrintPrefixToStrings(const Tuple&, Strings*) {} | |
| 477 }; | |
| 478 template <> | |
| 479 template <typename Tuple> | |
| 480 void TuplePrefixPrinter<1>::PrintPrefixTo(const Tuple& t, ::std::ostream* os) { | |
| 481 UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>:: | |
| 482 Print(::std::tr1::get<0>(t), os); | |
| 483 } | |
| 484 | |
| 485 // Helper function for printing a tuple. T must be instantiated with | 435 // Helper function for printing a tuple. T must be instantiated with |
| 486 // a tuple type. | 436 // a tuple type. |
| 487 template <typename T> | 437 template <typename T> |
| 488 void PrintTupleTo(const T& t, ::std::ostream* os) { | 438 void PrintTupleTo(const T& t, ::std::ostream* os); |
| 489 *os << "("; | |
| 490 TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>:: | |
| 491 PrintPrefixTo(t, os); | |
| 492 *os << ")"; | |
| 493 } | |
| 494 | 439 |
| 495 // Overloaded PrintTo() for tuples of various arities. We support | 440 // Overloaded PrintTo() for tuples of various arities. We support |
| 496 // tuples of up-to 10 fields. The following implementation works | 441 // tuples of up-to 10 fields. The following implementation works |
| 497 // regardless of whether tr1::tuple is implemented using the | 442 // regardless of whether tr1::tuple is implemented using the |
| 498 // non-standard variadic template feature or not. | 443 // non-standard variadic template feature or not. |
| 499 | 444 |
| 500 inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) { | 445 inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) { |
| 501 PrintTupleTo(t, os); | 446 PrintTupleTo(t, os); |
| 502 } | 447 } |
| 503 | 448 |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 | 663 |
| 719 // Prints a value using the type inferred by the compiler. The | 664 // Prints a value using the type inferred by the compiler. The |
| 720 // difference between this and UniversalTersePrint() is that for a | 665 // difference between this and UniversalTersePrint() is that for a |
| 721 // (const) char pointer, this prints both the pointer and the | 666 // (const) char pointer, this prints both the pointer and the |
| 722 // NUL-terminated string. | 667 // NUL-terminated string. |
| 723 template <typename T> | 668 template <typename T> |
| 724 void UniversalPrint(const T& value, ::std::ostream* os) { | 669 void UniversalPrint(const T& value, ::std::ostream* os) { |
| 725 UniversalPrinter<T>::Print(value, os); | 670 UniversalPrinter<T>::Print(value, os); |
| 726 } | 671 } |
| 727 | 672 |
| 673 typedef ::std::vector<string> Strings; |
| 674 |
| 675 // This helper template allows PrintTo() for tuples and |
| 676 // UniversalTersePrintTupleFieldsToStrings() to be defined by |
| 677 // induction on the number of tuple fields. The idea is that |
| 678 // TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N |
| 679 // fields in tuple t, and can be defined in terms of |
| 680 // TuplePrefixPrinter<N - 1>. |
| 681 |
| 682 // The inductive case. |
| 683 template <size_t N> |
| 684 struct TuplePrefixPrinter { |
| 685 // Prints the first N fields of a tuple. |
| 686 template <typename Tuple> |
| 687 static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { |
| 688 TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os); |
| 689 *os << ", "; |
| 690 UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type> |
| 691 ::Print(::std::tr1::get<N - 1>(t), os); |
| 692 } |
| 693 |
| 694 // Tersely prints the first N fields of a tuple to a string vector, |
| 695 // one element for each field. |
| 696 template <typename Tuple> |
| 697 static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { |
| 698 TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings); |
| 699 ::std::stringstream ss; |
| 700 UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss); |
| 701 strings->push_back(ss.str()); |
| 702 } |
| 703 }; |
| 704 |
| 705 // Base cases. |
| 706 template <> |
| 707 struct TuplePrefixPrinter<0> { |
| 708 template <typename Tuple> |
| 709 static void PrintPrefixTo(const Tuple&, ::std::ostream*) {} |
| 710 |
| 711 template <typename Tuple> |
| 712 static void TersePrintPrefixToStrings(const Tuple&, Strings*) {} |
| 713 }; |
| 714 template <> |
| 715 template <typename Tuple> |
| 716 void TuplePrefixPrinter<1>::PrintPrefixTo(const Tuple& t, ::std::ostream* os) { |
| 717 UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>:: |
| 718 Print(::std::tr1::get<0>(t), os); |
| 719 } |
| 720 |
| 721 // Helper function for printing a tuple. T must be instantiated with |
| 722 // a tuple type. |
| 723 template <typename T> |
| 724 void PrintTupleTo(const T& t, ::std::ostream* os) { |
| 725 *os << "("; |
| 726 TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>:: |
| 727 PrintPrefixTo(t, os); |
| 728 *os << ")"; |
| 729 } |
| 730 |
| 728 // Prints the fields of a tuple tersely to a string vector, one | 731 // Prints the fields of a tuple tersely to a string vector, one |
| 729 // element for each field. See the comment before | 732 // element for each field. See the comment before |
| 730 // UniversalTersePrint() for how we define "tersely". | 733 // UniversalTersePrint() for how we define "tersely". |
| 731 template <typename Tuple> | 734 template <typename Tuple> |
| 732 Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { | 735 Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { |
| 733 Strings result; | 736 Strings result; |
| 734 TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>:: | 737 TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>:: |
| 735 TersePrintPrefixToStrings(value, &result); | 738 TersePrintPrefixToStrings(value, &result); |
| 736 return result; | 739 return result; |
| 737 } | 740 } |
| 738 | 741 |
| 739 } // namespace internal | 742 } // namespace internal |
| 740 } // namespace testing | 743 } // namespace testing |
| 741 | 744 |
| 742 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_ | 745 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_ |
| OLD | NEW |