diff options
author | Krystian Kuzniarek <krystian.kuzniarek@gmail.com> | 2020-03-07 16:03:50 (GMT) |
---|---|---|
committer | Krystian Kuzniarek <krystian.kuzniarek@gmail.com> | 2020-05-29 11:59:42 (GMT) |
commit | 843267f0f1482b470fe14201edfda2c64b68232a (patch) | |
tree | a94980e564c8bc25800839864009609df5a6be52 /googletest | |
parent | 95b0ea2cf5046465f448f01efa7c4b764a62a4bb (diff) | |
download | googletest-843267f0f1482b470fe14201edfda2c64b68232a.zip googletest-843267f0f1482b470fe14201edfda2c64b68232a.tar.gz googletest-843267f0f1482b470fe14201edfda2c64b68232a.tar.bz2 |
specialize UniversalPrinter<> for std::any (without support for RTTI)
Diffstat (limited to 'googletest')
-rw-r--r-- | googletest/include/gtest/gtest-printers.h | 20 | ||||
-rw-r--r-- | googletest/include/gtest/internal/gtest-port.h | 30 | ||||
-rw-r--r-- | googletest/test/googletest-printers-test.cc | 21 |
3 files changed, 71 insertions, 0 deletions
diff --git a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h index 4260e4f..67c87f4 100644 --- a/googletest/include/gtest/gtest-printers.h +++ b/googletest/include/gtest/gtest-printers.h @@ -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 diff --git a/googletest/include/gtest/internal/gtest-port.h b/googletest/include/gtest/internal/gtest-port.h index 377c77f..75e00cc 100644 --- a/googletest/include/gtest/internal/gtest-port.h +++ b/googletest/include/gtest/internal/gtest-port.h @@ -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 @@ -2228,6 +2230,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. # define GTEST_INTERNAL_HAS_OPTIONAL 1 diff --git a/googletest/test/googletest-printers-test.cc b/googletest/test/googletest-printers-test.cc index d71c187..3305035 100644 --- a/googletest/test/googletest-printers-test.cc +++ b/googletest/test/googletest-printers-test.cc @@ -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; |