specialize UniversalPrinter<> for std::optional
This commit is contained in:
		@@ -113,7 +113,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if GTEST_HAS_ABSL
 | 
					#if GTEST_HAS_ABSL
 | 
				
			||||||
#include "absl/strings/string_view.h"
 | 
					#include "absl/strings/string_view.h"
 | 
				
			||||||
#include "absl/types/optional.h"
 | 
					 | 
				
			||||||
#endif  // GTEST_HAS_ABSL
 | 
					#endif  // GTEST_HAS_ABSL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace testing {
 | 
					namespace testing {
 | 
				
			||||||
@@ -680,14 +679,14 @@ class UniversalPrinter {
 | 
				
			|||||||
  GTEST_DISABLE_MSC_WARNINGS_POP_()
 | 
					  GTEST_DISABLE_MSC_WARNINGS_POP_()
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GTEST_HAS_ABSL
 | 
					#if GTEST_INTERNAL_HAS_OPTIONAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Printer for absl::optional
 | 
					// Printer for std::optional / absl::optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					template <typename T>
 | 
				
			||||||
class UniversalPrinter<::absl::optional<T>> {
 | 
					class UniversalPrinter<Optional<T>> {
 | 
				
			||||||
 public:
 | 
					 public:
 | 
				
			||||||
  static void Print(const ::absl::optional<T>& value, ::std::ostream* os) {
 | 
					  static void Print(const Optional<T>& value, ::std::ostream* os) {
 | 
				
			||||||
    *os << '(';
 | 
					    *os << '(';
 | 
				
			||||||
    if (!value) {
 | 
					    if (!value) {
 | 
				
			||||||
      *os << "nullopt";
 | 
					      *os << "nullopt";
 | 
				
			||||||
@@ -698,7 +697,7 @@ class UniversalPrinter<::absl::optional<T>> {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // GTEST_HAS_ABSL
 | 
					#endif  // GTEST_INTERNAL_HAS_OPTIONAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GTEST_INTERNAL_HAS_VARIANT
 | 
					#if GTEST_INTERNAL_HAS_VARIANT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -199,6 +199,8 @@
 | 
				
			|||||||
//                                        suppressed (constant conditional).
 | 
					//                                        suppressed (constant conditional).
 | 
				
			||||||
//   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127
 | 
					//   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127
 | 
				
			||||||
//                                        is suppressed.
 | 
					//                                        is suppressed.
 | 
				
			||||||
 | 
					//   GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional> or
 | 
				
			||||||
 | 
					//                                 UniversalPrinter<absl::optional> specializations.
 | 
				
			||||||
//   GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
 | 
					//   GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
 | 
				
			||||||
//                                    Matcher<absl::string_view>
 | 
					//                                    Matcher<absl::string_view>
 | 
				
			||||||
//                                    specializations.
 | 
					//                                    specializations.
 | 
				
			||||||
@@ -2225,6 +2227,36 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#endif  // !defined(GTEST_INTERNAL_DEPRECATED)
 | 
					#endif  // !defined(GTEST_INTERNAL_DEPRECATED)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if GTEST_HAS_ABSL
 | 
				
			||||||
 | 
					// Always use absl::optional for UniversalPrinter<> specializations if googletest
 | 
				
			||||||
 | 
					// is built with absl support.
 | 
				
			||||||
 | 
					# define GTEST_INTERNAL_HAS_OPTIONAL 1
 | 
				
			||||||
 | 
					#include "absl/types/optional.h"
 | 
				
			||||||
 | 
					namespace testing {
 | 
				
			||||||
 | 
					namespace internal {
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					using Optional = ::absl::optional<T>;
 | 
				
			||||||
 | 
					}  // namespace internal
 | 
				
			||||||
 | 
					}  // namespace testing
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					# ifdef __has_include
 | 
				
			||||||
 | 
					#   if __has_include(<optional>) && __cplusplus >= 201703L
 | 
				
			||||||
 | 
					// Otherwise for C++17 and higher use std::optional for UniversalPrinter<>
 | 
				
			||||||
 | 
					// specializations.
 | 
				
			||||||
 | 
					#   define GTEST_INTERNAL_HAS_OPTIONAL 1
 | 
				
			||||||
 | 
					#include <optional>
 | 
				
			||||||
 | 
					namespace testing {
 | 
				
			||||||
 | 
					namespace internal {
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					using Optional = ::std::optional<T>;
 | 
				
			||||||
 | 
					}  // namespace internal
 | 
				
			||||||
 | 
					}  // namespace testing
 | 
				
			||||||
 | 
					// The case where absl is configured NOT to alias std::optional is not
 | 
				
			||||||
 | 
					// supported.
 | 
				
			||||||
 | 
					#  endif  // __has_include(<optional>) && __cplusplus >= 201703L
 | 
				
			||||||
 | 
					# endif  // __has_include
 | 
				
			||||||
 | 
					#endif  // GTEST_HAS_ABSL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GTEST_HAS_ABSL
 | 
					#if GTEST_HAS_ABSL
 | 
				
			||||||
// Always use absl::string_view for Matcher<> specializations if googletest
 | 
					// Always use absl::string_view for Matcher<> specializations if googletest
 | 
				
			||||||
// is built with absl support.
 | 
					// is built with absl support.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1531,18 +1531,16 @@ TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {
 | 
				
			|||||||
  EXPECT_EQ("\"a\"", result[1]);
 | 
					  EXPECT_EQ("\"a\"", result[1]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GTEST_HAS_ABSL
 | 
					#if GTEST_INTERNAL_HAS_OPTIONAL
 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST(PrintOptionalTest, Basic) {
 | 
					TEST(PrintOptionalTest, Basic) {
 | 
				
			||||||
  absl::optional<int> value;
 | 
					  internal::Optional<int> value;
 | 
				
			||||||
  EXPECT_EQ("(nullopt)", PrintToString(value));
 | 
					  EXPECT_EQ("(nullopt)", PrintToString(value));
 | 
				
			||||||
  value = {7};
 | 
					  value = {7};
 | 
				
			||||||
  EXPECT_EQ("(7)", PrintToString(value));
 | 
					  EXPECT_EQ("(7)", PrintToString(value));
 | 
				
			||||||
  EXPECT_EQ("(1.1)", PrintToString(absl::optional<double>{1.1}));
 | 
					  EXPECT_EQ("(1.1)", PrintToString(internal::Optional<double>{1.1}));
 | 
				
			||||||
  EXPECT_EQ("(\"A\")", PrintToString(absl::optional<std::string>{"A"}));
 | 
					  EXPECT_EQ("(\"A\")", PrintToString(internal::Optional<std::string>{"A"}));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif  // GTEST_INTERNAL_HAS_OPTIONAL
 | 
				
			||||||
#endif  // GTEST_HAS_ABSL
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GTEST_INTERNAL_HAS_VARIANT
 | 
					#if GTEST_INTERNAL_HAS_VARIANT
 | 
				
			||||||
struct NonPrintable {
 | 
					struct NonPrintable {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user