diff --git a/bytes_ostream.hh b/bytes_ostream.hh index a11d10684e..1389325b42 100644 --- a/bytes_ostream.hh +++ b/bytes_ostream.hh @@ -53,6 +53,10 @@ public: using difference_type = std::ptrdiff_t; using pointer = bytes_view*; using reference = bytes_view&; + + struct implementation { + blob_storage* current_chunk; + }; private: chunk* _current = nullptr; public: @@ -76,6 +80,11 @@ public: return tmp; } bool operator==(const fragment_iterator&) const = default; + implementation extract_implementation() const { + return implementation { + .current_chunk = _current, + }; + } }; using const_iterator = fragment_iterator; diff --git a/serializer.cc b/serializer.cc index 402d89ddee..e00c4e0260 100644 --- a/serializer.cc +++ b/serializer.cc @@ -12,4 +12,27 @@ namespace ser { logging::logger serlog("serializer"); -} // namespace ser \ No newline at end of file +} // namespace ser + +namespace utils { + +managed_bytes_view +buffer_view_to_managed_bytes_view(ser::buffer_view bv) { + auto impl = bv.extract_implementation(); + return build_managed_bytes_view_from_internals( + impl.current, + impl.next.extract_implementation().current_chunk, + impl.size + ); +} + +managed_bytes_view_opt +buffer_view_to_managed_bytes_view(std::optional> bvo) { + if (!bvo) { + return std::nullopt; + } + return buffer_view_to_managed_bytes_view(*bvo); +} + + +} // namespace utils diff --git a/serializer.hh b/serializer.hh index 867d3068e7..0adf332982 100644 --- a/serializer.hh +++ b/serializer.hh @@ -45,6 +45,12 @@ class buffer_view { public: using fragment_type = bytes_view; + struct implementation { + bytes_view current; + FragmentIterator next; + size_t size; + }; + class iterator { bytes_view _current; size_t _left = 0; @@ -177,6 +183,14 @@ public: } return fn(bv); } + + implementation extract_implementation() const { + return implementation { + .current = _first, + .next = _next, + .size = _total_size, + }; + } }; static_assert(FragmentedView>); diff --git a/utils/buffer_view-to-managed_bytes_view.hh b/utils/buffer_view-to-managed_bytes_view.hh new file mode 100644 index 0000000000..e1461d0562 --- /dev/null +++ b/utils/buffer_view-to-managed_bytes_view.hh @@ -0,0 +1,18 @@ +// Copyright 2023-present ScyllaDB +// SPDX-License-Identifier: AGPL-3.0-or-later + +#pragma once + +#include "managed_bytes.hh" +#include "serializer.hh" +#include "bytes_ostream.hh" + +namespace utils { + +managed_bytes_view +buffer_view_to_managed_bytes_view(ser::buffer_view bv); + +managed_bytes_view_opt +buffer_view_to_managed_bytes_view(std::optional> bvo); + +} diff --git a/utils/managed_bytes.hh b/utils/managed_bytes.hh index ec7b15b318..2afdb36bb0 100644 --- a/utils/managed_bytes.hh +++ b/utils/managed_bytes.hh @@ -374,6 +374,12 @@ private: fragment_type _current_fragment = {}; blob_storage* _next_fragments = nullptr; size_t _size = 0; +private: + managed_bytes_basic_view(fragment_type current_fragment, blob_storage* next_fragments, size_t size) + : _current_fragment(current_fragment) + , _next_fragments(next_fragments) + , _size(size) { + } public: managed_bytes_basic_view() = default; managed_bytes_basic_view(const managed_bytes_basic_view&) = default; @@ -465,6 +471,8 @@ public: }); return func(bv); } + + friend managed_bytes_basic_view build_managed_bytes_view_from_internals(bytes_view current_fragment, blob_storage* next_fragment, size_t size); }; static_assert(FragmentedView); static_assert(FragmentedMutableView); @@ -497,6 +505,12 @@ inline managed_bytes::managed_bytes(View v) : managed_bytes(initialized_later(), write_fragmented(self, v); } +inline +managed_bytes_view +build_managed_bytes_view_from_internals(bytes_view current_fragment, blob_storage* next_fragment, size_t size) { + return managed_bytes_view(current_fragment, next_fragment, size); +} + template<> struct appending_hash { template