From 92bc0b6b68cd138aefeb94d566499f5bf14f859f Mon Sep 17 00:00:00 2001 From: Martijn Vels Date: Thu, 29 Sep 2022 18:14:53 -0700 Subject: Cleanup: Move BitwiseCompare() to InlineData, and make it layout independent. This removes layout specific details from InlineData from cord.h, making future platform specific internal layout changes easier to land. PiperOrigin-RevId: 477869206 Change-Id: I1d417af47d7f04e34a98ba7b93ae591ece8f9151 --- absl/strings/cord.h | 16 +--------------- absl/strings/internal/cord_internal.h | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 15 deletions(-) (limited to 'absl') diff --git a/absl/strings/cord.h b/absl/strings/cord.h index e8267ab1..d7e5a45e 100644 --- a/absl/strings/cord.h +++ b/absl/strings/cord.h @@ -876,20 +876,6 @@ class Cord { bool IsSame(const InlineRep& other) const { return memcmp(&data_, &other.data_, sizeof(data_)) == 0; } - int BitwiseCompare(const InlineRep& other) const { - uint64_t x, y; - // Use memcpy to avoid aliasing issues. - memcpy(&x, &data_, sizeof(x)); - memcpy(&y, &other.data_, sizeof(y)); - if (x == y) { - memcpy(&x, reinterpret_cast(&data_) + 8, sizeof(x)); - memcpy(&y, reinterpret_cast(&other.data_) + 8, sizeof(y)); - if (x == y) return 0; - } - return absl::big_endian::FromHost64(x) < absl::big_endian::FromHost64(y) - ? -1 - : 1; - } void CopyTo(std::string* dst) const { // memcpy is much faster when operating on a known size. On most supported // platforms, the small string optimization is large enough that resizing @@ -1387,7 +1373,7 @@ extern template void Cord::Prepend(std::string&& src); inline int Cord::Compare(const Cord& rhs) const { if (!contents_.is_tree() && !rhs.contents_.is_tree()) { - return contents_.BitwiseCompare(rhs.contents_); + return contents_.data_.Compare(rhs.contents_.data_); } return CompareImpl(rhs); diff --git a/absl/strings/internal/cord_internal.h b/absl/strings/internal/cord_internal.h index 601457ee..f32fd416 100644 --- a/absl/strings/internal/cord_internal.h +++ b/absl/strings/internal/cord_internal.h @@ -582,6 +582,29 @@ class InlineData { tag() = static_cast(size << 1); } + // Compares 'this' inlined data with rhs. The comparison is a straightforward + // lexicographic comparison. `Compare()` returns values as follows: + // + // -1 'this' InlineData instance is smaller + // 0 the InlineData instances are equal + // 1 'this' InlineData instance larger + int Compare(const InlineData& rhs) const { + uint64_t x, y; + memcpy(&x, as_chars(), sizeof(x)); + memcpy(&y, rhs.as_chars(), sizeof(y)); + if (x == y) { + memcpy(&x, as_chars() + 7, sizeof(x)); + memcpy(&y, rhs.as_chars() + 7, sizeof(y)); + if (x == y) { + if (inline_size() == rhs.inline_size()) return 0; + return inline_size() < rhs.inline_size() ? -1 : 1; + } + } + x = absl::big_endian::FromHost64(x); + y = absl::big_endian::FromHost64(y); + return x < y ? -1 : 1; + } + private: // See cordz_info_t for forced alignment and size of `cordz_info` details. struct AsTree { -- cgit v1.2.3