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 {
26class ChunkRegionTracker;
48class PW_MULTIBUF_DEPRECATED
Chunk {
57 std::byte* data() {
return span_.data(); }
58 const std::byte* data()
const {
return span_.data(); }
59 size_t size()
const {
return span_.size(); }
60 [[nodiscard]]
bool empty()
const {
return span_.empty(); }
62 std::byte& operator[](
size_t index) {
return span_[index]; }
63 const std::byte& operator[](
size_t index)
const {
return span_[index]; }
66 using element_type = std::byte;
67 using value_type = std::byte;
68 using size_type = size_t;
69 using difference_type = ptrdiff_t;
70 using pointer = std::byte*;
71 using const_pointer =
const std::byte*;
72 using reference = std::byte&;
73 using const_reference =
const std::byte&;
74 using iterator = std::byte*;
75 using const_iterator =
const std::byte*;
76 using reverse_iterator = std::byte*;
77 using const_reverse_iterator =
const std::byte*;
79 std::byte* begin() {
return span_.data(); }
80 const std::byte* begin()
const {
return cbegin(); }
81 const std::byte* cbegin()
const {
return span_.data(); }
82 std::byte* end() {
return span_.data() + span_.size(); }
83 const std::byte* end()
const {
return cend(); }
84 const std::byte* cend()
const {
return span_.data() + span_.size(); }
143 void Slice(
size_t begin,
size_t end);
176 : region_tracker_(region_tracker),
177 next_in_region_(nullptr),
178 prev_in_region_(nullptr),
179 next_in_buf_(nullptr),
186 void InsertAfterInRegionList(
Chunk* new_chunk);
187 void InsertBeforeInRegionList(
Chunk* new_chunk);
188 void RemoveFromRegionList();
211 Chunk* next_in_region_;
220 Chunk* prev_in_region_;
328 other.inner_ =
nullptr;
331 inner_ = other.inner_;
332 other.inner_ =
nullptr;
339 return const_cast<std::byte*
>(std::as_const(*this).data());
341 const std::byte* data()
const {
342 return inner_ ==
nullptr ? nullptr : inner_->data();
345 size_t size()
const {
return inner_ ==
nullptr ? 0 : inner_->size(); }
347 std::byte& operator[](
size_t index) {
return data()[index]; }
348 std::byte operator[](
size_t index)
const {
return data()[index]; }
351 using element_type = std::byte;
352 using value_type = std::byte;
353 using size_type = size_t;
354 using difference_type = ptrdiff_t;
355 using pointer = std::byte*;
356 using const_pointer =
const std::byte*;
357 using reference = std::byte&;
358 using const_reference =
const std::byte&;
359 using iterator = std::byte*;
360 using const_iterator =
const std::byte*;
361 using reverse_iterator = std::byte*;
362 using const_reverse_iterator =
const std::byte*;
364 std::byte* begin() {
return data(); }
365 const std::byte* begin()
const {
return cbegin(); }
366 const std::byte* cbegin()
const {
return data(); }
367 std::byte* end() {
return data() + size(); }
368 const std::byte* end()
const {
return cend(); }
369 const std::byte* cend()
const {
return data() + size(); }
371 Chunk& operator*() {
return *inner_; }
372 const Chunk& operator*()
const {
return *inner_; }
373 Chunk* operator->() {
return inner_; }
374 const Chunk* operator->()
const {
return inner_; }
390 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:29
Definition: multibuf_v1.h:246
~OwnedChunk()
This method will acquire a mutex and is not IRQ safe.
Definition: chunk.h:336
Chunk * Take() &&
Definition: chunk.h:389