From 28528f595ebe3553ddb465de24f21ae8bbfb5c37 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Tue, 10 Dec 2024 12:14:58 -0800 Subject: [PATCH] Add support for std::string_view in StrCat even when absl::string_view != std::string_view. PiperOrigin-RevId: 704802270 Change-Id: I8293f755a688707db575f0df22440f24ffad430e --- absl/strings/BUILD.bazel | 1 + absl/strings/CMakeLists.txt | 1 + absl/strings/str_cat.h | 11 +++++++++++ absl/strings/str_cat_test.cc | 13 +++++++++++++ 4 files changed, 26 insertions(+) diff --git a/absl/strings/BUILD.bazel b/absl/strings/BUILD.bazel index 00ed5270..1b5fbea6 100644 --- a/absl/strings/BUILD.bazel +++ b/absl/strings/BUILD.bazel @@ -1118,6 +1118,7 @@ cc_test( deps = [ ":str_format", ":strings", + "//absl/base:config", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", ], diff --git a/absl/strings/CMakeLists.txt b/absl/strings/CMakeLists.txt index f6f4b10e..993d7517 100644 --- a/absl/strings/CMakeLists.txt +++ b/absl/strings/CMakeLists.txt @@ -371,6 +371,7 @@ absl_cc_test( DEPS absl::strings absl::str_format + absl::config absl::core_headers GTest::gmock_main ) diff --git a/absl/strings/str_cat.h b/absl/strings/str_cat.h index b98adc02..1a806627 100644 --- a/absl/strings/str_cat.h +++ b/absl/strings/str_cat.h @@ -101,6 +101,7 @@ #include #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/nullability.h" #include "absl/base/port.h" #include "absl/meta/type_traits.h" @@ -110,6 +111,10 @@ #include "absl/strings/numbers.h" #include "absl/strings/string_view.h" +#if defined(ABSL_HAVE_STD_STRING_VIEW) && !defined(ABSL_USES_STD_STRING_VIEW) +#include +#endif + namespace absl { ABSL_NAMESPACE_BEGIN @@ -361,6 +366,12 @@ class AlphaNum { ABSL_ATTRIBUTE_LIFETIME_BOUND) : piece_(pc) {} +#if defined(ABSL_HAVE_STD_STRING_VIEW) && !defined(ABSL_USES_STD_STRING_VIEW) + AlphaNum(std::string_view pc // NOLINT(runtime/explicit) + ABSL_ATTRIBUTE_LIFETIME_BOUND) + : piece_(pc.data(), pc.size()) {} +#endif // !ABSL_USES_STD_STRING_VIEW + template ::value>::type> AlphaNum( // NOLINT(runtime/explicit) diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc index 66eddf0d..fb11734d 100644 --- a/absl/strings/str_cat_test.cc +++ b/absl/strings/str_cat_test.cc @@ -24,9 +24,14 @@ #include #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h" +#if defined(ABSL_HAVE_STD_STRING_VIEW) +#include +#endif + #ifdef __ANDROID__ // Android assert messages only go to system log, so death tests cannot inspect // the message for matching. @@ -214,6 +219,14 @@ TEST(StrCat, CornerCases) { EXPECT_EQ(result, ""); } +#if defined(ABSL_HAVE_STD_STRING_VIEW) +TEST(StrCat, StdStringView) { + std::string_view pieces[] = {"Hello", ", ", "World", "!"}; + EXPECT_EQ(absl::StrCat(pieces[0], pieces[1], pieces[2], pieces[3]), + "Hello, World!"); +} +#endif // ABSL_HAVE_STD_STRING_VIEW + TEST(StrCat, NullConstCharPtr) { const char* null = nullptr; EXPECT_EQ(absl::StrCat("mon", null, "key"), "monkey");