21#include "pw_toolchain/constexpr_tag.h"
31#include "pw_preprocessor/util.h"
73typedef const uint32_t* pw_InlineVarLenEntryQueue_ConstHandle;
82#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_DECLARE(variable, max_size_bytes) \
83 uint32_t variable[PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 + \
84 _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes)] = { \
85 _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0u, 0u}
92#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3)
98 size_t array_size_uint32);
110 uint32_t data_size_bytes);
119 const uint32_t data_size_bytes);
129 uint32_t data_size_bytes);
143 pw_InlineVarLenEntryQueue_ConstHandle _pw_queue;
150 const uint8_t* data_1;
152 const uint8_t* data_2;
162 pw_InlineVarLenEntryQueue_ConstHandle queue);
196 pw_InlineVarLenEntryQueue_ConstHandle queue);
201 pw_InlineVarLenEntryQueue_ConstHandle queue);
206 pw_InlineVarLenEntryQueue_ConstHandle queue);
213 pw_InlineVarLenEntryQueue_ConstHandle queue);
219 pw_InlineVarLenEntryQueue_ConstHandle queue);
224 pw_InlineVarLenEntryQueue_ConstHandle queue);
230#define _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes) \
231 ((_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) + 3 ) / 4)
233#define _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) \
234 (PW_VARINT_ENCODED_SIZE_BYTES(max_size_bytes) + max_size_bytes + \
237#define _PW_VAR_QUEUE_ARRAY_SIZE_BYTES queue[0]
238#define _PW_VAR_QUEUE_HEAD queue[1]
239#define _PW_VAR_QUEUE_TAIL queue[2]
240#define _PW_VAR_QUEUE_DATA ((const uint8_t*)&queue[3])
243 size_t array_size_uint32) {
244 array[0] = (uint32_t)(array_size_uint32 -
253 _PW_VAR_QUEUE_HEAD = 0;
254 _PW_VAR_QUEUE_TAIL = 0;
264 pw_InlineVarLenEntryQueue_ConstHandle queue) {
272 return lhs->_pw_offset == rhs->_pw_offset && lhs->_pw_queue == rhs->_pw_queue;
276static inline const uint8_t* _pw_InlineVarLenEntryQueue_Entry_GetPointer(
278 if (index < entry->size_1) {
279 return &entry->data_1[index];
281 return &entry->data_2[index - entry->size_1];
284const uint8_t* _pw_InlineVarLenEntryQueue_Entry_GetPointerChecked(
289 return *_pw_InlineVarLenEntryQueue_Entry_GetPointerChecked(entry, index);
293 pw_InlineVarLenEntryQueue_ConstHandle queue) {
295 _PW_VAR_QUEUE_ARRAY_SIZE_BYTES;
299 pw_InlineVarLenEntryQueue_ConstHandle queue) {
300 return _PW_VAR_QUEUE_ARRAY_SIZE_BYTES - 1;
304 pw_InlineVarLenEntryQueue_ConstHandle queue) {
305 return _PW_VAR_QUEUE_ARRAY_SIZE_BYTES - 1 -
311 pw_InlineVarLenEntryQueue_ConstHandle queue) {
312 return _PW_VAR_QUEUE_HEAD == _PW_VAR_QUEUE_TAIL;
316#undef _PW_VAR_QUEUE_ARRAY_SIZE_BYTES
317#undef _PW_VAR_QUEUE_HEAD
318#undef _PW_VAR_QUEUE_TAIL
319#undef _PW_VAR_QUEUE_DATA
326#include <type_traits>
329#include "pw_containers/internal/raw_storage.h"
330#include "pw_span/span.h"
339 size_t kMaxSizeBytes = containers::internal::kGenericSized>
342 containers::internal::kGenericSized> {
354 :
Base(kMaxSizeBytes), data_{} {}
362 static_assert(kMaxSizeBytes <=
363 std::numeric_limits<typename Base::size_type>::max());
367 uint32_t data_[_PW_VAR_QUEUE_DATA_SIZE_UINT32(kMaxSizeBytes)];
385 using value_type = Entry;
386 using size_type = std::uint32_t;
387 using pointer =
const value_type*;
388 using const_pointer = pointer;
389 using reference =
const value_type&;
390 using const_reference = reference;
397 using const_iterator = iterator;
400 template <
size_t kArraySize>
404 "InlineVarLenEntryQueue must be backed by an array with more than "
405 "PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3) elements");
406 return Init(array, kArraySize);
411 size_t array_size_uint32) {
418 Entry
front()
const {
return *begin(); }
424 const_iterator cbegin()
const {
return begin(); }
427 const_iterator
end()
const {
430 const_iterator cend()
const {
return end(); }
458 return span<const T>(
reinterpret_cast<const T*
>(array_),
466 void push(span<const T> value) {
468 array_, value.data(),
static_cast<size_type
>(value.size()));
474 array_, value.data(),
static_cast<size_type
>(value.size()));
480 array_, value.data(),
static_cast<size_type
>(value.size()));
488 : array_{_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0, 0} {}
492 ~BasicInlineVarLenEntryQueue() =
default;
494 BasicInlineVarLenEntryQueue(
const BasicInlineVarLenEntryQueue&) =
default;
495 BasicInlineVarLenEntryQueue& operator=(
const BasicInlineVarLenEntryQueue&) =
499 static_assert(std::is_integral_v<T> || std::is_same_v<T, std::byte>);
500 static_assert(
sizeof(T) ==
sizeof(std::byte));
509 using value_type = T;
510 using size_type = std::uint32_t;
511 using pointer =
const T*;
512 using const_pointer = pointer;
513 using reference =
const T&;
514 using const_reference = reference;
520 using difference_type = std::ptrdiff_t;
521 using value_type = T;
522 using pointer =
const T*;
523 using reference =
const T&;
524 using iterator_category = std::forward_iterator_tag;
526 constexpr iterator() : entry_(
nullptr), index_(0) {}
535 constexpr iterator operator++(
int) {
538 return previous_value;
541 reference operator*()
const {
return *GetIndex(*entry_, index_); }
542 pointer operator->()
const {
return GetIndex(*entry_, index_); }
544 bool operator==(
const iterator& rhs)
const {
545 return entry_->data_1 == rhs.entry_->data_1 && index_ == rhs.index_;
547 bool operator!=(
const iterator& rhs)
const {
return !(*
this == rhs); }
554 : entry_(&entry), index_(index) {}
564 constexpr Entry& operator=(
const Entry&) =
default;
566 const_reference at(
size_t index)
const {
567 return *
reinterpret_cast<const T*
>(
568 _pw_InlineVarLenEntryQueue_Entry_GetPointerChecked(&entry_, index));
571 const_reference operator[](
size_t index)
const {
572 return *GetIndex(entry_, index);
575 const_reference front()
const {
return *entry_.data_1; }
576 const_reference back()
const { *GetIndex(entry_, size() - 1); }
583 return std::make_pair(
584 span(
reinterpret_cast<const_pointer
>(entry_.data_1), entry_.size_1),
585 span(
reinterpret_cast<const_pointer
>(entry_.data_2), entry_.size_2));
593 size_type
copy(T* dest, size_type count)
const {
597 const_iterator begin()
const {
return const_iterator(entry_, 0); }
598 const_iterator cbegin()
const {
return begin(); }
600 const_iterator end()
const {
return const_iterator(entry_, size()); }
601 const_iterator cend()
const {
return cend(); }
603 [[nodiscard]]
bool empty()
const {
return size() == 0; }
605 size_type size()
const {
return entry_.size_1 + entry_.size_2; }
608 friend class BasicInlineVarLenEntryQueue;
612 return reinterpret_cast<const T*
>(
613 _pw_InlineVarLenEntryQueue_Entry_GetPointer(&entry, index));
619 constexpr Entry() : entry_{} {}
631 using difference_type = std::ptrdiff_t;
635 using iterator_category = std::forward_iterator_tag;
637 constexpr iterator() : iterator_{}, entry_{} {}
644 entry_.entry_.data_1 =
nullptr;
650 return previous_value;
662 bool operator==(
const iterator& rhs)
const {
665 bool operator!=(
const iterator& rhs)
const {
return !(*
this == rhs); }
673 void LoadEntry()
const {
674 if (entry_.entry_.data_1 ==
nullptr) {
680 mutable Entry entry_;
684template <
size_t kMaxSizeBytes = containers::
internal::kGenericSized>
Definition: inline_var_len_entry_queue.h:518
Refers to an entry in-place in the queue. Entries may be discontiguous.
Definition: inline_var_len_entry_queue.h:507
size_type copy(T *dest, size_type count) const
Definition: inline_var_len_entry_queue.h:593
std::pair< span< const value_type >, span< const value_type > > contiguous_data() const
Definition: inline_var_len_entry_queue.h:581
Definition: inline_var_len_entry_queue.h:629
Definition: inline_var_len_entry_queue.h:381
void pop()
Definition: inline_var_len_entry_queue.h:484
bool try_push(span< const T > value)
Definition: inline_var_len_entry_queue.h:472
span< const T > raw_storage() const
Definition: inline_var_len_entry_queue.h:457
const_iterator end() const
Returns an iterator that points past the end of the queue.
Definition: inline_var_len_entry_queue.h:427
static BasicInlineVarLenEntryQueue & Init(uint32_t array[], size_t array_size_uint32)
Definition: inline_var_len_entry_queue.h:410
Entry front() const
Definition: inline_var_len_entry_queue.h:418
size_type size_bytes() const
Definition: inline_var_len_entry_queue.h:446
size_type max_size() const
Definition: inline_var_len_entry_queue.h:441
static BasicInlineVarLenEntryQueue & Init(uint32_t(&array)[kArraySize])
Definition: inline_var_len_entry_queue.h:401
void push_overwrite(span< const T > value)
Definition: inline_var_len_entry_queue.h:478
bool empty() const
Definition: inline_var_len_entry_queue.h:433
size_type size() const
Definition: inline_var_len_entry_queue.h:438
const_iterator begin() const
Returns an iterator to the start of the InlineVarLenEntryQueue.
Definition: inline_var_len_entry_queue.h:421
void push(span< const T > value)
Definition: inline_var_len_entry_queue.h:466
size_type max_size_bytes() const
Definition: inline_var_len_entry_queue.h:451
void clear()
Empties the queue.
Definition: inline_var_len_entry_queue.h:463
Definition: inline_var_len_entry_queue.h:342
pw_InlineVarLenEntryQueue_Entry pw_InlineVarLenEntryQueue_GetEntry(const pw_InlineVarLenEntryQueue_Iterator *iterator)
Dereferences an iterator, loading the entry it points to.
static void pw_InlineVarLenEntryQueue_Init(uint32_t array[], size_t array_size_uint32)
Definition: inline_var_len_entry_queue.h:242
void pw_InlineVarLenEntryQueue_Push(pw_InlineVarLenEntryQueue_Handle queue, const void *data, uint32_t data_size_bytes)
uint32_t pw_InlineVarLenEntryQueue_Entry_Copy(const pw_InlineVarLenEntryQueue_Entry *entry, void *dest, uint32_t count)
bool pw_InlineVarLenEntryQueue_TryPush(pw_InlineVarLenEntryQueue_Handle queue, const void *data, const uint32_t data_size_bytes)
static uint32_t pw_InlineVarLenEntryQueue_MaxSize(pw_InlineVarLenEntryQueue_ConstHandle queue)
Definition: inline_var_len_entry_queue.h:298
static bool pw_InlineVarLenEntryQueue_Iterator_Equal(const pw_InlineVarLenEntryQueue_Iterator *lhs, const pw_InlineVarLenEntryQueue_Iterator *rhs)
Compares two iterators for equality.
Definition: inline_var_len_entry_queue.h:269
static uint32_t pw_InlineVarLenEntryQueue_MaxSizeBytes(pw_InlineVarLenEntryQueue_ConstHandle queue)
Definition: inline_var_len_entry_queue.h:303
uint32_t pw_InlineVarLenEntryQueue_Size(pw_InlineVarLenEntryQueue_ConstHandle queue)
void pw_InlineVarLenEntryQueue_PushOverwrite(pw_InlineVarLenEntryQueue_Handle queue, const void *data, uint32_t data_size_bytes)
void pw_InlineVarLenEntryQueue_Pop(pw_InlineVarLenEntryQueue_Handle queue)
static bool pw_InlineVarLenEntryQueue_Empty(pw_InlineVarLenEntryQueue_ConstHandle queue)
Definition: inline_var_len_entry_queue.h:310
static pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_Begin(pw_InlineVarLenEntryQueue_ConstHandle queue)
Returns an iterator to the start of the InlineVarLenEntryQueue.
Definition: inline_var_len_entry_queue.h:258
#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32
Definition: inline_var_len_entry_queue.h:92
static uint8_t pw_InlineVarLenEntryQueue_Entry_At(const pw_InlineVarLenEntryQueue_Entry *entry, size_t index)
Definition: inline_var_len_entry_queue.h:287
uint32_t * pw_InlineVarLenEntryQueue_Handle
Definition: inline_var_len_entry_queue.h:72
static pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_End(pw_InlineVarLenEntryQueue_ConstHandle queue)
Returns an iterator that points past the end of the queue.
Definition: inline_var_len_entry_queue.h:263
void pw_InlineVarLenEntryQueue_Iterator_Advance(pw_InlineVarLenEntryQueue_Iterator *iterator)
static void pw_InlineVarLenEntryQueue_Clear(pw_InlineVarLenEntryQueue_Handle queue)
Empties the queue.
Definition: inline_var_len_entry_queue.h:251
uint32_t pw_InlineVarLenEntryQueue_SizeBytes(pw_InlineVarLenEntryQueue_ConstHandle queue)
static uint32_t pw_InlineVarLenEntryQueue_RawStorageSizeBytes(pw_InlineVarLenEntryQueue_ConstHandle queue)
Definition: inline_var_len_entry_queue.h:292
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
Definition: constexpr_tag.h:46
Definition: inline_var_len_entry_queue.h:149
Definition: inline_var_len_entry_queue.h:141
size_t pw_varint_EncodedSizeBytes(uint64_t integer)
Returns the size of a uint64_t when encoded as a varint (LEB128).