specialize UniversalPrinter<> for std::optional
This commit is contained in:
parent
33b44c4b35
commit
95b0ea2cf5
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user