mirror of
https://github.com/google/googletest.git
synced 2025-01-15 00:47:54 +08:00
specialize UniversalPrinter<> for std::any (without support for RTTI)
This commit is contained in:
parent
95b0ea2cf5
commit
843267f0f1
@ -103,6 +103,7 @@ cc_library(
|
|||||||
"@com_google_absl//absl/debugging:stacktrace",
|
"@com_google_absl//absl/debugging:stacktrace",
|
||||||
"@com_google_absl//absl/debugging:symbolize",
|
"@com_google_absl//absl/debugging:symbolize",
|
||||||
"@com_google_absl//absl/strings",
|
"@com_google_absl//absl/strings",
|
||||||
|
"@com_google_absl//absl/types:any",
|
||||||
"@com_google_absl//absl/types:optional",
|
"@com_google_absl//absl/types:optional",
|
||||||
"@com_google_absl//absl/types:variant",
|
"@com_google_absl//absl/types:variant",
|
||||||
],
|
],
|
||||||
|
@ -679,6 +679,26 @@ class UniversalPrinter {
|
|||||||
GTEST_DISABLE_MSC_WARNINGS_POP_()
|
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
|
#if GTEST_INTERNAL_HAS_OPTIONAL
|
||||||
|
|
||||||
// Printer for std::optional / absl::optional
|
// Printer for std::optional / absl::optional
|
||||||
|
@ -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_ANY - for enabling UniversalPrinter<std::any> or
|
||||||
|
// UniversalPrinter<absl::any> specializations.
|
||||||
// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional> or
|
// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional> or
|
||||||
// UniversalPrinter<absl::optional> specializations.
|
// 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
|
||||||
@ -2227,6 +2229,34 @@ 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::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
|
#if GTEST_HAS_ABSL
|
||||||
// Always use absl::optional for UniversalPrinter<> specializations if googletest
|
// Always use absl::optional for UniversalPrinter<> specializations if googletest
|
||||||
// is built with absl support.
|
// is built with absl support.
|
||||||
|
@ -1531,6 +1531,27 @@ TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {
|
|||||||
EXPECT_EQ("\"a\"", result[1]);
|
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
|
#if GTEST_INTERNAL_HAS_OPTIONAL
|
||||||
TEST(PrintOptionalTest, Basic) {
|
TEST(PrintOptionalTest, Basic) {
|
||||||
internal::Optional<int> value;
|
internal::Optional<int> value;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user