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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user