utils/fragmented_temporary_buffer_view: add remove suffix

This patch adds fragmented_temporary_buffer_view::remove_suffix(). It is
also necessary to adjust remove_prefix() since now the total size of all
fragments may be larger than the size of the view if both those
operations are performed.
This commit is contained in:
Paweł Dziepak
2019-03-04 10:00:14 +00:00
parent 8f71e7ffd4
commit ca8d1025c0
2 changed files with 43 additions and 3 deletions

View File

@@ -133,6 +133,39 @@ SEASTAR_THREAD_TEST_CASE(test_view) {
data_view.remove_prefix(data_view.size());
test(frag_view);
data_view = bytes_view(data);
frag_view = fragmented_temporary_buffer::view(frag_buffer);
frag_view.remove_suffix(sizeof(value2) - 1);
data_view.remove_suffix(sizeof(value2) - 1);
test(frag_view);
frag_view.remove_suffix(data_view.size());
data_view.remove_suffix(data_view.size());
test(frag_view);
data_view = bytes_view(data);
frag_view = fragmented_temporary_buffer::view(frag_buffer);
frag_view.remove_suffix(sizeof(value2) - 1);
data_view.remove_suffix(sizeof(value2) - 1);
test(frag_view);
frag_view.remove_prefix(data_view.size());
data_view.remove_prefix(data_view.size());
test(frag_view);
data_view = bytes_view(data);
frag_view = fragmented_temporary_buffer::view(frag_buffer);
frag_view.remove_prefix(sizeof(value2) - 1);
data_view.remove_prefix(sizeof(value2) - 1);
test(frag_view);
frag_view.remove_suffix(data_view.size());
data_view.remove_suffix(data_view.size());
test(frag_view);
data_view = bytes_view(data);
}

View File

@@ -180,21 +180,28 @@ public:
if (!_total_size) {
return;
}
_total_size -= n;
while (n > _current_size) {
_total_size -= _current_size;
n -= _current_size;
++_current;
_current_size = _current->size();
_current_size = std::min(_current->size(), _total_size);
}
_total_size -= n;
_current_size -= n;
_current_position = _current->get() + n;
if (!_current_size && _total_size) {
++_current;
_current_size = _current->size();
_current_size = std::min(_current->size(), _total_size);
_current_position = _current->get();
}
}
// Invalidates iterators
void remove_suffix(size_t n) noexcept {
_total_size -= n;
_current_size = std::min(_current_size, _total_size);
}
bool operator==(const fragmented_temporary_buffer::view& other) const noexcept {
auto this_it = begin();
auto other_it = other.begin();