19#include "pw_multibuf/chunk.h"
20#include "pw_multibuf/config.h"
21#include "pw_preprocessor/compiler.h"
22#include "pw_status/status_with_size.h"
24namespace pw::multibuf {
38 using difference_type = std::ptrdiff_t;
40 using size_type = std::size_t;
46 using difference_type = std::ptrdiff_t;
49 using iterator_category = std::forward_iterator_tag;
53 constexpr reference operator*()
const {
return *chunk_; }
54 constexpr pointer operator->()
const {
return chunk_; }
57 chunk_ = chunk_->next_in_buf_;
67 constexpr bool operator==(
const iterator& other)
const {
68 return chunk_ == other.chunk_;
71 constexpr bool operator!=(
const iterator& other)
const {
72 return chunk_ != other.chunk_;
81 Chunk* chunk_ =
nullptr;
88 using difference_type = std::ptrdiff_t;
91 using iterator_category = std::forward_iterator_tag;
95 constexpr reference operator*()
const {
return *chunk_; }
96 constexpr pointer operator->()
const {
return chunk_; }
99 chunk_ = chunk_->next_in_buf_;
110 return chunk_ == other.chunk_;
114 return chunk_ != other.chunk_;
123 const Chunk* chunk_ =
nullptr;
126 MultiBufChunks(
const MultiBufChunks&) =
delete;
127 MultiBufChunks& operator=(
const MultiBufChunks&) =
delete;
133 constexpr const Chunk& front()
const {
return *first_; }
141 const Chunk& back()
const;
143 constexpr iterator begin() {
return iterator(first_); }
144 constexpr const_iterator begin()
const {
return cbegin(); }
145 constexpr const_iterator cbegin()
const {
return const_iterator(first_); }
147 constexpr iterator end() {
return iterator::end(); }
148 constexpr const_iterator end()
const {
return cend(); }
149 constexpr const_iterator cend()
const {
return const_iterator::end(); }
153 return static_cast<size_t>(std::distance(begin(), end()));
160 [[nodiscard]]
bool empty()
const {
return first_ ==
nullptr; }
211 : first_(other.first_) {
212 other.first_ =
nullptr;
216 MultiBufChunks& operator=(MultiBufChunks&& other)
noexcept {
218 first_ = other.first_;
219 other.first_ =
nullptr;
224 void Release() noexcept;
226 void PushSuffix(MultiBufChunks&& tail);
256 return MultiBuf(std::move(chunk).Take());
274 void Release() noexcept { MultiBufChunks::Release(); }
282 [[nodiscard]]
size_t size()
const {
return MultiBufChunks::size_bytes(); }
297 return ContiguousSpan().has_value();
309 auto result = std::as_const(*this).ContiguousSpan();
310 if (result.has_value()) {
311 return span(
const_cast<std::byte*
>(result->data()), result->size());
315 std::optional<ConstByteSpan> ContiguousSpan()
const;
373 void Slice(
size_t begin,
size_t end);
421 return MultiBufChunks::PushSuffix(std::move(tail.Chunks()));
462 return CopyFromAndOptionallyTruncate(source, position,
false);
493 size_t position = 0) {
494 return CopyFromAndOptionallyTruncate(source, position,
true);
503 MultiBufChunks::push_front(std::move(chunk));
508 MultiBufChunks::push_back(std::move(chunk));
517 return MultiBufChunks::insert(position, std::move(chunk));
521 std::tuple<MultiBufChunks::iterator, OwnedChunk>
TakeChunk(
523 return MultiBufChunks::take(position);
539 using element_type = std::byte;
540 using value_type = std::byte;
541 using pointer = std::byte*;
542 using const_pointer =
const std::byte*;
543 using reference = std::byte&;
544 using const_reference =
const std::byte&;
545 using difference_type = std::ptrdiff_t;
546 using size_type = std::size_t;
551 using value_type = std::byte;
552 using difference_type = std::ptrdiff_t;
553 using reference =
const std::byte&;
554 using pointer =
const std::byte*;
555 using iterator_category = std::forward_iterator_tag;
559 reference operator*()
const {
return (*chunk_)[byte_index_]; }
560 pointer operator->()
const {
return &(*chunk_)[byte_index_]; }
576 return chunk_ == other.chunk_ && byte_index_ == other.byte_index_;
580 return !(*
this == other);
594 : chunk_(chunk), byte_index_(byte_index) {
600 constexpr void AdvanceToData() {
601 while (chunk_ !=
nullptr && chunk_->empty()) {
602 chunk_ = chunk_->next_in_buf_;
613 using value_type = std::byte;
614 using difference_type = std::ptrdiff_t;
615 using reference = std::byte&;
616 using pointer = std::byte*;
617 using iterator_category = std::forward_iterator_tag;
621 reference operator*()
const {
return const_cast<std::byte&
>(*const_iter_); }
622 pointer operator->()
const {
return const_cast<std::byte*
>(&*const_iter_); }
633 iterator operator+(
size_t rhs)
const {
642 constexpr bool operator==(
const iterator& other)
const {
643 return const_iter_ == other.const_iter_;
645 constexpr bool operator!=(
const iterator& other)
const {
646 return const_iter_ != other.const_iter_;
651 return const_cast<Chunk*
>(const_iter_.chunk());
656 constexpr size_t byte_index()
const {
return const_iter_.byte_index(); }
661 explicit constexpr iterator(
Chunk* chunk,
size_t byte_index = 0)
662 : const_iter_(chunk, byte_index) {}
666 const_iterator const_iter_;
670 explicit constexpr MultiBuf(Chunk* first_chunk)
671 : MultiBufChunks(first_chunk) {}
673 StatusWithSize CopyFromAndOptionallyTruncate(ConstByteSpan source,
Definition: status_with_size.h:49
A const std::forward_iterator over the bytes of a MultiBuf.
Definition: multibuf_v1.h:549
constexpr size_t byte_index() const
Definition: multibuf_v1.h:588
constexpr const Chunk * chunk() const
Returns the current Chunk pointed to by this iterator.
Definition: multibuf_v1.h:584
An std::forward_iterator over the bytes of a MultiBuf.
Definition: multibuf_v1.h:611
constexpr size_t byte_index() const
Definition: multibuf_v1.h:656
constexpr Chunk * chunk() const
Returns the current Chunk pointed to by this iterator.
Definition: multibuf_v1.h:650
A const std::forward_iterator over the Chunks of a MultiBuf.
Definition: multibuf_v1.h:85
A std::forward_iterator over the Chunks of a MultiBuf.
Definition: multibuf_v1.h:43
A Chunk-oriented view of a MultiBuf.
Definition: multibuf_v1.h:31
bool empty() const
Returns whether the MultiBuf contains any chunks (size() == 0).
Definition: multibuf_v1.h:160
constexpr Chunk & front()
Definition: multibuf_v1.h:132
std::tuple< iterator, OwnedChunk > take(iterator position)
void push_back(OwnedChunk &&chunk)
void push_front(OwnedChunk &&chunk)
iterator insert(iterator position, OwnedChunk &&chunk)
Chunk & back()
Definition: multibuf_v1.h:140
~MultiBufChunks()
This destructor will acquire a mutex and is not IRQ safe.
Definition: multibuf_v1.h:205
size_t size_bytes() const
Returns the total number of bytes in all Chunks.
size_t size() const
Returns the number of Chunks in this MultiBuf, including empty chunks.
Definition: multibuf_v1.h:152
Definition: multibuf_v1.h:248
~MultiBuf()=default
This destructor will acquire a mutex and is not IRQ safe.
void PushBackChunk(OwnedChunk &&chunk)
Definition: multibuf_v1.h:507
constexpr MultiBufChunks & Chunks()
Returns a Chunk-oriented view of this MultiBuf.
Definition: multibuf_v1.h:527
void Release() noexcept
Definition: multibuf_v1.h:274
MultiBufChunks::iterator InsertChunk(MultiBufChunks::iterator position, OwnedChunk &&chunk)
Definition: multibuf_v1.h:515
const_iterator cbegin() const
Returns a const iterator pointing to the first byte of this MultiBuf.
Definition: multibuf_v1.h:324
void PushSuffix(MultiBuf &&tail)
Definition: multibuf_v1.h:420
std::optional< MultiBuf > TakeSuffix(size_t bytes_to_take)
void TruncateAfter(iterator pos)
void DiscardPrefix(size_t bytes_to_discard)
void PushFrontChunk(OwnedChunk &&chunk)
Definition: multibuf_v1.h:502
const_iterator begin() const
Returns a const iterator pointing to the first byte of this MultiBuf.
Definition: multibuf_v1.h:320
const_iterator end() const
Returns a const iterator pointing to the end of this MultiBuf.
Definition: multibuf_v1.h:331
StatusWithSize CopyTo(ByteSpan dest, size_t position=0) const
iterator begin()
Returns an iterator pointing to the first byte of this MultiBuf.
Definition: multibuf_v1.h:318
StatusWithSize CopyFromAndTruncate(ConstByteSpan source, size_t position=0)
Definition: multibuf_v1.h:492
bool IsContiguous() const
Definition: multibuf_v1.h:296
constexpr const MultiBufChunks & ConstChunks() const
Returns a const Chunk-oriented view of this MultiBuf.
Definition: multibuf_v1.h:533
void Truncate(size_t len)
iterator end()
Returns an iterator pointing to the end of this MultiBuf.
Definition: multibuf_v1.h:329
StatusWithSize CopyFrom(ConstByteSpan source, size_t position=0)
Definition: multibuf_v1.h:461
bool ClaimSuffix(size_t bytes_to_claim)
std::optional< MultiBuf > TakePrefix(size_t bytes_to_take)
std::tuple< MultiBufChunks::iterator, OwnedChunk > TakeChunk(MultiBufChunks::iterator position)
Definition: multibuf_v1.h:521
OwnedChunk TakeFrontChunk()
Definition: multibuf_v1.h:512
bool ClaimPrefix(size_t bytes_to_claim)
constexpr const MultiBufChunks & Chunks() const
Returns a const Chunk-oriented view of this MultiBuf.
Definition: multibuf_v1.h:530
std::optional< ByteSpan > ContiguousSpan()
Definition: multibuf_v1.h:308
void PushPrefix(MultiBuf &&front)
const_iterator cend() const
Returns a const iterator pointing to the end of this MultiBuf.
Definition: multibuf_v1.h:333
size_t size() const
Definition: multibuf_v1.h:282
void Slice(size_t begin, size_t end)
Definition: span_impl.h:235
BasicMultiBuf< MultiBufProperty::kLayerable > MultiBuf
Definition: multibuf_v2.h:71
#define PW_MODIFY_DIAGNOSTICS_POP()
Definition: compiler.h:194
#define PW_MODIFY_DIAGNOSTIC_GCC(kind, option)
Definition: compiler.h:211
#define PW_MODIFY_DIAGNOSTICS_PUSH()
Definition: compiler.h:189