Commit 516c6266 by Martijn Vels Committed by Copybara-Service

Cleanup: implement PrependArray and PrependPrecise in terms of InlineData

This removes layout specific details from InlineData from cord.cc, making future platform specific internal layout changes easier to land.

PiperOrigin-RevId: 477870559
Change-Id: I26e428ef280d593ad321cf7875e05adcb1cb6438
parent 92bc0b6b
...@@ -610,11 +610,11 @@ void Cord::PrependArray(absl::string_view src, MethodIdentifier method) { ...@@ -610,11 +610,11 @@ void Cord::PrependArray(absl::string_view src, MethodIdentifier method) {
size_t cur_size = contents_.inline_size(); size_t cur_size = contents_.inline_size();
if (cur_size + src.size() <= InlineRep::kMaxInline) { if (cur_size + src.size() <= InlineRep::kMaxInline) {
// Use embedded storage. // Use embedded storage.
char data[InlineRep::kMaxInline + 1] = {0}; InlineData data;
memcpy(data, src.data(), src.size()); memcpy(data.as_chars(), src.data(), src.size());
memcpy(data + src.size(), contents_.data(), cur_size); memcpy(data.as_chars() + src.size(), contents_.data(), cur_size);
memcpy(contents_.data_.as_chars(), data, InlineRep::kMaxInline + 1); data.set_inline_size(cur_size + src.size());
contents_.set_inline_size(cur_size + src.size()); contents_.data_ = data;
return; return;
} }
} }
...@@ -638,12 +638,12 @@ void Cord::PrependPrecise(absl::string_view src, MethodIdentifier method) { ...@@ -638,12 +638,12 @@ void Cord::PrependPrecise(absl::string_view src, MethodIdentifier method) {
assert(!src.empty()); assert(!src.empty());
assert(src.size() <= cord_internal::kMaxFlatLength); assert(src.size() <= cord_internal::kMaxFlatLength);
if (contents_.remaining_inline_capacity() >= src.size()) { if (contents_.remaining_inline_capacity() >= src.size()) {
const size_t inline_length = contents_.inline_size(); const size_t cur_size = contents_.inline_size();
char data[InlineRep::kMaxInline + 1] = {0}; InlineData data;
memcpy(data, src.data(), src.size()); memcpy(data.as_chars(), src.data(), src.size());
memcpy(data + src.size(), contents_.data(), inline_length); memcpy(data.as_chars() + src.size(), contents_.data(), cur_size);
memcpy(contents_.data_.as_chars(), data, InlineRep::kMaxInline + 1); data.set_inline_size(cur_size + src.size());
contents_.set_inline_size(inline_length + src.size()); contents_.data_ = data;
} else { } else {
contents_.PrependTree(CordRepFlat::Create(src), method); contents_.PrependTree(CordRepFlat::Create(src), method);
} }
......
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