specialize UniversalPrinter<> for std::any (without support for RTTI)
This commit is contained in:
		@@ -103,6 +103,7 @@ cc_library(
 | 
			
		||||
            "@com_google_absl//absl/debugging:stacktrace",
 | 
			
		||||
            "@com_google_absl//absl/debugging:symbolize",
 | 
			
		||||
            "@com_google_absl//absl/strings",
 | 
			
		||||
            "@com_google_absl//absl/types:any",
 | 
			
		||||
            "@com_google_absl//absl/types:optional",
 | 
			
		||||
            "@com_google_absl//absl/types:variant",
 | 
			
		||||
        ],
 | 
			
		||||
 
 | 
			
		||||
@@ -679,6 +679,26 @@ class UniversalPrinter {
 | 
			
		||||
  GTEST_DISABLE_MSC_WARNINGS_POP_()
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if GTEST_INTERNAL_HAS_ANY
 | 
			
		||||
 | 
			
		||||
// Printer for std::any / absl::any
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
class UniversalPrinter<Any> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(const Any& value, ::std::ostream* os) {
 | 
			
		||||
    if (value.has_value())
 | 
			
		||||
      *os << "'any' type with value of type " << GetTypeName();
 | 
			
		||||
    else
 | 
			
		||||
      *os << "'any' type with no value";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static std::string GetTypeName() { return "the element type"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INTERNAL_HAS_ANY
 | 
			
		||||
 | 
			
		||||
#if GTEST_INTERNAL_HAS_OPTIONAL
 | 
			
		||||
 | 
			
		||||
// Printer for std::optional / absl::optional
 | 
			
		||||
 
 | 
			
		||||
@@ -199,6 +199,8 @@
 | 
			
		||||
//                                        suppressed (constant conditional).
 | 
			
		||||
//   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127
 | 
			
		||||
//                                        is suppressed.
 | 
			
		||||
//   GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or
 | 
			
		||||
//                            UniversalPrinter<absl::any> specializations.
 | 
			
		||||
//   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
 | 
			
		||||
@@ -2227,6 +2229,34 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
 | 
			
		||||
 | 
			
		||||
#endif  // !defined(GTEST_INTERNAL_DEPRECATED)
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_ABSL
 | 
			
		||||
// Always use absl::any for UniversalPrinter<> specializations if googletest
 | 
			
		||||
// is built with absl support.
 | 
			
		||||
# define GTEST_INTERNAL_HAS_ANY 1
 | 
			
		||||
#include "absl/types/any.h"
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
using Any = ::absl::any;
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
#else
 | 
			
		||||
# ifdef __has_include
 | 
			
		||||
#   if __has_include(<any>) && __cplusplus >= 201703L
 | 
			
		||||
// Otherwise for C++17 and higher use std::any for UniversalPrinter<>
 | 
			
		||||
// specializations.
 | 
			
		||||
#   define GTEST_INTERNAL_HAS_ANY 1
 | 
			
		||||
#include <any>
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
using Any = ::std::any;
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
// The case where absl is configured NOT to alias std::any is not
 | 
			
		||||
// supported.
 | 
			
		||||
#  endif  // __has_include(<any>) && __cplusplus >= 201703L
 | 
			
		||||
# endif  // __has_include
 | 
			
		||||
#endif  // GTEST_HAS_ABSL
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_ABSL
 | 
			
		||||
// Always use absl::optional for UniversalPrinter<> specializations if googletest
 | 
			
		||||
// is built with absl support.
 | 
			
		||||
 
 | 
			
		||||
@@ -1531,6 +1531,27 @@ TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {
 | 
			
		||||
  EXPECT_EQ("\"a\"", result[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_INTERNAL_HAS_ANY
 | 
			
		||||
TEST(PrintAnyTest, Empty) {
 | 
			
		||||
  internal::Any any;
 | 
			
		||||
  EXPECT_EQ("'any' type with no value", PrintToString(any));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(PrintAnyTest, NonEmpty) {
 | 
			
		||||
  internal::Any any;
 | 
			
		||||
  constexpr int val1 = 10;
 | 
			
		||||
  const std::string val2 = "content";
 | 
			
		||||
 | 
			
		||||
  any = val1;
 | 
			
		||||
  EXPECT_EQ("'any' type with value of type the element type",
 | 
			
		||||
            PrintToString(any));
 | 
			
		||||
 | 
			
		||||
  any = val2;
 | 
			
		||||
  EXPECT_EQ("'any' type with value of type the element type",
 | 
			
		||||
            PrintToString(any));
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_INTERNAL_HAS_ANY
 | 
			
		||||
 | 
			
		||||
#if GTEST_INTERNAL_HAS_OPTIONAL
 | 
			
		||||
TEST(PrintOptionalTest, Basic) {
 | 
			
		||||
  internal::Optional<int> value;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user