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
pull/1284/head
Martijn Vels 2 years ago committed by Copybara-Service
parent b39aa365e1
commit 92bc0b6b68
  1. 16
      absl/strings/cord.h
  2. 23
      absl/strings/internal/cord_internal.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<const char*>(&data_) + 8, sizeof(x));
memcpy(&y, reinterpret_cast<const char*>(&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);

@ -582,6 +582,29 @@ class InlineData {
tag() = static_cast<char>(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 {

Loading…
Cancel
Save