From ca8d1025c09af7ff03e63292056434ade0e2df64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Dziepak?= Date: Mon, 4 Mar 2019 10:00:14 +0000 Subject: [PATCH] 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. --- tests/fragmented_temporary_buffer_test.cc | 33 +++++++++++++++++++++++ utils/fragmented_temporary_buffer.hh | 13 ++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/tests/fragmented_temporary_buffer_test.cc b/tests/fragmented_temporary_buffer_test.cc index c94e879a5c..c3add5f752 100644 --- a/tests/fragmented_temporary_buffer_test.cc +++ b/tests/fragmented_temporary_buffer_test.cc @@ -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); } diff --git a/utils/fragmented_temporary_buffer.hh b/utils/fragmented_temporary_buffer.hh index c7cc49447b..f1c6db798f 100644 --- a/utils/fragmented_temporary_buffer.hh +++ b/utils/fragmented_temporary_buffer.hh @@ -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();