Commit 8fbcdb90 by Abseil Team Committed by jueminyang

Export of internal Abseil changes.

--
e7f892a0b9b313b434c5f9e9a2365b377204b60e by Abseil Team <absl-team@google.com>:

Remove internal CaseEqual helper now that we have the equivalent absl::EqualsIgnoreCase.

PiperOrigin-RevId: 225189084

--
722af2c74766d2fe3cee13c8dc886d39aedda597 by Abseil Team <absl-team@google.com>:

Add -Wno-extra-semi-stmt to silence that warning.

The [-Wno-extra-semi] is already disabled in the build.  This
change will allow the build to remain consistent across newer
versions of clang which are now issuing a new similiar warning
[-Wextra-semi-stmt]:

  https://clang.llvm.org/docs/ReleaseNotes.html#major-new-features
  https://clang.llvm.org/docs/DiagnosticsReference.html#wextra-semi-stmt

PiperOrigin-RevId: 225185101

--
f7fd6244b4efcf0331631a54b7b0cf5f1f691a89 by CJ Johnson <johnsoncj@google.com>:

Move using directive in swap implementation

PiperOrigin-RevId: 225017825

--
3005841725df5b9cdb35c8a5319bb4c78b5dc2b7 by Abseil Team <absl-team@google.com>:

Update absl/strings/CMakeLists.txt to use new functions
i.e. absl_cc_(library|test)

PiperOrigin-RevId: 224860689

--
eeaf7099924b182472bfea3636ef6d9a39adfc50 by CJ Johnson <johnsoncj@google.com>:

Prefer public method over private for InlinedVector allocator access

PiperOrigin-RevId: 224825775

--
db9d218e3ca7ab400eef97778b720cb082a03281 by Eric Fiselier <ericwf@google.com>:

Take advantage of secret libc++ resize uninitialized function in string.

PiperOrigin-RevId: 224817877
GitOrigin-RevId: e7f892a0b9b313b434c5f9e9a2365b377204b60e
Change-Id: I051beee37ee03f0570bd2e068355ad75c8bdfcf8
parent 455dc17b
...@@ -149,7 +149,7 @@ class InlinedVector { ...@@ -149,7 +149,7 @@ class InlinedVector {
// Creates a copy of `other` using `other`'s allocator. // Creates a copy of `other` using `other`'s allocator.
InlinedVector(const InlinedVector& other) InlinedVector(const InlinedVector& other)
: InlinedVector(other, other.allocator()) {} : InlinedVector(other, other.get_allocator()) {}
// Creates a copy of `other` but with a specified allocator. // Creates a copy of `other` but with a specified allocator.
InlinedVector(const InlinedVector& other, const allocator_type& alloc) InlinedVector(const InlinedVector& other, const allocator_type& alloc)
...@@ -793,9 +793,9 @@ class InlinedVector { ...@@ -793,9 +793,9 @@ class InlinedVector {
// //
// Swaps the contents of this inlined vector with the contents of `other`. // Swaps the contents of this inlined vector with the contents of `other`.
void swap(InlinedVector& other) { void swap(InlinedVector& other) {
using std::swap; // Augment ADL with `std::swap`.
if (ABSL_PREDICT_FALSE(this == &other)) return; if (ABSL_PREDICT_FALSE(this == &other)) return;
using std::swap; // Augment ADL with `std::swap`.
if (allocated() && other.allocated()) { if (allocated() && other.allocated()) {
// Both out of line, so just swap the tag, allocation, and allocator. // Both out of line, so just swap the tag, allocation, and allocator.
swap(tag(), other.tag()); swap(tag(), other.tag());
......
...@@ -58,6 +58,7 @@ COPT_VARS = { ...@@ -58,6 +58,7 @@ COPT_VARS = {
# Turned off as they include valid C++ code. # Turned off as they include valid C++ code.
"-Wno-comma", "-Wno-comma",
"-Wno-extra-semi", "-Wno-extra-semi",
"-Wno-extra-semi-stmt",
"-Wno-packed", "-Wno-packed",
"-Wno-padded", "-Wno-padded",
### ###
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#define ABSL_STRINGS_INTERNAL_RESIZE_UNINITIALIZED_H_ #define ABSL_STRINGS_INTERNAL_RESIZE_UNINITIALIZED_H_
#include <string> #include <string>
#include <type_traits>
#include <utility> #include <utility>
#include "absl/base/port.h" #include "absl/base/port.h"
...@@ -27,22 +28,24 @@ namespace absl { ...@@ -27,22 +28,24 @@ namespace absl {
namespace strings_internal { namespace strings_internal {
// Is a subclass of true_type or false_type, depending on whether or not // Is a subclass of true_type or false_type, depending on whether or not
// T has a resize_uninitialized member. // T has a __resize_default_init member.
template <typename T, typename = void> template <typename string_type, typename = void>
struct HasResizeUninitialized : std::false_type {}; struct ResizeUninitializedTraits {
template <typename T> using HasMember = std::false_type;
struct HasResizeUninitialized< static void Resize(string_type* s, size_t new_size) { s->resize(new_size); }
T, absl::void_t<decltype(std::declval<T>().resize_uninitialized(237))>> };
: std::true_type {};
// __resize_default_init is provided by libc++ >= 8.0 and by Google's internal
// ::string implementation.
template <typename string_type> template <typename string_type>
void ResizeUninit(string_type* s, size_t new_size, std::true_type) { struct ResizeUninitializedTraits<
s->resize_uninitialized(new_size); string_type, absl::void_t<decltype(std::declval<string_type&>()
} .__resize_default_init(237))> > {
template <typename string_type> using HasMember = std::true_type;
void ResizeUninit(string_type* s, size_t new_size, std::false_type) { static void Resize(string_type* s, size_t new_size) {
s->resize(new_size); s->__resize_default_init(new_size);
} }
};
// Returns true if the string implementation supports a resize where // Returns true if the string implementation supports a resize where
// the new characters added to the string are left untouched. // the new characters added to the string are left untouched.
...@@ -51,7 +54,7 @@ void ResizeUninit(string_type* s, size_t new_size, std::false_type) { ...@@ -51,7 +54,7 @@ void ResizeUninit(string_type* s, size_t new_size, std::false_type) {
// the previous function.) // the previous function.)
template <typename string_type> template <typename string_type>
inline constexpr bool STLStringSupportsNontrashingResize(string_type*) { inline constexpr bool STLStringSupportsNontrashingResize(string_type*) {
return HasResizeUninitialized<string_type>(); return ResizeUninitializedTraits<string_type>::HasMember::value;
} }
// Like str->resize(new_size), except any new characters added to "*str" as a // Like str->resize(new_size), except any new characters added to "*str" as a
...@@ -60,7 +63,7 @@ inline constexpr bool STLStringSupportsNontrashingResize(string_type*) { ...@@ -60,7 +63,7 @@ inline constexpr bool STLStringSupportsNontrashingResize(string_type*) {
// store of the string with known data. Uses a Google extension to ::string. // store of the string with known data. Uses a Google extension to ::string.
template <typename string_type, typename = void> template <typename string_type, typename = void>
inline void STLStringResizeUninitialized(string_type* s, size_t new_size) { inline void STLStringResizeUninitialized(string_type* s, size_t new_size) {
ResizeUninit(s, new_size, HasResizeUninitialized<string_type>()); ResizeUninitializedTraits<string_type>::Resize(s, new_size);
} }
} // namespace strings_internal } // namespace strings_internal
......
...@@ -24,44 +24,44 @@ struct resizable_string { ...@@ -24,44 +24,44 @@ struct resizable_string {
void resize(size_t) { resize_call_count += 1; } void resize(size_t) { resize_call_count += 1; }
}; };
int resize_uninitialized_call_count = 0; int resize_default_init_call_count = 0;
struct resize_uninitializable_string { struct resize_default_init_string {
void resize(size_t) { resize_call_count += 1; } void resize(size_t) { resize_call_count += 1; }
void resize_uninitialized(size_t) { resize_uninitialized_call_count += 1; } void __resize_default_init(size_t) { resize_default_init_call_count += 1; }
}; };
TEST(ResizeUninit, WithAndWithout) { TEST(ResizeUninit, WithAndWithout) {
resize_call_count = 0; resize_call_count = 0;
resize_uninitialized_call_count = 0; resize_default_init_call_count = 0;
{ {
resizable_string rs; resizable_string rs;
EXPECT_EQ(resize_call_count, 0); EXPECT_EQ(resize_call_count, 0);
EXPECT_EQ(resize_uninitialized_call_count, 0); EXPECT_EQ(resize_default_init_call_count, 0);
EXPECT_FALSE( EXPECT_FALSE(
absl::strings_internal::STLStringSupportsNontrashingResize(&rs)); absl::strings_internal::STLStringSupportsNontrashingResize(&rs));
EXPECT_EQ(resize_call_count, 0); EXPECT_EQ(resize_call_count, 0);
EXPECT_EQ(resize_uninitialized_call_count, 0); EXPECT_EQ(resize_default_init_call_count, 0);
absl::strings_internal::STLStringResizeUninitialized(&rs, 237); absl::strings_internal::STLStringResizeUninitialized(&rs, 237);
EXPECT_EQ(resize_call_count, 1); EXPECT_EQ(resize_call_count, 1);
EXPECT_EQ(resize_uninitialized_call_count, 0); EXPECT_EQ(resize_default_init_call_count, 0);
} }
resize_call_count = 0; resize_call_count = 0;
resize_uninitialized_call_count = 0; resize_default_init_call_count = 0;
{ {
resize_uninitializable_string rus; resize_default_init_string rus;
EXPECT_EQ(resize_call_count, 0); EXPECT_EQ(resize_call_count, 0);
EXPECT_EQ(resize_uninitialized_call_count, 0); EXPECT_EQ(resize_default_init_call_count, 0);
EXPECT_TRUE( EXPECT_TRUE(
absl::strings_internal::STLStringSupportsNontrashingResize(&rus)); absl::strings_internal::STLStringSupportsNontrashingResize(&rus));
EXPECT_EQ(resize_call_count, 0); EXPECT_EQ(resize_call_count, 0);
EXPECT_EQ(resize_uninitialized_call_count, 0); EXPECT_EQ(resize_default_init_call_count, 0);
absl::strings_internal::STLStringResizeUninitialized(&rus, 237); absl::strings_internal::STLStringResizeUninitialized(&rus, 237);
EXPECT_EQ(resize_call_count, 0); EXPECT_EQ(resize_call_count, 0);
EXPECT_EQ(resize_uninitialized_call_count, 1); EXPECT_EQ(resize_default_init_call_count, 1);
} }
} }
......
...@@ -18,15 +18,6 @@ ...@@ -18,15 +18,6 @@
namespace absl { namespace absl {
namespace {
bool CaseEqual(absl::string_view piece1, absl::string_view piece2) {
return (piece1.size() == piece2.size() &&
0 == strings_internal::memcasecmp(piece1.data(), piece2.data(),
piece1.size()));
// memcasecmp uses ascii_tolower().
}
} // namespace
bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2) { bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2) {
return (piece1.size() == piece2.size() && return (piece1.size() == piece2.size() &&
0 == absl::strings_internal::memcasecmp(piece1.data(), piece2.data(), 0 == absl::strings_internal::memcasecmp(piece1.data(), piece2.data(),
...@@ -36,12 +27,12 @@ bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2) { ...@@ -36,12 +27,12 @@ bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2) {
bool StartsWithIgnoreCase(absl::string_view text, absl::string_view prefix) { bool StartsWithIgnoreCase(absl::string_view text, absl::string_view prefix) {
return (text.size() >= prefix.size()) && return (text.size() >= prefix.size()) &&
CaseEqual(text.substr(0, prefix.size()), prefix); EqualsIgnoreCase(text.substr(0, prefix.size()), prefix);
} }
bool EndsWithIgnoreCase(absl::string_view text, absl::string_view suffix) { bool EndsWithIgnoreCase(absl::string_view text, absl::string_view suffix) {
return (text.size() >= suffix.size()) && return (text.size() >= suffix.size()) &&
CaseEqual(text.substr(text.size() - suffix.size()), suffix); EqualsIgnoreCase(text.substr(text.size() - suffix.size()), suffix);
} }
} // namespace absl } // namespace absl
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment