summaryrefslogtreecommitdiff
path: root/absl/strings
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2020-10-28 09:57:00 -0700
committerGravatar vslashg <gfalcon@google.com>2020-10-29 12:51:15 -0400
commite9b9e38f67a008d66133535a72ada843bd66013f (patch)
tree4ce2ce2042f7c1842e58088a7a47eed55e61bf1b /absl/strings
parent962b067540f511070b7afa4cda465233b42b560a (diff)
Export of internal Abseil changes
-- 0e3e8be75b3ab243991c9b28a27623d86e4511e6 by Abseil Team <absl-team@google.com>: Add constructor overloads with signature (Mutex*, const Condition&) to MutexLock, ReaderMutexLock, WriterMutexLock, ReleasableMutexLock, MaybeMutexLock. These overloads call Mutex::LockWhen, Mutex::ReaderLockWhen, Mutex::WriterLockWhen. Using the guard classes with these new constructors replaces both manual LockWhen/Unlock sequences and the less-efficient, but popular current pattern of "absl::MutexLock lock(&mu); mu.Await(cond);". PiperOrigin-RevId: 339480213 -- ff999bc08360f5bd95557147c97b0e7b200fe3a8 by Jorg Brown <jorg@google.com>: ConvertibleToStringView wastes a lot of cycles initializing members just to reset them immediately after. Only initialize the string storage when needed. This makes StrSplit() 0-30% faster depending on the use case. PiperOrigin-RevId: 339479046 -- 0a773bfb8bc141433a41388731357001fdb34881 by Derek Mauro <dmauro@google.com>: Remove the compiler upgrade fiasco inducing -Weverything -Werror. Switch to a curated set of warnings that may be expanded in the future. PiperOrigin-RevId: 339472677 -- eab54e3e11b126283d33f64c914b200038d215a4 by Abseil Team <absl-team@google.com>: Change execute permission to match presence of the shebang remove execute permission for cmake_common.sh add execute permission for conanfile.py PiperOrigin-RevId: 339453550 -- 7f9726fb605ed20f17f3e221dbce0df03d6904c6 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 339385761 -- f3210dbee3e8a719cf31706963721722203f90e0 by Derek Mauro <dmauro@google.com>: Switch clang compiler detection to use to the Bazel supported mechanism When Abseil launched, we relied on the compiler string "llvm", which we manually set when we used the automatic crosstool generation by using the environment variable BAZEL_COMPILER. Today, Bazel detects clang and automatically sets the compiler string to "clang". Fixes #732 PiperOrigin-RevId: 339360688 -- 413211f59e5e671bf5774efa63ab4df185c74248 by Abseil Team <absl-team@google.com>: Minor comment clarifications and cosmetic tweaks. PiperOrigin-RevId: 339344301 GitOrigin-RevId: 0e3e8be75b3ab243991c9b28a27623d86e4511e6 Change-Id: Ia5b7224cd3d274c79ec7f5514fef63014f458f0f
Diffstat (limited to 'absl/strings')
-rw-r--r--absl/strings/internal/str_split_internal.h51
1 files changed, 33 insertions, 18 deletions
diff --git a/absl/strings/internal/str_split_internal.h b/absl/strings/internal/str_split_internal.h
index 49ec5392..76924771 100644
--- a/absl/strings/internal/str_split_internal.h
+++ b/absl/strings/internal/str_split_internal.h
@@ -66,41 +66,56 @@ class ConvertibleToStringView {
// Matches rvalue strings and moves their data to a member.
ConvertibleToStringView(std::string&& s) // NOLINT(runtime/explicit)
- : copy_(std::move(s)), value_(copy_) {}
+ : copy_(std::move(s)), value_(copy_), self_referential_(true) {}
ConvertibleToStringView(const ConvertibleToStringView& other)
- : copy_(other.copy_),
- value_(other.IsSelfReferential() ? copy_ : other.value_) {}
+ : value_(other.value_), self_referential_(other.self_referential_) {
+ if (other.self_referential_) {
+ new (&copy_) std::string(other.copy_);
+ value_ = copy_;
+ }
+ }
- ConvertibleToStringView(ConvertibleToStringView&& other) {
- StealMembers(std::move(other));
+ ConvertibleToStringView(ConvertibleToStringView&& other)
+ : value_(other.value_), self_referential_(other.self_referential_) {
+ if (other.self_referential_) {
+ new (&copy_) std::string(std::move(other.copy_));
+ value_ = copy_;
+ }
}
ConvertibleToStringView& operator=(ConvertibleToStringView other) {
- StealMembers(std::move(other));
+ this->~ConvertibleToStringView();
+ new (this) ConvertibleToStringView(std::move(other));
return *this;
}
absl::string_view value() const { return value_; }
- private:
- // Returns true if ctsp's value refers to its internal copy_ member.
- bool IsSelfReferential() const { return value_.data() == copy_.data(); }
+ ~ConvertibleToStringView() { MaybeReleaseCopy(); }
- void StealMembers(ConvertibleToStringView&& other) {
- if (other.IsSelfReferential()) {
- copy_ = std::move(other.copy_);
- value_ = copy_;
- other.value_ = other.copy_;
- } else {
- value_ = other.value_;
+ private:
+ void MaybeReleaseCopy() {
+ if (self_referential_) {
+ // An explicit destructor call cannot be a qualified name such as
+ // std::string. The "using" declaration works around this
+ // issue by creating an unqualified name for the destructor.
+ using string_type = std::string;
+ copy_.~string_type();
}
}
-
+ struct Unused { // MSVC disallows unions with only 1 member.
+ };
// Holds the data moved from temporary std::string arguments. Declared first
// so that 'value' can refer to 'copy_'.
- std::string copy_;
+ union {
+ std::string copy_;
+ Unused unused_;
+ };
+
absl::string_view value_;
+ // true if value_ refers to the internal copy_ member.
+ bool self_referential_ = false;
};
// An iterator that enumerates the parts of a string from a Splitter. The text