19#include "pw_assert/assert.h"
20#include "pw_bytes/span.h"
21#include "pw_multibuf/config.h"
22#include "pw_sync/mutex.h"
24namespace pw::multibuf {
28class ChunkRegionTracker;
50class PW_MULTIBUF_DEPRECATED
Chunk {
59 std::byte* data() {
return span_.data(); }
60 const std::byte* data()
const {
return span_.data(); }
61 size_t size()
const {
return span_.size(); }
62 [[nodiscard]]
bool empty()
const {
return span_.empty(); }
64 std::byte& operator[](
size_t index) {
return span_[index]; }
65 const std::byte& operator[](
size_t index)
const {
return span_[index]; }
68 using element_type = std::byte;
69 using value_type = std::byte;
70 using size_type = size_t;
71 using difference_type = ptrdiff_t;
72 using pointer = std::byte*;
73 using const_pointer =
const std::byte*;
74 using reference = std::byte&;
75 using const_reference =
const std::byte&;
76 using iterator = std::byte*;
77 using const_iterator =
const std::byte*;
78 using reverse_iterator = std::byte*;
79 using const_reverse_iterator =
const std::byte*;
81 std::byte* begin() {
return span_.data(); }
82 const std::byte* begin()
const {
return cbegin(); }
83 const std::byte* cbegin()
const {
return span_.data(); }
84 std::byte* end() {
return span_.data() + span_.size(); }
85 const std::byte* end()
const {
return cend(); }
86 const std::byte* cend()
const {
return span_.data() + span_.size(); }
145 void Slice(
size_t begin,
size_t end);
178 : region_tracker_(region_tracker),
179 next_in_region_(nullptr),
180 prev_in_region_(nullptr),
181 next_in_buf_(nullptr),
188 void InsertAfterInRegionList(
Chunk* new_chunk);
189 void InsertBeforeInRegionList(
Chunk* new_chunk);
190 void RemoveFromRegionList();
213 Chunk* next_in_region_;
222 Chunk* prev_in_region_;
330 other.inner_ =
nullptr;
333 inner_ = other.inner_;
334 other.inner_ =
nullptr;
341 return const_cast<std::byte*
>(std::as_const(*this).data());
343 const std::byte* data()
const {
344 return inner_ ==
nullptr ? nullptr : inner_->data();
347 size_t size()
const {
return inner_ ==
nullptr ? 0 : inner_->size(); }
349 std::byte& operator[](
size_t index) {
return data()[index]; }
350 std::byte operator[](
size_t index)
const {
return data()[index]; }
353 using element_type = std::byte;
354 using value_type = std::byte;
355 using size_type = size_t;
356 using difference_type = ptrdiff_t;
357 using pointer = std::byte*;
358 using const_pointer =
const std::byte*;
359 using reference = std::byte&;
360 using const_reference =
const std::byte&;
361 using iterator = std::byte*;
362 using const_iterator =
const std::byte*;
363 using reverse_iterator = std::byte*;
364 using const_reverse_iterator =
const std::byte*;
366 std::byte* begin() {
return data(); }
367 const std::byte* begin()
const {
return cbegin(); }
368 const std::byte* cbegin()
const {
return data(); }
369 std::byte* end() {
return data() + size(); }
370 const std::byte* end()
const {
return cend(); }
371 const std::byte* cend()
const {
return data() + size(); }
373 Chunk& operator*() {
return *inner_; }
374 const Chunk& operator*()
const {
return *inner_; }
375 Chunk* operator->() {
return inner_; }
376 const Chunk* operator->()
const {
return inner_; }
392 Chunk* result = inner_;
std::optional< OwnedChunk > TakeSuffix(size_t bytes_to_take)
void DiscardPrefix(size_t bytes_to_discard)
bool Merge(OwnedChunk &next_chunk)
void Truncate(size_t len)
void Slice(size_t begin, size_t end)
bool ClaimSuffix(size_t bytes_to_claim)
bool ClaimPrefix(size_t bytes_to_claim)
std::optional< OwnedChunk > TakePrefix(size_t bytes_to_take)
bool CanMerge(const Chunk &next_chunk) const
virtual void DeallocateChunkClass(void *)=0
Deallocates a pointer returned by AllocateChunkClass.
virtual ByteSpan Region() const =0
std::optional< OwnedChunk > CreateFirstChunk()
virtual void * AllocateChunkClass()=0
A Chunk-oriented view of a MultiBuf.
Definition: multibuf_v1.h:31
Definition: multibuf_v1.h:248
~OwnedChunk()
This method will acquire a mutex and is not IRQ safe.
Definition: chunk.h:338
Chunk * Take() &&
Definition: chunk.h:391